import { useState, useMemo, useCallback, useEffect } from 'react'; import { K as KVClient, a as KvEventType } from './kv-DBiZoNWq.js'; /** * A hook that works similarly to React.useState, but persists the value using the Spark Runtime. * The value is automatically retrieved from the Spark Runtime on mount and updated on state change. * While the initial value is being fetched, the `initialValue` is being used. * Use this component when you need to persist/store/remember values. Note that the current value * may be undefined if no value has been set yet or if the value has been deleted. * * @param key - The key under which to store the value. * @param initialValue - The initial value to use if no stored value is found. * @returns An array containing the current value, a setter function, and a delete function. * * @example * import { useKV } from "@github/spark/hooks"; * * const [count, setCount, deleteCount] = useKV("count", 0); * @example * import { useKV } from "@github/spark/hooks"; * * const [name, setName] = useKV("name", ""); */ function useKV(key, initialValue) { const [value, setValue] = useState(initialValue); const kvClient = useMemo(() => { return new KVClient(); }, []); const handleMessage = useCallback(async (event) => { switch (event.data.type) { case KvEventType.SPARK_KV_DELETED: // When we're notified from Workbench that a key has been deleted, // let's erase our understanding of the value. if (event.data.payload.key === key) { setValue(undefined); } return; case KvEventType.SPARK_KV_UPDATED: // When we're notified from Workbench that a key has been updated, // let's go grab the new value from the database directly. if (event.data.payload.key === key) { setValue(await kvClient.getKey(key)); } return; } }, [key]); useEffect(() => { if (!import.meta.env.DEV) { return; } window.addEventListener('message', handleMessage); return () => { window.removeEventListener('message', handleMessage); }; }, [key, handleMessage]); useEffect(() => { async function getOrSetKey() { setValue(await kvClient.getOrSetKey(key, initialValue)); } getOrSetKey(); }, [kvClient]); const deleteValue = useCallback(() => { kvClient.deleteKey(key); setValue(undefined); }, [key]); const userSetValue = useCallback((newValue) => { setValue((currentValue) => { const nextValue = typeof newValue === 'function' ? newValue(currentValue) : newValue; kvClient.setKey(key, nextValue); return nextValue; }); }, [key, kvClient]); return [value, userSetValue, deleteValue]; } export { useKV }; //# sourceMappingURL=index.js.map