react-bfm
Version:
A basic field / form manager for React using hooks
70 lines • 3.36 kB
JavaScript
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);
};