mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
}
 |