use-s-react
Version:
useS is a minimal yet powerful React hook for managing both local and global state — with zero boilerplate
77 lines (76 loc) • 2.38 kB
JavaScript
import { TypeCheck } from "full-copy";
const store = new Map();
export function createState(key, initial) {
store.set(key, {
value: initial,
listeners: new Set(),
});
}
export function setGlobalState(key, newValue) {
const entry = store.get(key);
if (entry) {
entry.value = newValue;
entry.listeners.forEach((fn) => fn());
}
}
export function subscribeToGlobalState(key, listener) {
const entry = store.get(key);
if (!entry)
return () => { };
entry.listeners.add(listener);
return () => entry.listeners.delete(listener);
}
export function getGlobalSnapshot(key) {
const entry = store.get(key);
return entry?.value;
}
export function debugGlobalStore(options = {}) {
const { filterKey, withConsoleTable = true } = options;
const hasTable = withConsoleTable && typeof console.table === "function";
console.group("[🗄️ useS] Global Store Debug");
for (const [key, entry] of store.entries()) {
if (filterKey && key !== filterKey)
continue;
const value = entry.value;
const type = TypeCheck(value)[0];
console.groupCollapsed(`🔑 ${key} (${type})`);
if (type === "map" && value instanceof Map) {
if (hasTable)
console.table(Object.fromEntries(value));
else
console.log(Object.fromEntries(value));
}
else if (type === "set" && value instanceof Set) {
if (hasTable)
console.table(Array.from(value));
else
console.log(Array.from(value));
}
else if (type === "regexp") {
if (hasTable)
console.table(value);
else
console.log(value);
}
else if (type === "array") {
if (hasTable)
console.table(value);
else
console.log(value);
}
else if (type === "object") {
if (hasTable)
console.table(value);
else
console.log(value);
}
else {
console.log(value); // "number", "string", "boolean", "undefined", "null" & "date"
}
console.groupEnd();
}
console.groupEnd();
}
export function isKeyInitialized(key) {
return !!key && store.has(key);
}