UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

66 lines (65 loc) 2.31 kB
"use client"; import "core-js/modules/web.dom-collections.iterator.js"; 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() { let { enabled } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 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(function () { let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 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