UNPKG

@nomyx/gun-sync

Version:

A lightweight, powerful library for synchronizing application state in real-time using Gun.js.

55 lines (54 loc) 2.21 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useGunSet = useGunSet; const react_1 = require("react"); const gun_1 = __importDefault(require("gun")); const context_1 = require("./context"); /** * A React hook to manage a synchronized set of data. * * @param scope - A string to namespace the set data. * @param gunInstance - Optional Gun instance. If not provided, uses context. * @returns A tuple containing the array of items and actions to modify the set. */ function useGunSet(scope, gunInstance) { const gun = gunInstance || (0, context_1.useGun)(); const [items, setItems] = (0, react_1.useState)(new Map()); const setNode = (0, react_1.useMemo)(() => gun.get(scope), [gun, scope]); (0, react_1.useEffect)(() => { const subscription = setNode.map().on((data, id) => { setItems(prevItems => { const newItems = new Map(prevItems); if (data === null) { newItems.delete(id); } else { newItems.set(id, data); } return newItems; }); }); return () => { if (subscription && subscription.off) { subscription.off(); } }; }, [setNode]); const addItem = (0, react_1.useCallback)((item) => { var _a; const id = ((_a = gun_1.default.text) === null || _a === void 0 ? void 0 : _a.random()) || Math.random().toString(36).substring(2, 15); setNode.get(id).put(item); return id; }, [setNode]); const updateItem = (0, react_1.useCallback)((id, item) => { setNode.get(id).put(item); }, [setNode]); const removeItem = (0, react_1.useCallback)((id) => { setNode.get(id).put(null); }, [setNode]); const itemsArray = (0, react_1.useMemo)(() => Array.from(items.entries()).map(([id, data]) => (Object.assign(Object.assign({}, data), { id }))), [items]); return [itemsArray, { addItem, updateItem, removeItem }]; }