mirror of
https://github.com/duckietm/Nitro-V3.git
synced 2026-06-19 15:06:20 +00:00
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import { IMentionEntry } from '../../api/mentions';
|
|
|
|
let mentions: IMentionEntry[] = [];
|
|
const listeners = new Set<() => void>();
|
|
|
|
const emit = () => { for(const l of listeners) l(); };
|
|
|
|
export const subscribeMentions = (onChange: () => void): (() => void) =>
|
|
{
|
|
listeners.add(onChange);
|
|
return () => { listeners.delete(onChange); };
|
|
};
|
|
|
|
export const getMentionsSnapshot = (): ReadonlyArray<IMentionEntry> => mentions;
|
|
|
|
export const getUnreadCount = (): number => mentions.reduce((n, m) => n + (m.read ? 0 : 1), 0);
|
|
|
|
export const setMentions = (list: IMentionEntry[]): void =>
|
|
{
|
|
mentions = [...list].sort((a, b) => b.mentionId - a.mentionId);
|
|
emit();
|
|
};
|
|
|
|
export const addMention = (entry: IMentionEntry): void =>
|
|
{
|
|
if(mentions.some(m => m.mentionId === entry.mentionId && entry.mentionId !== 0)) return;
|
|
mentions = [entry, ...mentions];
|
|
emit();
|
|
};
|
|
|
|
export const markRead = (mentionId: number): void =>
|
|
{
|
|
mentions = mentions.map(m => m.mentionId === mentionId ? { ...m, read: true } : m);
|
|
emit();
|
|
};
|
|
|
|
export const markAllRead = (): void =>
|
|
{
|
|
mentions = mentions.map(m => m.read ? m : { ...m, read: true });
|
|
emit();
|
|
};
|
|
|
|
export const removeMention = (mentionId: number): void =>
|
|
{
|
|
const next = mentions.filter(m => m.mentionId !== mentionId);
|
|
if(next.length === mentions.length) return;
|
|
mentions = next;
|
|
emit();
|
|
};
|
|
|
|
export const resetMentions = (): void => { mentions = []; emit(); };
|