import { atom, useSetAtom } from 'jotai'; import { ClientEvent, MatrixClient, MatrixEvent } from 'matrix-js-sdk'; import { useEffect } from 'react'; import { AccountDataEvent } from '../../types/matrix/accountData'; import { ThreadNotificationsContent } from '../utils/threadNotifications'; // Holds the parsed `io.lotus.thread_notifications` account data. Seeded and // kept in sync by `useBindThreadNotificationsAtom`. export const threadNotificationsAtom = atom({}); const readContent = (mx: MatrixClient): ThreadNotificationsContent => ((mx as any).getAccountData(AccountDataEvent.LotusThreadNotifications)?.getContent() as | ThreadNotificationsContent | undefined) ?? {}; export const useBindThreadNotificationsAtom = ( mx: MatrixClient, threadNotifications: typeof threadNotificationsAtom, ) => { const setContent = useSetAtom(threadNotifications); useEffect(() => { setContent(readContent(mx)); const handleAccountData = (event: MatrixEvent) => { if (event.getType() === AccountDataEvent.LotusThreadNotifications) { setContent(event.getContent() ?? {}); } }; mx.on(ClientEvent.AccountData, handleAccountData); return () => { mx.removeListener(ClientEvent.AccountData, handleAccountData); }; }, [mx, setContent]); };