UNPKG

supastash

Version:

Offline-first sync engine for Supabase in React Native using SQLite

61 lines (60 loc) 1.94 kB
import { getSupastashConfig } from "../../../core/config"; import { isOnline } from "../../connection"; import { refreshScreen } from "../../refreshScreenCalls"; import { SyncInfoUpdater } from "../queryStatus"; import { deleteData } from "./deleteChunks"; import { getAllDeletedData, getAllUnsyncedData } from "./getAllUnsyncedData"; import { uploadData } from "./uploadChunk"; let isInSync = new Map(); /** * Sends unsynced data to the remote database for a given table. * Returns true if it pushed anything (creates/updates OR deletes), else false. */ export async function pushLocalDataToRemote(table, onPushToRemote, noSync) { if (isInSync.get(table)) return; isInSync.set(table, true); const cfg = getSupastashConfig(); if (cfg.supastashMode === "ghost") return false; try { if (!(await isOnline())) return false; const data = await getAllUnsyncedData(table); const deletedData = await getAllDeletedData(table); SyncInfoUpdater.setUnsyncedDataCount({ amount: data?.length ?? 0, type: "push", table, }); SyncInfoUpdater.setUnsyncedDeletedCount({ amount: deletedData?.length ?? 0, type: "push", table, }); const hasData = !!data?.length; const hasDeletes = !!deletedData?.length; if (!hasData && !hasDeletes) { noSync?.push?.(table); return false; } let didWork = false; if (hasData) { await uploadData(table, data, onPushToRemote); didWork = true; } if (hasDeletes) { await deleteData(table, deletedData); didWork = true; } if (didWork) refreshScreen(table); return didWork; } catch (error) { throw error; } finally { isInSync.delete(table); } }