UNPKG

alinea

Version:
96 lines (94 loc) 2.59 kB
import { atomFamily } from "../../chunks/chunk-WDCPVJJC.js"; import { useAtomValue } from "../../chunks/chunk-TOJF2G3X.js"; import { atom } from "../../chunks/chunk-WJ67RR7S.js"; import "../../chunks/chunk-NZLE2WMY.js"; // src/dashboard/atoms/DbAtoms.ts import { IndexEvent } from "alinea/core/db/IndexEvent"; import { useEffect } from "react"; import { dashboardOptionsAtom } from "./DashboardAtoms.js"; var dbAtoms = atom((get) => { const db = get(dashboardOptionsAtom).db; const baseMeta = atom(); const metaAtom = atom( async (get2) => { return get2(baseMeta) ?? db.sync(); }, (get2, set) => { const listen = (event) => { if (event instanceof IndexEvent && event.data.op === "index") set(baseMeta, event.data.sha); if (event instanceof IndexEvent && event.data.op === "entry") set(entryRevisionAtoms(event.data.id)); }; db.events.addEventListener(IndexEvent.type, listen); return () => { db.events.removeEventListener(IndexEvent.type, listen); }; } ); metaAtom.onMount = (init) => init(); return { db, metaAtom }; }); var dbAtom = atom((get) => { return get(dbAtoms).db; }); var dbMetaAtom = atom((get) => { return get(get(dbAtoms).metaAtom); }); var pendingMutations = atom(0); var pendingAtom = atom( (get) => get(pendingMutations), (get, set) => { const local = get(dbAtom); const listen = (event) => { if (event instanceof IndexEvent && event.data.op === "mutate") { const { data } = event; set(pendingMutations, (current) => { let newPending = current; if (data.status === "pending") newPending++; else newPending--; return newPending > 0 ? newPending : 0; }); } }; local.events.addEventListener(IndexEvent.type, listen); return () => { local.events.removeEventListener(IndexEvent.type, listen); }; } ); pendingAtom.onMount = (init) => init(); var entryRevisionAtoms = atomFamily((id) => { const index = atom(0); return atom( (get) => get(index), (get, set) => { const current = get(index); set(index, current + 1); } ); }); function useDbUpdater(everySeconds = 30) { const db = useAtomValue(dbAtom); useEffect(() => { const forceDbUpdate = () => db.sync(); let interval = 0; interval = setInterval(forceDbUpdate, everySeconds * 1e3); return () => { clearInterval(interval); }; }, [everySeconds, db]); } export { dbAtom, dbMetaAtom, entryRevisionAtoms, pendingAtom, useDbUpdater };