@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
68 lines (67 loc) • 2.73 kB
JavaScript
"use client";
import { useCallback, useContext, useMemo } from 'react';
import { createReferenceKey, useSharedState } from "../../../../shared/helpers/useSharedState.js";
import DataContext from "../../DataContext/Context.js";
export default function useValidation(id = undefined) {
const {
data: sharedDataContext
} = useSharedState(id ? createReferenceKey(id, 'data-context') : undefined);
const {
data
} = useSharedState(id ? createReferenceKey(id, 'attachments') : undefined);
const fallback = useCallback(() => false, []);
const context = useContext(DataContext);
const sharedContext = id ? sharedDataContext : undefined;
const hasErrors = sharedContext?.hasErrors || data?.hasErrors || !id && context?.hasErrors || fallback;
const hasFieldError = sharedContext?.hasFieldError || data?.hasFieldError || !id && context?.hasFieldError || fallback;
const setSubmitState = sharedContext?.setSubmitState || data?.setSubmitState || !id && context?.setSubmitState || fallback;
const setFormError = useCallback(error => {
setSubmitState?.({
error
});
}, [setSubmitState]);
const {
getFieldConnections,
setFieldStatusCache
} = useConnections(id);
const setFieldStatus = useCallback((path, status) => {
setFieldStatusCache(path, status);
const connections = getFieldConnections();
connections?.[path]?.setEventResult?.(status);
}, [getFieldConnections, setFieldStatusCache]);
return useMemo(() => ({
hasErrors,
hasFieldError,
setFormError,
setFieldStatus
}), [hasErrors, hasFieldError, setFormError, setFieldStatus]);
}
function useConnections(id = undefined) {
const {
data: sharedDataContext
} = useSharedState(id ? createReferenceKey(id, 'data-context') : undefined);
const {
get
} = useSharedState(id ? createReferenceKey(id, 'attachments') : undefined);
const dataContext = useContext(DataContext);
const {
fieldConnectionsRef
} = dataContext || {};
const sharedFieldConnectionsRef = sharedDataContext?.fieldConnectionsRef;
const getFieldConnections = useCallback(() => {
const attachments = get();
const connections = sharedFieldConnectionsRef || attachments?.fieldConnectionsRef || !id && fieldConnectionsRef;
return connections?.current;
}, [fieldConnectionsRef, get, id, sharedFieldConnectionsRef]);
const setFieldStatusCache = useCallback((path, status) => {
const attachments = get();
if (attachments?.fieldStatusRef?.current) {
attachments.fieldStatusRef.current[path] = status;
}
}, [get]);
return useMemo(() => ({
getFieldConnections,
setFieldStatusCache
}), [getFieldConnections, setFieldStatusCache]);
}
//# sourceMappingURL=useValidation.js.map