react-bfm
Version:
A basic field / form manager for React using hooks
122 lines (121 loc) • 5.54 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
exports.__esModule = true;
exports.updateFieldStateWithCallback = exports.removeField = exports.initFieldState = exports.getNamespaceState = exports.getFieldState = exports.createSubscribeToNamespace = exports.createSubscribeToField = exports.createGetSnapshotNamespaceState = exports.createGetSnapshotFieldState = void 0;
var _extends4 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _stateDefaults = require("./constants/state-defaults");
var _helpers = require("./helpers");
var stateCreator = function stateCreator() {
var state = {};
var subscribers = {};
var idCounter = 0;
var getFieldState = function getFieldState(namespace, fieldName) {
var _state$namespace;
return (_state$namespace = state[namespace]) == null ? void 0 : _state$namespace[fieldName];
};
var getNamespaceState = function getNamespaceState(namespace) {
return state[namespace];
};
var createGetSnapshotFieldState = function createGetSnapshotFieldState(namespace, fieldName) {
return function () {
return getFieldState(namespace, fieldName);
};
};
var createGetSnapshotNamespaceState = function createGetSnapshotNamespaceState(namespace) {
return function () {
return getNamespaceState(namespace);
};
};
var subscribe = function subscribe(listener, namespace, fieldName) {
if (!subscribers[namespace]) {
subscribers[namespace] = new Map();
}
var id = ++idCounter;
subscribers[namespace].set(id, {
listener: listener,
fieldName: fieldName
});
return function () {
if (subscribers[namespace] && subscribers[namespace].has(id)) {
subscribers[namespace]["delete"](id);
if (subscribers[namespace].size === 0) {
delete subscribers[namespace];
}
}
};
};
var createSubscribeToField = function createSubscribeToField(namespace, fieldName) {
return function (listener) {
return subscribe(listener, namespace, fieldName);
};
};
var createSubscribeToNamespace = function createSubscribeToNamespace(namespace) {
return function (listener) {
return subscribe(listener, namespace);
};
};
var triggerSubscribers = function triggerSubscribers(namespace, _fieldName) {
var namespaceSubscribers = subscribers[namespace];
if (namespaceSubscribers) {
namespaceSubscribers.forEach(function (_ref) {
var listener = _ref.listener,
fieldName = _ref.fieldName;
if (!fieldName) {
listener();
}
if (fieldName === _fieldName) {
listener();
}
});
}
};
var initFieldState = function initFieldState(namespace, fieldName, value, error) {
var _extends2;
state[namespace] = (0, _extends4["default"])({}, state[namespace], (_extends2 = {}, _extends2[fieldName] = (0, _extends4["default"])({}, _stateDefaults.FIELD_STATE_DEFAULT, (0, _helpers.mapFieldValueAndError)(value, error)), _extends2));
triggerSubscribers(namespace, fieldName);
};
var updateFieldStateWithCallback = function updateFieldStateWithCallback(namespace, fieldName, callback) {
var currentFieldState = getFieldState(namespace, fieldName);
if (currentFieldState) {
var update = callback(currentFieldState);
if (update && typeof update === 'object') {
var _extends3;
state[namespace] = (0, _extends4["default"])({}, state[namespace], (_extends3 = {}, _extends3[fieldName] = (0, _extends4["default"])({}, currentFieldState, update), _extends3));
triggerSubscribers(namespace, fieldName);
}
}
};
var removeField = function removeField(namespace, fieldName) {
var _state$namespace2;
if ((_state$namespace2 = state[namespace]) != null && _state$namespace2[fieldName]) {
delete state[namespace][fieldName];
// immutable state
state[namespace] = (0, _extends4["default"])({}, state[namespace]);
if (Object.keys(state[namespace]).length === 0) {
delete state[namespace];
}
triggerSubscribers(namespace, fieldName);
}
};
return {
getFieldState: getFieldState,
getNamespaceState: getNamespaceState,
initFieldState: initFieldState,
removeField: removeField,
createGetSnapshotFieldState: createGetSnapshotFieldState,
createGetSnapshotNamespaceState: createGetSnapshotNamespaceState,
createSubscribeToField: createSubscribeToField,
createSubscribeToNamespace: createSubscribeToNamespace,
updateFieldStateWithCallback: updateFieldStateWithCallback
};
};
var _stateCreator = stateCreator(),
getFieldState = exports.getFieldState = _stateCreator.getFieldState,
getNamespaceState = exports.getNamespaceState = _stateCreator.getNamespaceState,
initFieldState = exports.initFieldState = _stateCreator.initFieldState,
removeField = exports.removeField = _stateCreator.removeField,
createGetSnapshotFieldState = exports.createGetSnapshotFieldState = _stateCreator.createGetSnapshotFieldState,
createGetSnapshotNamespaceState = exports.createGetSnapshotNamespaceState = _stateCreator.createGetSnapshotNamespaceState,
createSubscribeToField = exports.createSubscribeToField = _stateCreator.createSubscribeToField,
createSubscribeToNamespace = exports.createSubscribeToNamespace = _stateCreator.createSubscribeToNamespace,
updateFieldStateWithCallback = exports.updateFieldStateWithCallback = _stateCreator.updateFieldStateWithCallback;