zulip/static/js/stream_sort.js

132 lines
3.4 KiB
JavaScript

import * as stream_data from "./stream_data";
import * as util from "./util";
let previous_pinned;
let previous_normal;
let previous_dormant;
let all_streams = [];
export function get_streams() {
// Right now this is only used for testing, but we should
// use it for things like hotkeys that cycle through streams.
const sorted_streams = all_streams.map((stream_id) =>
stream_data.maybe_get_stream_name(stream_id),
);
return sorted_streams;
}
function compare_function(a, b) {
const stream_a = stream_data.get_sub_by_id(a);
const stream_b = stream_data.get_sub_by_id(b);
const stream_name_a = stream_a ? stream_a.name : "";
const stream_name_b = stream_b ? stream_b.name : "";
return util.strcmp(stream_name_a, stream_name_b);
}
function filter_streams_by_search(streams, search_term) {
if (search_term === "") {
return streams;
}
let search_terms = search_term.toLowerCase().split(",");
search_terms = search_terms.map((s) => s.trim());
const filtered_streams = streams.filter((stream) =>
search_terms.some((search_term) => {
const lower_stream_name = stream_data.get_sub_by_id(stream).name.toLowerCase();
const cands = lower_stream_name.split(" ");
cands.push(lower_stream_name);
return cands.some((name) => name.startsWith(search_term));
}),
);
return filtered_streams;
}
export function sort_groups(streams, search_term) {
if (streams.length === 0) {
return undefined;
}
streams = filter_streams_by_search(streams, search_term);
function is_normal(sub) {
return stream_data.is_active(sub);
}
const pinned_streams = [];
const normal_streams = [];
const dormant_streams = [];
for (const stream of streams) {
const sub = stream_data.get_sub_by_id(stream);
const pinned = sub.pin_to_top;
if (pinned) {
pinned_streams.push(stream);
} else if (is_normal(sub)) {
normal_streams.push(stream);
} else {
dormant_streams.push(stream);
}
}
pinned_streams.sort(compare_function);
normal_streams.sort(compare_function);
dormant_streams.sort(compare_function);
const same_as_before =
previous_pinned !== undefined &&
util.array_compare(previous_pinned, pinned_streams) &&
util.array_compare(previous_normal, normal_streams) &&
util.array_compare(previous_dormant, dormant_streams);
if (!same_as_before) {
previous_pinned = pinned_streams;
previous_normal = normal_streams;
previous_dormant = dormant_streams;
all_streams = pinned_streams.concat(normal_streams, dormant_streams);
}
return {
same_as_before,
pinned_streams,
normal_streams,
dormant_streams,
};
}
function maybe_get_stream_id(i) {
if (i < 0 || i >= all_streams.length) {
return undefined;
}
return all_streams[i];
}
export function first_stream_id() {
return maybe_get_stream_id(0);
}
export function prev_stream_id(stream_id) {
const i = all_streams.indexOf(stream_id);
if (i < 0) {
return undefined;
}
return maybe_get_stream_id(i - 1);
}
export function next_stream_id(stream_id) {
const i = all_streams.indexOf(stream_id);
if (i < 0) {
return undefined;
}
return maybe_get_stream_id(i + 1);
}