2026-07-07 23:24:08 -04:00
|
|
|
import { useCallback } from 'react';
|
2026-06-17 20:26:43 -04:00
|
|
|
import { useMatrixClient } from './useMatrixClient';
|
2026-07-07 23:24:08 -04:00
|
|
|
import { createAccountDataListStore } from './createAccountDataListStore';
|
2026-06-17 20:26:43 -04:00
|
|
|
|
|
|
|
|
export type Reminder = {
|
|
|
|
|
roomId: string;
|
|
|
|
|
eventId: string;
|
|
|
|
|
timestamp: number;
|
|
|
|
|
message: string;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const REMINDERS_KEY = 'io.lotus.reminders';
|
|
|
|
|
|
|
|
|
|
type RemindersContent = {
|
|
|
|
|
reminders: Reminder[];
|
|
|
|
|
};
|
|
|
|
|
|
2026-07-07 23:24:08 -04:00
|
|
|
// Shared, concurrency-safe store. See createAccountDataListStore for why the
|
|
|
|
|
// snapshot + write queue must be module-scoped (writes are serialized to avoid
|
|
|
|
|
// lost updates, since setAccountData replaces the whole content with no merge).
|
|
|
|
|
const remindersStore = createAccountDataListStore<Reminder[], RemindersContent>({
|
|
|
|
|
eventType: REMINDERS_KEY,
|
|
|
|
|
read: (content) => content?.reminders ?? [],
|
|
|
|
|
write: (reminders) => ({ reminders }),
|
|
|
|
|
});
|
2026-07-02 20:56:27 -04:00
|
|
|
|
2026-06-17 20:26:43 -04:00
|
|
|
export function useReminders(): {
|
|
|
|
|
reminders: Reminder[];
|
|
|
|
|
addReminder: (r: Reminder) => Promise<void>;
|
|
|
|
|
removeReminder: (eventId: string, timestamp: number) => Promise<void>;
|
|
|
|
|
getReminders: () => Reminder[];
|
|
|
|
|
} {
|
|
|
|
|
const mx = useMatrixClient();
|
2026-07-07 23:24:08 -04:00
|
|
|
const reminders = remindersStore.useValue(mx);
|
2026-06-17 20:26:43 -04:00
|
|
|
|
2026-06-28 09:17:19 -04:00
|
|
|
const addReminder = useCallback(
|
2026-07-07 23:24:08 -04:00
|
|
|
(r: Reminder) => remindersStore.enqueueWrite(mx, (current) => [...current, r]),
|
2026-07-02 20:56:27 -04:00
|
|
|
[mx],
|
2026-06-28 09:17:19 -04:00
|
|
|
);
|
|
|
|
|
|
2026-06-17 20:26:43 -04:00
|
|
|
const removeReminder = useCallback(
|
2026-06-28 09:17:19 -04:00
|
|
|
(eventId: string, timestamp: number) =>
|
2026-07-07 23:24:08 -04:00
|
|
|
remindersStore.enqueueWrite(mx, (current) =>
|
2026-06-28 09:17:19 -04:00
|
|
|
current.filter((r) => !(r.eventId === eventId && r.timestamp === timestamp)),
|
|
|
|
|
),
|
2026-07-02 20:56:27 -04:00
|
|
|
[mx],
|
2026-06-17 20:26:43 -04:00
|
|
|
);
|
|
|
|
|
|
2026-07-07 23:24:08 -04:00
|
|
|
const getReminders = useCallback(() => remindersStore.getLatest(mx), [mx]);
|
2026-06-17 20:26:43 -04:00
|
|
|
|
|
|
|
|
return { reminders, addReminder, removeReminder, getReminders };
|
|
|
|
|
}
|