UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

61 lines (60 loc) 1.9 kB
"use client"; import { useCallback, useContext, useEffect, useReducer, useState } from 'react'; import DataContext from "../../DataContext/Context.js"; import WizardContext from "../../Wizard/Context/index.js"; import IsolationContext from "./IsolationContext.js"; import { createDataReference } from "./IsolationDataReference.js"; import { structuredClone } from "../../../../shared/helpers/structuredClone.js"; export default function useDataContextSnapshot({ enabled } = {}) { const [, forceUpdate] = useReducer(() => ({}), {}); const { internalDataRef, setData } = useContext(DataContext); const isolationContext = useContext(IsolationContext); const hasWizard = Boolean(useContext(WizardContext)); const [dataReferenceFallback] = useState(() => { if (enabled && !isolationContext?.dataReference) { return createDataReference(); } }); const { dataReference = dataReferenceFallback, setIsolatedData } = isolationContext || {}; const { snapshotRef, eventsRef, update, refresh, cleanup } = dataReference || {}; const updateHandler = useCallback((data = null) => { update(data || structuredClone(internalDataRef?.current)); forceUpdate(); }, [internalDataRef, update]); useEffect(() => { if (enabled && eventsRef) { eventsRef.current.push(updateHandler); refresh({ deferred: hasWizard }); } return () => cleanup?.(updateHandler); }, [cleanup, enabled, eventsRef, hasWizard, refresh, updateHandler]); const handleReset = useCallback(() => { if (snapshotRef) { const data = structuredClone(snapshotRef.current); setIsolatedData(data); setData(data); updateHandler(data); } }, [setData, setIsolatedData, snapshotRef, updateHandler]); return { handleReset, snapshotRef }; } //# sourceMappingURL=useDataContextSnapshot.js.map