{"version":3,"file":"index.modern.mjs","sources":["../src/globalState.ts","../src/ManagerWrapper.ts","../src/SaviorWrapper.ts","../src/index.ts"],"sourcesContent":["import { useEffect, useState, SetStateAction, Dispatch } from \"react\";\n\nexport type StoreUpdater<Store> = (store: Store) => Store;\n\nexport type EmitterSubscription<Store> = (store: Store) => void;\n\nexport type EmitterUnsubscriptionFunction = () => void;\n\nexport type StoreFactory<Store> = () => Store;\n\nexport type StoreHook<Store> = () => [\n\tstore: Store,\n\tsetStore: Dispatch<SetStateAction<Store>>\n];\n\nexport type InitialStoreFactory<Store> = (\n\tget: StoreFactory<Store>,\n\tset: (updater: StoreUpdater<Store>) => Store\n) => Store;\n\nexport interface StoreHolder<Store> {\n\tstore: Store | null;\n}\n\n// cf. https://formidable.com/blog/2021/stores-no-context-api/\n// cf. https://blog.axlight.com/posts/steps-to-develop-global-state-for-react/\n\nexport type CreateGlobalStore<Store> = [\n\tstoreHolder: StoreHolder<Store>,\n\tuseStore: StoreHook<Store>\n];\n\nexport const createGlobalStore = <Store>(\n\tinitialStoreFactory: InitialStoreFactory<Store>\n): CreateGlobalStore<Store> => {\n\tconst storeHolder: StoreHolder<Store> = {\n\t\tstore: null,\n\t};\n\tconst listeners = new Set<() => void>();\n\n\tconst get = () => storeHolder.store!;\n\tconst set = (updater: StoreUpdater<Store>) => {\n\t\tstoreHolder.store = updater(get());\n\t\tlisteners.forEach(listener => listener());\n\t\treturn storeHolder.store;\n\t};\n\n\tstoreHolder.store = initialStoreFactory(get, set);\n\n\tconst setGlobalStore = (\n\t\tnextStore: Store | ((prevStore: Store) => Store)\n\t) => {\n\t\tif (typeof nextStore !== \"function\") {\n\t\t\t// eslint-disable-next-line no-param-reassign\n\t\t\tnextStore = () => nextStore as Store;\n\t\t}\n\n\t\tset(nextStore as (prevStore: Store) => Store);\n\t};\n\n\tconst useLocalStore: StoreHook<Store> = () => {\n\t\t// intitialize component with latest store\n\t\tconst [localStore, setLocalStore] = useState<Store>(get());\n\n\t\t// update our local store when the global\n\t\t// store updates.\n\t\t//\n\t\t// emitter.subscribe returns a cleanup\n\t\t// function, so react will clean this\n\t\t// up on unmount.\n\t\tuseEffect(() => {\n\t\t\tconst listener = () => {\n\t\t\t\tsetLocalStore(get());\n\t\t\t};\n\n\t\t\tlisteners.add(listener);\n\t\t\tlistener(); // in case it's already changed\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t}, []);\n\t\treturn [localStore, setGlobalStore];\n\t};\n\n\treturn [storeHolder, useLocalStore];\n};\n","import type {\n\tGdprManager,\n\tGdprManagerRaw,\n\tGdprGuard,\n\tGdprGuardGroup,\n\tGdprStorage,\n\tGdprManagerEventHub,\n} from \"gdpr-guard\";\n\nimport { StoreHolder } from \"./globalState\";\nimport type { MethodNamesOf } from \"./typings\";\nimport { ArgumentsOf } from \"./typings\";\n\nexport interface ReactGdprGuardGlobalStore {\n\tmaterializedState: GdprManagerRaw;\n\tupdate(manager: GdprManagerRaw): ReactGdprGuardGlobalStore;\n}\n\nexport class ManagerWrapper {\n\t/* eslint-disable no-useless-constructor, no-empty-function */\n\tconstructor(\n\t\tprotected _manager: GdprManager,\n\t\tprotected _globalStoreHolder: StoreHolder<ReactGdprGuardGlobalStore>\n\t) {}\n\t/* eslint-enable no-useless-constructor, no-empty-function */\n\n\tpublic get manager(): GdprManager {\n\t\treturn this._manager;\n\t}\n\n\tpublic get materializedState(): GdprManagerRaw {\n\t\treturn this._globalStoreHolder.store!.materializedState;\n\t}\n\n\tpublic triggerUpdate(): void {\n\t\tthis._globalStoreHolder.store!.update(this.generateRawManager());\n\t}\n\n\tpublic get bannerWasShown(): boolean {\n\t\treturn this.manager.bannerWasShown;\n\t}\n\n\tpublic get events(): GdprManagerEventHub {\n\t\treturn this.manager.events;\n\t}\n\n\tpublic closeBanner(): void {\n\t\tthis.manager.closeBanner();\n\t\tthis.triggerUpdate();\n\t}\n\n\tpublic resetAndShowBanner(): void {\n\t\tthis.manager.resetAndShowBanner();\n\t\tthis.triggerUpdate();\n\t}\n\n\tpublic json(): GdprManagerRaw {\n\t\treturn this.materializedState;\n\t}\n\n\tpublic toString(): string {\n\t\treturn JSON.stringify(this.materializedState);\n\t}\n\n\tpublic disable(target?: string): this {\n\t\treturn this.wrap(\"disable\", target);\n\t}\n\n\tpublic enable(target?: string): this {\n\t\treturn this.wrap(\"enable\", target);\n\t}\n\n\tpublic toggle(target?: string): this {\n\t\treturn this.wrap(\"toggle\", target);\n\t}\n\n\tpublic disableForStorage(storageType: GdprStorage): this {\n\t\tthis.manager.disableForStorage(storageType);\n\t\treturn this;\n\t}\n\n\tpublic enableForStorage(storageType: GdprStorage): this {\n\t\tthis.manager.enableForStorage(storageType);\n\t\treturn this;\n\t}\n\n\tpublic toggleForStorage(storageType: GdprStorage): this {\n\t\tthis.manager.toggleForStorage(storageType);\n\t\treturn this;\n\t}\n\n\tpublic isEnabled(name: string): boolean {\n\t\treturn this.manager.isEnabled(name);\n\t}\n\n\tpublic hasGroup(groupName: string): boolean {\n\t\treturn this.manager.hasGroup(groupName);\n\t}\n\n\tpublic hasGuard(guardName: string): boolean {\n\t\treturn this.manager.hasGuard(guardName);\n\t}\n\n\tpublic getGroup(groupName: string): GdprGuardGroup | null {\n\t\treturn this.manager.getGroup(groupName);\n\t}\n\n\tpublic getGuard(guardName: string): GdprGuard | null {\n\t\treturn this.manager.getGuard(guardName);\n\t}\n\n\tprotected generateRawManager(): GdprManagerRaw {\n\t\treturn this.manager.raw();\n\t}\n\n\tpublic hotswap(newManager: GdprManager): this {\n\t\tthis._manager = newManager;\n\t\tthis.triggerUpdate();\n\t\treturn this;\n\t}\n\n\tprotected wrap<Method extends MethodNamesOf<GdprGuard>>(\n\t\tmethod: Method,\n\t\ttarget?: string,\n\t\t...args: ArgumentsOf<GdprGuard[Method]>\n\t): this {\n\t\tif (\n\t\t\ttypeof target === \"undefined\" &&\n\t\t\ttypeof this.manager[method] === \"function\"\n\t\t) {\n\t\t\t// @ts-expect-error False positive of TS2349 or TS2684\n\t\t\tthis.manager[method](...args);\n\t\t\tthis.triggerUpdate();\n\t\t} else if (this.manager.hasGuard(target!)) {\n\t\t\tconst guard = this.manager.getGuard(target!);\n\n\t\t\tif (typeof guard?.[method] === \"function\") {\n\t\t\t\t// @ts-expect-error False positive of TS2349 or TS2684\n\t\t\t\tguard?.[method](...args);\n\t\t\t\tthis.triggerUpdate();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import {\n\tGdprSavior,\n\tGdprManager,\n\tGdprManagerFactory,\n\tGdprManagerRaw,\n\tGdprSaviorAdapter,\n} from \"gdpr-guard\";\n\nimport { ManagerWrapper } from \"./ManagerWrapper\";\n\nexport class SaviorWrapper extends GdprSaviorAdapter {\n\tconstructor(\n\t\tprotected savior: GdprSavior,\n\t\tprotected managerWrapper: ManagerWrapper\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic override async updateSharedManager(\n\t\tmanager: GdprManager\n\t): Promise<void> {\n\t\tif (this.managerWrapper.manager === manager) return;\n\n\t\tawait this.savior.updateSharedManager(manager);\n\t\tthis.managerWrapper.hotswap(manager);\n\t}\n\n\t/// Delegates\n\tpublic override check() {\n\t\treturn this.savior.check();\n\t}\n\n\tpublic override exists(shouldUpdate = true) {\n\t\treturn this.savior.exists(shouldUpdate);\n\t}\n\n\tpublic override restore(shouldUpdate = true) {\n\t\treturn this.savior.restore(shouldUpdate);\n\t}\n\n\tpublic override restoreOrCreate(factory: GdprManagerFactory) {\n\t\treturn this.savior.restoreOrCreate(factory);\n\t}\n\n\tpublic override store(manager: GdprManagerRaw) {\n\t\treturn this.savior.store(manager);\n\t}\n\n\tpublic override decorate(manager: GdprManager): GdprManager {\n\t\tif (typeof this.savior.decorate !== \"undefined\") {\n\t\t\treturn this.savior.decorate(manager);\n\t\t}\n\n\t\treturn super.decorate(manager);\n\t}\n}\n","import type {\n\tGdprManagerFactory,\n\tGdprManagerRaw,\n\tGdprSavior,\n\tGdprGuardRaw,\n\tGdprStorage,\n} from \"gdpr-guard\";\nimport { GdprManager } from \"gdpr-guard\";\nimport {\n\tDependencyList,\n\tuseRef,\n\tuseCallback,\n\tuseMemo,\n\tuseEffect,\n\tuseDebugValue,\n} from \"react\";\n\nimport { createGlobalStore } from \"./globalState\";\nimport { ManagerWrapper, ReactGdprGuardGlobalStore } from \"./ManagerWrapper\";\nimport { SaviorWrapper } from \"./SaviorWrapper\";\nimport type {\n\tGdprGuardHooks,\n\tUseGdpr,\n\tUseSetupGdprEffect,\n\tUseGdprComputed,\n\tUseGdprGuard,\n\tUseGdprGuardEnabledState,\n\tUseGdprManager,\n\tUseGdprSavior,\n\tUseAttachGdprListenersEffect,\n} from \"./typings\";\n\n/**\n * {@link useEffect} but that will only be triggered after one render/call attempt as already been made\n */\nconst useEffectOnSecondRender = <Fn extends (...args: any[]) => any>(\n\tfn: Fn,\n\tdeps: DependencyList = []\n) => {\n\tconst didMount = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (didMount.current) {\n\t\t\tfn();\n\t\t\treturn;\n\t\t}\n\t\tdidMount.current = true;\n\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [...deps, fn]);\n};\n\n/**\n * Create hooks for the gdpr-guard library based on the provided {@link GdprSavior}\n * @param savior - The {@link GdprSavior} to wrap\n * @param managerFactory - A factory to the latest version of your {@link GdprManager}\n * @returns The React hooks associated to that {@link GdprSavior}\n */\nexport const createGdprGuardHooks = (\n\tsavior: GdprSavior,\n\tmanagerFactory: GdprManagerFactory\n): GdprGuardHooks => {\n\t// Use a dummy manager that'll be hotswap later after init\n\tconst dummyManager = GdprManager.create([]);\n\tconst [globalStoreHolder, useGlobalStore] =\n\t\tcreateGlobalStore<ReactGdprGuardGlobalStore>((get, set) => ({\n\t\t\tmaterializedState: dummyManager.raw(),\n\t\t\tupdate: (manager: GdprManagerRaw) => {\n\t\t\t\treturn set(store => ({ ...store, materializedState: manager }));\n\t\t\t},\n\t\t}));\n\n\tconst [, useUnderlyingManager] = createGlobalStore(() => dummyManager);\n\n\tconst managerWrapper = new ManagerWrapper(dummyManager, globalStoreHolder);\n\n\tconst saviorWrapper = new SaviorWrapper(savior, managerWrapper);\n\n\tconst useGdprSavior: UseGdprSavior = (): GdprSavior => saviorWrapper;\n\n\tconst useGdprManager: UseGdprManager = (): ManagerWrapper => managerWrapper;\n\n\t/**\n\t * For internal uses only\n\t */\n\tconst useWrappedManager = () => {\n\t\tconst [store] = useGlobalStore();\n\t\treturn useMemo(() => store.materializedState, [store]);\n\t};\n\n\tconst useSetupGdprEffect: UseSetupGdprEffect = onError => {\n\t\tconst wrappingManager = useGdprManager();\n\t\tconst [underlyingManager, setUnderlyingManager] = useUnderlyingManager();\n\t\tconst lastAutoClose = useRef<GdprManager|undefined>();\n\n\t\tconst restoreManagerOnBoot = useCallback(() => {\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst manager = await saviorWrapper.restoreOrCreate(\n\t\t\t\t\t\tmanagerFactory\n\t\t\t\t\t);\n\n\t\t\t\t\twrappingManager.hotswap(manager);\n\t\t\t\t\tsetUnderlyingManager(manager);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tonError?.(e);\n\t\t\t\t}\n\t\t\t})();\n\n\t\t\treturn () => {};\n\t\t}, [onError, wrappingManager]);\n\n\t\tuseEffectOnSecondRender(restoreManagerOnBoot);\n\n\t\t// Auto-close\n\t\tuseEffect(() => {\n\t\t\tif (lastAutoClose.current !== underlyingManager && wrappingManager.bannerWasShown) {\n\t\t\t\tlastAutoClose.current =  wrappingManager.manager;\n\t\t\t\twrappingManager.closeBanner();\n\t\t\t}\n\t\t}, [underlyingManager, wrappingManager]);\n\t};\n\n\tconst useGdprComputed: UseGdprComputed = <T>(\n\t\tfactory: () => T,\n\t\tdeps: DependencyList = []\n\t): T => {\n\t\tconst globalStore = useGlobalStore();\n\n\t\treturn useMemo(factory, [...deps, factory, globalStore /*, fn*/]);\n\t};\n\n\tconst useAttachGdprListenersEffect: UseAttachGdprListenersEffect =\n\t\tcallback => {\n\t\t\tconst manager = useGdprManager();\n\t\t\tconst [underlyingManager] = useUnderlyingManager();\n\n\t\t\tuseEffect(() => {\n\t\t\t\treturn callback(manager.events, underlyingManager || manager.manager);\n\t\t\t}, [callback, manager.events, manager.manager, underlyingManager]);\n\t\t};\n\n\tconst useGdprGuardEnabledState: UseGdprGuardEnabledState = (\n\t\tguardName: string,\n\t\tuseBannerStatus: boolean = false\n\t) => {\n\t\treturn useGdprComputed(() => {\n\t\t\tconst bannerWasShown =\n\t\t\t\t!useBannerStatus || managerWrapper.bannerWasShown;\n\n\t\t\treturn (\n\t\t\t\tbannerWasShown &&\n\t\t\t\t(managerWrapper.getGuard(guardName)?.enabled ?? false)\n\t\t\t);\n\t\t}, [guardName, managerWrapper.bannerWasShown]);\n\t};\n\n\tconst useGdprGuard: UseGdprGuard = (guardName: string) => {\n\t\tconst manager = useGdprManager();\n\n\t\tconst guard = useGdprComputed(() => {\n\t\t\treturn manager.getGuard(guardName)?.raw();\n\t\t}, [guardName, manager]) as GdprGuardRaw | null;\n\n\t\tconst enableGuard = useCallback(() => {\n\t\t\tmanager.enable(guardName);\n\t\t}, [guardName, manager]);\n\n\t\tconst disableGuard = useCallback(() => {\n\t\t\tmanager.disable(guardName);\n\t\t}, [guardName, manager]);\n\n\t\tconst toggleGuard = useCallback(() => {\n\t\t\tmanager.toggle(guardName);\n\t\t}, [guardName, manager]);\n\n\t\tuseDebugValue(guardName);\n\n\t\treturn {\n\t\t\tguard,\n\t\t\tenableGuard,\n\t\t\tdisableGuard,\n\t\t\ttoggleGuard,\n\t\t};\n\t};\n\n\tconst useGdpr: UseGdpr = () => {\n\t\tconst wrapper = useGdprManager();\n\n\t\t// Manager\n\t\tconst manager = useGdprComputed(\n\t\t\t() => wrapper.materializedState,\n\t\t\t[wrapper, wrapper.materializedState]\n\t\t);\n\n\t\tconst enableManager = useCallback(() => {\n\t\t\twrapper.enable();\n\t\t}, [wrapper]);\n\n\t\tconst disableManager = useCallback(() => {\n\t\t\twrapper.disable();\n\t\t}, [wrapper]);\n\n\t\tconst toggleManager = useCallback(() => {\n\t\t\twrapper.toggle();\n\t\t}, [wrapper]);\n\n\t\t// Guard/group\n\t\tconst enableGuard = useCallback(\n\t\t\t(guardName: string) => {\n\t\t\t\twrapper.enable(guardName);\n\t\t\t},\n\t\t\t[wrapper]\n\t\t);\n\n\t\tconst disableGuard = useCallback(\n\t\t\t(guardName: string) => {\n\t\t\t\twrapper.disable(guardName);\n\t\t\t},\n\t\t\t[wrapper]\n\t\t);\n\n\t\tconst toggleGuard = useCallback(\n\t\t\t(guardName: string) => {\n\t\t\t\twrapper.toggle(guardName);\n\t\t\t},\n\t\t\t[wrapper]\n\t\t);\n\n\t\tconst guardIsEnabled = useCallback(\n\t\t\t(guardName: string, useBannerStatus: boolean = false) => {\n\t\t\t\tconst bannerWasShown =\n\t\t\t\t\t!useBannerStatus || wrapper.bannerWasShown;\n\t\t\t\treturn bannerWasShown && wrapper.isEnabled(guardName);\n\t\t\t},\n\t\t\t[wrapper]\n\t\t);\n\n\t\t// Storage\n\t\tconst enableForStorage = useCallback(\n\t\t\t(storage: GdprStorage) => {\n\t\t\t\twrapper.enableForStorage(storage);\n\t\t\t},\n\t\t\t[wrapper]\n\t\t);\n\n\t\tconst disableForStorage = useCallback(\n\t\t\t(storage: GdprStorage) => {\n\t\t\t\twrapper.disableForStorage(storage);\n\t\t\t},\n\t\t\t[wrapper]\n\t\t);\n\n\t\tconst toggleForStorage = useCallback(\n\t\t\t(storage: GdprStorage) => {\n\t\t\t\twrapper.toggleForStorage(storage);\n\t\t\t},\n\t\t\t[wrapper]\n\t\t);\n\n\t\tconst closeGdprBanner = useCallback(\n\t\t\t() => wrapper.closeBanner(),\n\t\t\t[wrapper]\n\t\t);\n\t\tconst resetAndShowBanner = useCallback(\n\t\t\t() => wrapper.resetAndShowBanner(),\n\t\t\t[wrapper]\n\t\t);\n\t\tconst bannerWasShown = useGdprComputed(\n\t\t\t() => wrapper.bannerWasShown,\n\t\t\t[wrapper]\n\t\t);\n\n\t\treturn {\n\t\t\t// Meta\n\t\t\tcloseGdprBanner,\n\t\t\tresetAndShowBanner,\n\t\t\tbannerWasShown,\n\t\t\t// Manager\n\t\t\tmanager,\n\t\t\tenableManager,\n\t\t\tdisableManager,\n\t\t\ttoggleManager,\n\t\t\t// Guard/group\n\t\t\tenableGuard,\n\t\t\tdisableGuard,\n\t\t\ttoggleGuard,\n\t\t\tguardIsEnabled,\n\t\t\t// Storage\n\t\t\tenableForStorage,\n\t\t\tdisableForStorage,\n\t\t\ttoggleForStorage,\n\t\t};\n\t};\n\n\treturn {\n\t\tuseSetupGdprEffect,\n\t\tuseAttachGdprListenersEffect,\n\n\t\tuseGdprSavior,\n\t\tuseGdprManager,\n\t\tuseGdprComputed,\n\n\t\tuseGdprGuardEnabledState,\n\t\tuseGdprGuard,\n\t\tuseGdpr,\n\t};\n};\n"],"names":["createGlobalStore","initialStoreFactory","storeHolder","store","listeners","Set","get","set","updater","forEach","listener","setGlobalStore","nextStore","useLocalStore","localStore","setLocalStore","useState","useEffect","add","delete","ManagerWrapper","constructor","_manager","_globalStoreHolder","this","manager","materializedState","triggerUpdate","update","generateRawManager","bannerWasShown","events","closeBanner","resetAndShowBanner","json","toString","JSON","stringify","disable","target","wrap","enable","toggle","disableForStorage","storageType","enableForStorage","toggleForStorage","isEnabled","name","hasGroup","groupName","hasGuard","guardName","getGroup","getGuard","raw","hotswap","newManager","method","args","guard","SaviorWrapper","GdprSaviorAdapter","savior","managerWrapper","super","updateSharedManager","check","exists","shouldUpdate","restore","restoreOrCreate","factory","decorate","createGdprGuardHooks","managerFactory","dummyManager","GdprManager","create","globalStoreHolder","useGlobalStore","_extends","useUnderlyingManager","saviorWrapper","useGdprManager","useGdprComputed","deps","globalStore","useMemo","useSetupGdprEffect","onError","wrappingManager","underlyingManager","setUnderlyingManager","lastAutoClose","useRef","useEffectOnSecondRender","fn","didMount","current","useCallback","e","useAttachGdprListenersEffect","callback","useGdprSavior","useGdprGuardEnabledState","useBannerStatus","_managerWrapper$getGu","_managerWrapper$getGu2","enabled","useGdprGuard","_manager$getGuard","enableGuard","disableGuard","toggleGuard","useDebugValue","useGdpr","wrapper","enableManager","disableManager","toggleManager","guardIsEnabled","storage","closeGdprBanner"],"mappings":"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"}