zulip/web/src/stream_sort.js
Anders Kaseorg 2a70c11c5f eslint: Fix unicorn/prefer-spread.
This was initially disabled for IE/Babel-related reasons that no
longer apply.

Signed-off-by: Anders Kaseorg <[email protected]>
2023-03-02 12:16:56 -08:00

141 lines
3.7 KiB
JavaScript

import * as stream_data from "./stream_data";
import * as sub_store from "./sub_store";
import * as util from "./util";
let previous_pinned;
let previous_normal;
let previous_dormant;
let previous_muted_active;
let previous_muted_pinned;
let all_streams = [];
export function get_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 = sub_store.get(a);
const stream_b = sub_store.get(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);
}
export function sort_groups(streams, search_term) {
const stream_id_to_name = (stream) => sub_store.get(stream).name;
// Use -, _ and / as word separators apart from the default space character
const word_separator_regex = /[\s/_-]/;
streams = util.filter_by_word_prefix_match(
streams,
search_term,
stream_id_to_name,
word_separator_regex,
);
function is_normal(sub) {
return stream_data.is_active(sub);
}
const pinned_streams = [];
const normal_streams = [];
const muted_pinned_streams = [];
const muted_active_streams = [];
const dormant_streams = [];
for (const stream of streams) {
const sub = sub_store.get(stream);
const pinned = sub.pin_to_top;
if (pinned) {
if (!sub.is_muted) {
pinned_streams.push(stream);
} else {
muted_pinned_streams.push(stream);
}
} else if (is_normal(sub)) {
if (!sub.is_muted) {
normal_streams.push(stream);
} else {
muted_active_streams.push(stream);
}
} else {
dormant_streams.push(stream);
}
}
pinned_streams.sort(compare_function);
normal_streams.sort(compare_function);
muted_pinned_streams.sort(compare_function);
muted_active_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_muted_pinned, muted_pinned_streams) &&
util.array_compare(previous_muted_active, muted_active_streams) &&
util.array_compare(previous_dormant, dormant_streams);
if (!same_as_before) {
previous_pinned = pinned_streams;
previous_normal = normal_streams;
previous_muted_pinned = muted_pinned_streams;
previous_muted_active = muted_active_streams;
previous_dormant = dormant_streams;
all_streams = [
...pinned_streams,
...muted_pinned_streams,
...normal_streams,
...muted_active_streams,
...dormant_streams,
];
}
return {
same_as_before,
pinned_streams,
normal_streams,
dormant_streams,
muted_pinned_streams,
muted_active_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);
}