Echo 9517037d46 [Glitch] Fix account language selector
Port 78894ca4ad00b52848ed89c32dc33c6d2663c681 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
2026-08-14 07:23:43 -04:00

58 lines
1.8 KiB
TypeScript

import type { Map as ImmutableMap } from 'immutable';
import { List as ImmutableList } from 'immutable';
import type { TimelineParams } from '../actions/timelines_typed';
import { timelineKey } from '../actions/timelines_typed';
import { createAppSelector } from '../store';
interface TimelineShape {
unread: number;
online: boolean;
top: boolean;
isLoading: boolean;
hasMore: boolean;
pendingItems: ImmutableList<string>;
items: ImmutableList<string>;
}
type TimelinesState = ImmutableMap<string, ImmutableMap<string, unknown>>;
const emptyList = ImmutableList<string>();
export const selectTimelineByKey = createAppSelector(
[(_, key: string) => key, (state) => state.timelines as TimelinesState],
(key, timelines) => toTypedTimeline(timelines.get(key)),
);
export const selectTimelineByParams = createAppSelector(
[
(_, params: TimelineParams) => timelineKey(params),
(state) => state.timelines as TimelinesState,
],
(key, timelines) => toTypedTimeline(timelines.get(key)),
);
export const selectTimelinesByAccount = createAppSelector(
[(state) => state.timelines, (_, accountId: string) => accountId],
(timelines, accountId) =>
timelines.filter((_, key) => key.startsWith(`account:${accountId}:`)),
);
export function toTypedTimeline(timeline?: ImmutableMap<string, unknown>) {
if (!timeline) {
return null;
}
return {
unread: timeline.get('unread', 0) as number,
online: !!timeline.get('online', false),
top: !!timeline.get('top', false),
isLoading: !!timeline.get('isLoading', true),
hasMore: !!timeline.get('hasMore', false),
pendingItems: timeline.get(
'pendingItems',
emptyList,
) as ImmutableList<string>,
items: timeline.get('items', emptyList) as ImmutableList<string>,
} satisfies TimelineShape;
}