alinea
Version:
Headless git-based CMS
96 lines (94 loc) • 2.59 kB
JavaScript
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
};