UNPKG

react-toggle-management

Version:

A lightweight React library for managing toggleable global state—designed to be simpler than Zustand and more focused than Redux.

1 lines 5.94 kB
{"version":3,"sources":["../src/ToggleProvider.tsx","../src/ToggleContext.ts","../src/createToggleStore.ts","../src/useToggle.ts"],"sourcesContent":["'use client'\n\nimport React, { useMemo } from 'react'\nimport ToggleStateContext from './ToggleContext'\nimport { createToggleStore } from './createToggleStore'\n\ninterface ToggleStateContextProviderProps {\n children: React.ReactNode\n initialState?: Set<string>\n}\n\n// Create a default store instance (can be overridden)\nconst defaultToggleStore = createToggleStore()\n\nexport default function ToggleGlobalProvider({\n children,\n initialState\n}: ToggleStateContextProviderProps) {\n // Create or use a store instance\n const store = useMemo(() => {\n return initialState ? createToggleStore(initialState) : defaultToggleStore\n }, [initialState])\n\n return (\n <ToggleStateContext.Provider value={store}>\n {children}\n </ToggleStateContext.Provider>\n )\n}\n","import { createContext } from 'react'\nimport { ToggleStore } from './createToggleStore'\n\n// We'll provide the entire store object through context\nconst ToggleStateContext = createContext<ToggleStore | null>(null)\n\nexport default ToggleStateContext\n","type ToggleState = Set<string>\ntype Listener = () => void\n\nexport type ToggleStore = {\n getState: () => ToggleState\n subscribe: (listener: Listener) => () => void\n setToggle: (key: string, value: boolean) => void\n toggle: (key: string) => void\n reset: () => void\n}\n\nexport const createToggleStore = (\n initialState: ToggleState = new Set()\n): ToggleStore => {\n let state: ToggleState = initialState\n const listeners = new Set<Listener>()\n\n const getState = () => state\n\n const subscribe = (listener: Listener) => {\n listeners.add(listener)\n return () => listeners.delete(listener)\n }\n\n const setToggle = (key: string, value: boolean) => {\n if (state.has(key) === value) return\n if (value) {\n state.add(key)\n } else {\n state.delete(key)\n }\n listeners.forEach((listener) => listener())\n }\n\n const toggle = (key: string) => {\n const current = state.has(key)\n setToggle(key, !current)\n }\n\n const reset = () => {\n state = initialState\n listeners.forEach((listener) => listener())\n }\n\n return {\n getState,\n subscribe,\n setToggle,\n toggle,\n reset\n }\n}\n","'use client'\n\nimport { useContext, useCallback, useSyncExternalStore } from 'react'\nimport ToggleStateContext from './ToggleContext'\n\nexport function useToggle(defaultKey: string) {\n const store = useContext(ToggleStateContext)\n\n if (!store) {\n throw new Error(\n 'useToggle must be used within a ToggleStateContextProvider'\n )\n }\n\n const isOpen = useSyncExternalStore(\n store.subscribe,\n () => store.getState().has(defaultKey) ?? false,\n () => false\n )\n\n const readIsOpen = useCallback(\n (key?: string) => {\n return store.getState().has(key ?? defaultKey) ?? false\n },\n [defaultKey, store]\n )\n\n // Now these functions accept an optional key parameter.\n // If no key is provided, they use the defaultKey from the hook input.\n\n const open = useCallback(\n (key?: string) => {\n store.setToggle(key ?? defaultKey, true)\n },\n [defaultKey, store]\n )\n\n const close = useCallback(\n (key?: string) => {\n store.setToggle(key ?? defaultKey, false)\n },\n [defaultKey, store]\n )\n\n const toggle = useCallback(\n (key?: string) => {\n store.toggle(key ?? defaultKey)\n },\n [defaultKey, store]\n )\n\n const reset = useCallback(\n (key?: string) => {\n if (key) {\n const initialValue = store.getState().has(key) ?? false\n store.setToggle(key, initialValue)\n } else {\n store.reset()\n }\n },\n [store]\n )\n\n return {\n isOpen,\n open,\n close,\n toggle,\n reset,\n readIsOpen\n }\n}\n"],"mappings":";;;AAEA,SAAgB,eAAe;;;ACF/B,SAAS,qBAAqB;AAI9B,IAAM,qBAAqB,cAAkC,IAAI;AAEjE,IAAO,wBAAQ;;;ACKR,IAAM,oBAAoB,CAC/B,eAA4B,oBAAI,IAAI,MACpB;AAChB,MAAI,QAAqB;AACzB,QAAM,YAAY,oBAAI,IAAc;AAEpC,QAAM,WAAW,MAAM;AAEvB,QAAM,YAAY,CAAC,aAAuB;AACxC,cAAU,IAAI,QAAQ;AACtB,WAAO,MAAM,UAAU,OAAO,QAAQ;AAAA,EACxC;AAEA,QAAM,YAAY,CAAC,KAAa,UAAmB;AACjD,QAAI,MAAM,IAAI,GAAG,MAAM,MAAO;AAC9B,QAAI,OAAO;AACT,YAAM,IAAI,GAAG;AAAA,IACf,OAAO;AACL,YAAM,OAAO,GAAG;AAAA,IAClB;AACA,cAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,EAC5C;AAEA,QAAM,SAAS,CAAC,QAAgB;AAC9B,UAAM,UAAU,MAAM,IAAI,GAAG;AAC7B,cAAU,KAAK,CAAC,OAAO;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM;AAClB,YAAQ;AACR,cAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AF3BI;AAZJ,IAAM,qBAAqB,kBAAkB;AAE9B,SAAR,qBAAsC;AAAA,EAC3C;AAAA,EACA;AACF,GAAoC;AAElC,QAAM,QAAQ,QAAQ,MAAM;AAC1B,WAAO,eAAe,kBAAkB,YAAY,IAAI;AAAA,EAC1D,GAAG,CAAC,YAAY,CAAC;AAEjB,SACE,oBAAC,sBAAmB,UAAnB,EAA4B,OAAO,OACjC,UACH;AAEJ;;;AG1BA,SAAS,YAAY,aAAa,4BAA4B;AAGvD,SAAS,UAAU,YAAoB;AAC5C,QAAM,QAAQ,WAAW,qBAAkB;AAE3C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,MAAM,MAAM,SAAS,EAAE,IAAI,UAAU,KAAK;AAAA,IAC1C,MAAM;AAAA,EACR;AAEA,QAAM,aAAa;AAAA,IACjB,CAAC,QAAiB;AAChB,aAAO,MAAM,SAAS,EAAE,IAAI,OAAO,UAAU,KAAK;AAAA,IACpD;AAAA,IACA,CAAC,YAAY,KAAK;AAAA,EACpB;AAKA,QAAM,OAAO;AAAA,IACX,CAAC,QAAiB;AAChB,YAAM,UAAU,OAAO,YAAY,IAAI;AAAA,IACzC;AAAA,IACA,CAAC,YAAY,KAAK;AAAA,EACpB;AAEA,QAAM,QAAQ;AAAA,IACZ,CAAC,QAAiB;AAChB,YAAM,UAAU,OAAO,YAAY,KAAK;AAAA,IAC1C;AAAA,IACA,CAAC,YAAY,KAAK;AAAA,EACpB;AAEA,QAAM,SAAS;AAAA,IACb,CAAC,QAAiB;AAChB,YAAM,OAAO,OAAO,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,YAAY,KAAK;AAAA,EACpB;AAEA,QAAM,QAAQ;AAAA,IACZ,CAAC,QAAiB;AAChB,UAAI,KAAK;AACP,cAAM,eAAe,MAAM,SAAS,EAAE,IAAI,GAAG,KAAK;AAClD,cAAM,UAAU,KAAK,YAAY;AAAA,MACnC,OAAO;AACL,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}