| 
 | 1 | +/*  | 
 | 2 | +Copyright 2025 New Vector Ltd.  | 
 | 3 | +
  | 
 | 4 | +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial  | 
 | 5 | +Please see LICENSE files in the repository root for full details.  | 
 | 6 | +*/  | 
 | 7 | + | 
 | 8 | +import { type Room } from "matrix-js-sdk/src/matrix";  | 
 | 9 | + | 
 | 10 | +import { type Filter, FilterKey } from "../filters";  | 
 | 11 | +import { FavouriteFilter } from "../filters/FavouriteFilter.ts";  | 
 | 12 | +import { UnreadFilter } from "../filters/UnreadFilter.ts";  | 
 | 13 | +import { PeopleFilter } from "../filters/PeopleFilter.ts";  | 
 | 14 | +import { RoomsFilter } from "../filters/RoomsFilter.ts";  | 
 | 15 | +import { InvitesFilter } from "../filters/InvitesFilter.ts";  | 
 | 16 | +import { MentionsFilter } from "../filters/MentionsFilter.ts";  | 
 | 17 | +import { LowPriorityFilter } from "../filters/LowPriorityFilter.ts";  | 
 | 18 | + | 
 | 19 | +export type Section = FilterKey | FilterKey[] | null;  | 
 | 20 | + | 
 | 21 | +const filters: { [T in FilterKey]?: Filter } = {  | 
 | 22 | +    [FilterKey.FavouriteFilter]: new FavouriteFilter(),  | 
 | 23 | +    [FilterKey.UnreadFilter]: new UnreadFilter(),  | 
 | 24 | +    [FilterKey.PeopleFilter]: new PeopleFilter(),  | 
 | 25 | +    [FilterKey.RoomsFilter]: new RoomsFilter(),  | 
 | 26 | +    [FilterKey.InvitesFilter]: new InvitesFilter(),  | 
 | 27 | +    [FilterKey.MentionsFilter]: new MentionsFilter(),  | 
 | 28 | +    [FilterKey.LowPriorityFilter]: new LowPriorityFilter(),  | 
 | 29 | +};  | 
 | 30 | + | 
 | 31 | +export function sectionMatches(section: Section, room: Room): boolean {  | 
 | 32 | +    if (section === null) {  | 
 | 33 | +        return false;  | 
 | 34 | +    } else if (Array.isArray(section)) {  | 
 | 35 | +        return section.every((key) => !!filters[key]?.matches(room));  | 
 | 36 | +    } else {  | 
 | 37 | +        return !!filters[section]?.matches(room);  | 
 | 38 | +    }  | 
 | 39 | +}  | 
 | 40 | + | 
 | 41 | +const sectionsDefault: Section[] = [  | 
 | 42 | +    // Invite  | 
 | 43 | +    [FilterKey.InvitesFilter],  | 
 | 44 | +    // Favourite  | 
 | 45 | +    [FilterKey.FavouriteFilter],  | 
 | 46 | +    // People  | 
 | 47 | +    [FilterKey.PeopleFilter],  | 
 | 48 | +    // Other  | 
 | 49 | +    null,  | 
 | 50 | +    // Low Priority  | 
 | 51 | +    [FilterKey.LowPriorityFilter],  | 
 | 52 | +];  | 
 | 53 | +const sectionsUnreadFirst: Section[] = [  | 
 | 54 | +    // Invite  | 
 | 55 | +    [FilterKey.InvitesFilter],  | 
 | 56 | +    // Mention  | 
 | 57 | +    [FilterKey.MentionsFilter],  | 
 | 58 | +    // Unread & Favourite  | 
 | 59 | +    [FilterKey.UnreadFilter, FilterKey.FavouriteFilter],  | 
 | 60 | +    // Unread & People  | 
 | 61 | +    [FilterKey.UnreadFilter, FilterKey.PeopleFilter],  | 
 | 62 | +    // Unread Other  | 
 | 63 | +    [FilterKey.UnreadFilter],  | 
 | 64 | +    // Favourite  | 
 | 65 | +    [FilterKey.FavouriteFilter],  | 
 | 66 | +    // People  | 
 | 67 | +    [FilterKey.PeopleFilter],  | 
 | 68 | +    // Other  | 
 | 69 | +    null,  | 
 | 70 | +    // Low Priority  | 
 | 71 | +    [FilterKey.LowPriorityFilter],  | 
 | 72 | +];  | 
 | 73 | +const listUnreadFirst: Section[] = [  | 
 | 74 | +    // Mention  | 
 | 75 | +    [FilterKey.MentionsFilter],  | 
 | 76 | +    // Unread Other  | 
 | 77 | +    [FilterKey.UnreadFilter],  | 
 | 78 | +    // Other  | 
 | 79 | +    null,  | 
 | 80 | +];  | 
 | 81 | +export const listDefault: Section[] = [null];  | 
 | 82 | + | 
 | 83 | +export function buildSections(useSections: boolean, unreadFirst: boolean): Section[] {  | 
 | 84 | +    if (useSections && unreadFirst) return sectionsUnreadFirst;  | 
 | 85 | +    else if (useSections) return sectionsDefault;  | 
 | 86 | +    else if (unreadFirst) return listUnreadFirst;  | 
 | 87 | +    else return listDefault;  | 
 | 88 | +}  | 
0 commit comments