@randajan/vault-kit
Version:
A tiny and universal data vault that behaves like a writable file system. Store, sync, forget. Works on client and server.
67 lines (64 loc) • 1.97 kB
JavaScript
import {
Vault
} from "../chunk-LBGEVRAJ.js";
// src/react/useVault.jsx
import React, { useEffect, useMemo, useState } from "react";
var validateVault = (vault) => {
if (!(vault instanceof Vault)) {
throw Error("vault must be instance of Vault");
}
};
var createPort = (vault, redraw, ...a) => {
validateVault(vault);
let reply, fallback;
const d = async (action, params, ...e) => reply = await vault.act(action, params, ...a, ...e);
const enumerable = true;
const port = Object.defineProperties({}, {
status: { enumerable, get: () => vault.getStatus(...a) },
data: { enumerable, get: () => vault.getData(...a) || fallback },
error: { enumerable, get: () => vault.getError(...a) },
reply: { enumerable, get: () => reply },
confirm: { value: () => {
reply = void 0;
redraw(Symbol());
} },
set: { value: async (data, ...e) => reply = await vault.set(data, ...a, ...e) },
act: { value: vault.withActions(d, d) },
isStatus: { value: (statuses, ...e) => vault.isStatus(statuses, ...a, ...e) }
});
const cleanUp = vault.on((ctx, ...e) => {
for (const i in a) {
if (e[i] != a[i]) {
return;
}
}
const { status, before } = ctx;
if (vault.hasRemote) {
if (status === "init" || status === "expired") {
fallback = before.data;
vault.get(...a);
} else if (status === "ready" || status === "error") {
fallback = void 0;
}
}
redraw(Symbol());
});
vault.get(...a);
return [port, cleanUp];
};
var useVault = (vault, ...a) => {
const redraw = useState(0)[1];
const [port, cleanUp] = useMemo((_) => createPort(vault, redraw, ...a), [vault, ...a]);
useEffect((_) => cleanUp, [cleanUp]);
return port;
};
Vault.prototype.use = function(...a) {
return useVault(this, ...a);
};
// src/react/index.js
var react_default = useVault;
export {
react_default as default,
useVault
};
//# sourceMappingURL=index.js.map