UNPKG

react-bfm

Version:

A basic field / form manager for React using hooks

70 lines 3.36 kB
import { useContext, useMemo, useSyncExternalStore } from 'react'; import { BFMHooksContext } from '../context'; import { validateNamespace } from '../helpers'; import { FIELD_KEY_DIRTY, FIELD_KEY_ERROR, FIELD_KEY_FOCUS, FIELD_KEY_TOUCHED, FIELD_KEY_VALID, FIELD_KEY_VALUE, FIELD_KEY_VALUE_ON_FOCUS } from '../constants/field-keys'; import { NAMESPACE_STATE_DEFAULT } from '../constants/state-defaults'; var getServerSnapshot = function getServerSnapshot() { return undefined; }; export var useNamespaceState = function useNamespaceState(namespace) { if (process.env.NODE_ENV !== 'production') { if (!validateNamespace(namespace)) { throw new Error('Expected string with a minimal length of 1 for `namespace`'); } } var _useContext = useContext(BFMHooksContext), createSubscribeToNamespace = _useContext.createSubscribeToNamespace, createGetSnapshotNamespaceState = _useContext.createGetSnapshotNamespaceState; var subscribe = useMemo(function () { return createSubscribeToNamespace(namespace); }, [createSubscribeToNamespace, namespace]); var getSnapshot = useMemo(function () { return createGetSnapshotNamespaceState(namespace); }, [createGetSnapshotNamespaceState, namespace]); return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); }; export var useNamespaceKeyValues = function useNamespaceKeyValues(namespace, key) { var namespaceState = useNamespaceState(namespace); return namespaceState && Object.entries(namespaceState).reduce(function (values, _ref) { var fieldName = _ref[0], fieldState = _ref[1]; values[fieldName] = fieldState[key]; return values; }, {}); }; export var useNamespaceKeyIsEvery = function useNamespaceKeyIsEvery(namespace, key) { var namespaceState = useNamespaceState(namespace); return namespaceState && Object.values(namespaceState || NAMESPACE_STATE_DEFAULT).every(function (fieldState) { return fieldState[key] || false; }); }; export var useNamespaceKeyIsSome = function useNamespaceKeyIsSome(namespace, key) { var namespaceState = useNamespaceState(namespace); return namespaceState && Object.values(namespaceState || NAMESPACE_STATE_DEFAULT).some(function (fieldState) { return fieldState[key] || false; }); }; /** * Error values reflect the stored field error; falsy errors are normalized when mapped into field state. */ export var useNamespaceErrors = function useNamespaceErrors(namespace) { return useNamespaceKeyValues(namespace, FIELD_KEY_ERROR); }; export var useNamespaceHasFocus = function useNamespaceHasFocus(namespace) { return useNamespaceKeyIsSome(namespace, FIELD_KEY_FOCUS); }; export var useNamespaceIsDirty = function useNamespaceIsDirty(namespace) { return useNamespaceKeyIsSome(namespace, FIELD_KEY_DIRTY); }; export var useNamespaceIsTouched = function useNamespaceIsTouched(namespace) { return useNamespaceKeyIsSome(namespace, FIELD_KEY_TOUCHED); }; export var useNamespaceIsValid = function useNamespaceIsValid(namespace) { return useNamespaceKeyIsEvery(namespace, FIELD_KEY_VALID); }; export var useNamespaceValues = function useNamespaceValues(namespace) { return useNamespaceKeyValues(namespace, FIELD_KEY_VALUE); }; export var useNamespaceValuesOnFocus = function useNamespaceValuesOnFocus(namespace) { return useNamespaceKeyValues(namespace, FIELD_KEY_VALUE_ON_FOCUS); };