supastash
Version:
Offline-first sync engine for Supabase in React Native using SQLite
53 lines (52 loc) • 1.88 kB
JavaScript
import { useRef } from "react";
import { deleteData } from "../../utils/fetchData/deleteData";
import { receiveData } from "../../utils/fetchData/receiveData";
import useDataState from "./dataState";
function useEventQueues(table, options, flushIntervalMs) {
const { dataMap } = useDataState(table);
const insertQueue = useRef([]);
const updateQueue = useRef([]);
const deleteQueue = useRef([]);
const flushTimer = useRef(null);
const flush = () => {
if (options.shouldFetch) {
insertQueue.current.forEach((item) => {
receiveData(item, table, options.shouldFetch, options.onInsertAndUpdate || options.onInsert);
});
updateQueue.current.forEach((item) => {
receiveData(item, table, options.shouldFetch, options.onInsertAndUpdate || options.onInsert);
});
deleteQueue.current.forEach((item) => {
deleteData(item, table, options.shouldFetch);
options.onDelete?.(item);
});
insertQueue.current = [];
updateQueue.current = [];
deleteQueue.current = [];
}
};
const scheduleFlush = () => {
if (!flushTimer.current) {
flushTimer.current = setTimeout(() => {
flush();
flushTimer.current = null;
}, flushIntervalMs);
}
};
const queueHandler = (eventType, data) => {
switch (eventType) {
case "INSERT":
insertQueue.current.push(data);
break;
case "UPDATE":
updateQueue.current.push(data);
break;
case "DELETE":
deleteQueue.current.push(data);
break;
}
scheduleFlush();
};
return queueHandler;
}
export default useEventQueues;