import { atom } from 'jotai'; import { atomWithStorage, createJSONStorage } from 'jotai/utils'; import { IContent } from 'matrix-js-sdk'; export type ScheduledMessage = { delayId: string; roomId: string; content: IContent; sendAt: number; // Unix timestamp ms }; const STORAGE_KEY = 'cinny_scheduled_messages_v1'; // Internal atom persists as a plain Record (JSON-serializable). const internalAtom = atomWithStorage>( STORAGE_KEY, {}, createJSONStorage(() => localStorage), ); /** * Global atom: Map * Stores all locally-tracked scheduled messages across rooms. * MSC4140 has no list endpoint, so we track them ourselves. * Backed by localStorage so scheduled messages survive page refreshes. */ export const scheduledMessagesAtom = atom( (get): Map => new Map(Object.entries(get(internalAtom))), ( _get, set, updater: | Map | ((prev: Map) => Map), ) => { set(internalAtom, (prevObj) => { const prevMap = new Map(Object.entries(prevObj)); const nextMap = typeof updater === 'function' ? updater(prevMap) : updater; return Object.fromEntries(nextMap.entries()); }); }, );