UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

63 lines (62 loc) 2.09 kB
"use client"; import { useCallback, useContext, useEffect, useReducer, useState } from 'react'; import DataContext from '../../DataContext/Context'; import WizardContext from '../../Wizard/Context'; import IsolationContext from './IsolationContext'; import { createDataReference } from './IsolationDataReference'; import structuredClone from '@ungap/structured-clone'; 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 !== null && isolationContext !== void 0 && 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 === null || internalDataRef === void 0 ? void 0 : internalDataRef.current)); forceUpdate(); }, [internalDataRef, update]); useEffect(() => { if (enabled && eventsRef) { eventsRef.current.push(updateHandler); refresh({ deferred: hasWizard }); } return () => cleanup === null || cleanup === void 0 ? void 0 : cleanup(updateHandler); }, [cleanup, enabled, eventsRef, hasWizard, refresh, updateHandler]); const handleReset = useCallback(() => { window.requestAnimationFrame(() => { if (snapshotRef) { const data = structuredClone(snapshotRef.current); setIsolatedData(data); setData(data); updateHandler(data); } }); }, [setData, setIsolatedData, snapshotRef, updateHandler]); return { handleReset, snapshotRef }; } //# sourceMappingURL=useDataContextSnapshot.js.map