UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

93 lines (92 loc) 2.9 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"; 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 React.createElement(Context.Provider, { value: value }, localProps.children); } function mergeContextWithProps(nestedContext, localProps) { const { value, ...rest } = localProps; const props = { ...value, ...rest }; const mergedContext = { ...nestedContext, ...props }; const nestedTranslations = nestedContext?.translations || nestedContext?.locales; const localTranslations = props.translations || props.locales; if (nestedTranslations && localTranslations) { const mergedTranslations = mergeTranslations(nestedTranslations, localTranslations); mergedContext.translations = mergedTranslations; if (mergedContext.locales || props.locales || nestedContext.locales) { mergedContext.locales = mergedTranslations; } } if (nestedContext?.formElement && props.formElement) { mergedContext.formElement = { ...nestedContext.formElement, ...props.formElement }; mergedContext.formElement = prepareFormElementContext(mergedContext.formElement); } if (nestedContext?.FormRow && props.FormRow) { mergedContext.FormRow = { ...nestedContext.FormRow, ...props.FormRow }; mergedContext.FormRow = prepareFormElementContext(mergedContext.FormRow); } return mergedContext; } //# sourceMappingURL=Provider.js.map