UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

85 lines (84 loc) 2.55 kB
"use client"; import React, { useCallback, useContext, useMemo, useState } from 'react'; import Context, { prepareContext } from "./Context.js"; import { prepareFormElementContext } from "./helpers/filterValidProps.js"; import { mergeTranslations } from "./Translation.js"; import { jsx as _jsx } from "react/jsx-runtime"; export default function Provider(localProps) { const nestedContext = useContext(Context); const [localContext, setLocalContext] = useState(null); const updateCurrent = useCallback(props => { setLocalContext({ __context__: props }); }, []); const setCurrentLocale = useCallback(locale => { setLocalContext({ __context__: { locale } }); }, []); const update = useCallback(props => { nestedContext.update?.(props); setLocalContext({ __context__: props }); }, [nestedContext]); const setLocale = useCallback(locale => { update({ locale }); }, [update]); const value = useMemo(() => { const { children, ...rest } = localProps; const preparedContext = { ...prepareContext(mergeContextWithProps(nestedContext, { ...localContext, ...rest })) }; preparedContext.update = update; preparedContext.setLocale = setLocale; preparedContext.updateCurrent = updateCurrent; preparedContext.setCurrentLocale = setCurrentLocale; nestedContext.updateTranslation(preparedContext.locale, preparedContext.translations); return preparedContext; }, [localProps, nestedContext, localContext, update, setLocale, updateCurrent, setCurrentLocale]); return _jsx(Context, { value: value, children: localProps.children }); } function mergeContextWithProps(nestedContext, localProps) { const { value, ...rest } = localProps; const props = { ...value, ...rest }; const mergedContext = { ...nestedContext, ...props }; const nestedTranslations = nestedContext?.translations; const localTranslations = props.translations; if (nestedTranslations && localTranslations) { const mergedTranslations = mergeTranslations(nestedTranslations, localTranslations); mergedContext.translations = mergedTranslations; } if (nestedContext?.formElement && props.formElement) { mergedContext.formElement = { ...nestedContext.formElement, ...props.formElement }; mergedContext.formElement = prepareFormElementContext(mergedContext.formElement); } return mergedContext; } //# sourceMappingURL=Provider.js.map