reakit
Version:
Toolkit for building accessible rich web apps with React
318 lines (284 loc) • 10.4 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var _rollupPluginBabelHelpers = require('../_rollupPluginBabelHelpers-8f9a8751.js');
var React = require('react');
var useLiveRef = require('reakit-utils/useLiveRef');
var useSealedState = require('reakit-utils/useSealedState');
var useUpdateEffect = require('reakit-utils/useUpdateEffect');
require('../Id/IdProvider.js');
var Id_IdState = require('../Id/IdState.js');
var isEmpty = require('reakit-utils/isEmpty');
var Form_utils_getIn = require('./utils/getIn.js');
var isPromise = require('reakit-utils/isPromise');
var isPlainObject = require('reakit-utils/isPlainObject');
var isObject = require('reakit-utils/isObject');
var Form_utils_setAllIn = require('./utils/setAllIn.js');
require('reakit-utils/toArray');
require('reakit-utils/isInteger');
var Form_utils_setIn = require('./utils/setIn.js');
function filterAllEmpty(object) {
if (Array.isArray(object)) {
return object.filter(function (value) {
if (isPlainObject.isPlainObject(value) || Array.isArray(value)) {
return filterAllEmpty(value);
}
return true;
});
}
var result = {};
var keys = Object.keys(object);
for (var _i = 0, _keys = keys; _i < _keys.length; _i++) {
var key = _keys[_i];
var k = key;
var value = object[k];
result[k] = isPlainObject.isPlainObject(value) || Array.isArray(value) ? filterAllEmpty(value) : object[k];
}
return result;
}
function hasMessages(errors) {
return isObject.isObject(errors) && !isEmpty.isEmpty(errors);
}
function getMessages(stateMessages, actionMessages) {
return !isEmpty.isEmpty(actionMessages) ? actionMessages : isEmpty.isEmpty(stateMessages) ? stateMessages : {};
}
function reducer(state, action) {
switch (action.type) {
case "reset":
{
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
values: state.initialValues,
touched: {},
errors: {},
messages: {},
valid: true,
validating: false,
submitting: false,
submitFailed: 0,
submitSucceed: 0
});
}
case "startValidate":
{
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
validating: true
});
}
case "endValidate":
{
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
validating: false,
errors: getMessages(state.errors, action.errors),
messages: getMessages(state.messages, action.messages),
valid: !hasMessages(action.errors)
});
}
case "startSubmit":
{
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
// @ts-ignore TS bug
touched: Form_utils_setAllIn.unstable_setAllIn(state.values, true),
submitting: true
});
}
case "endSubmit":
{
var valid = !hasMessages(action.errors);
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
valid: valid,
submitting: false,
errors: getMessages(state.errors, action.errors),
messages: getMessages(state.messages, action.messages),
submitSucceed: valid ? state.submitSucceed + 1 : state.submitSucceed,
submitFailed: valid ? state.submitFailed : state.submitFailed + 1
});
}
case "update":
{
var _name = action.name,
_value = action.value;
var nextValue = typeof _value === "function" ? _value(Form_utils_getIn.unstable_getIn(state.values, _name)) : _value;
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
values: Form_utils_setIn.unstable_setIn(state.values, _name, nextValue != null ? nextValue : "")
});
}
case "blur":
{
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
touched: Form_utils_setIn.unstable_setIn(state.touched, action.name, true)
});
}
case "push":
{
var array = Form_utils_getIn.unstable_getIn(state.values, action.name, []);
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
values: Form_utils_setIn.unstable_setIn(state.values, action.name, [].concat(array, [action.value]))
});
}
case "remove":
{
var _array = Form_utils_getIn.unstable_getIn(state.values, action.name, []).slice();
delete _array[action.index];
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, state), {}, {
values: Form_utils_setIn.unstable_setIn(state.values, action.name, _array)
});
}
default:
{
throw new Error();
}
}
}
function unstable_useFormState(initialState) {
if (initialState === void 0) {
initialState = {};
}
var _useSealedState = useSealedState.useSealedState(initialState),
_useSealedState$value = _useSealedState.values,
initialValues = _useSealedState$value === void 0 ? {} : _useSealedState$value,
_useSealedState$valid = _useSealedState.validateOnBlur,
validateOnBlur = _useSealedState$valid === void 0 ? true : _useSealedState$valid,
_useSealedState$valid2 = _useSealedState.validateOnChange,
validateOnChange = _useSealedState$valid2 === void 0 ? true : _useSealedState$valid2,
_useSealedState$reset = _useSealedState.resetOnSubmitSucceed,
resetOnSubmitSucceed = _useSealedState$reset === void 0 ? false : _useSealedState$reset,
_useSealedState$reset2 = _useSealedState.resetOnUnmount,
resetOnUnmount = _useSealedState$reset2 === void 0 ? true : _useSealedState$reset2,
onValidate = _useSealedState.onValidate,
onSubmit = _useSealedState.onSubmit,
sealed = _rollupPluginBabelHelpers._objectWithoutPropertiesLoose(_useSealedState, ["values", "validateOnBlur", "validateOnChange", "resetOnSubmitSucceed", "resetOnUnmount", "onValidate", "onSubmit"]);
var onValidateRef = useLiveRef.useLiveRef(typeof initialState !== "function" ? initialState.onValidate : onValidate);
var onSubmitRef = useLiveRef.useLiveRef(typeof initialState !== "function" ? initialState.onSubmit : onSubmit);
var id = Id_IdState.unstable_useIdState(sealed);
var _React$useReducer = React.useReducer(reducer, {
initialValues: initialValues,
values: initialValues,
touched: {},
errors: {},
messages: {},
valid: true,
validating: false,
submitting: false,
submitFailed: 0,
submitSucceed: 0
}),
_React$useReducer$ = _React$useReducer[0],
_ = _React$useReducer$.initialValues,
state = _rollupPluginBabelHelpers._objectWithoutPropertiesLoose(_React$useReducer$, ["initialValues"]),
dispatch = _React$useReducer[1];
var validate = React.useCallback(function (vals) {
if (vals === void 0) {
vals = state.values;
}
return new Promise(function (resolve) {
if (onValidateRef.current) {
var response = onValidateRef.current(vals);
if (isPromise.isPromise(response)) {
dispatch({
type: "startValidate"
});
}
resolve(Promise.resolve(response).then(function (messages) {
dispatch({
type: "endValidate",
messages: messages
});
return messages;
}));
} else {
resolve(undefined);
}
}).catch(function (errors) {
dispatch({
type: "endValidate",
errors: errors
});
throw errors;
});
}, [state.values]);
useUpdateEffect.useUpdateEffect(function () {
if (validateOnChange) {
validate().catch(function () {});
}
}, [validate, validateOnChange]);
React.useEffect(function () {
if (resetOnUnmount) {
return function () {
dispatch({
type: "reset"
});
};
}
return undefined;
}, [resetOnUnmount]);
return _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, id), state), {}, {
values: state.values,
validate: validate,
reset: React.useCallback(function () {
return dispatch({
type: "reset"
});
}, []),
submit: React.useCallback(function () {
dispatch({
type: "startSubmit"
});
return validate().then(function (validateMessages) {
if (onSubmitRef.current) {
return Promise.resolve(onSubmitRef.current(filterAllEmpty(state.values))).then(function (submitMessages) {
var messages = _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, validateMessages), submitMessages);
dispatch({
type: "endSubmit",
messages: messages
});
});
}
return dispatch({
type: "endSubmit",
messages: validateMessages
});
}).then(function () {
if (resetOnSubmitSucceed) {
dispatch({
type: "reset"
});
}
}).catch(function (errors) {
dispatch({
type: "endSubmit",
errors: errors
});
});
}, [validate]),
update: React.useCallback(function (name, value) {
return dispatch({
type: "update",
name: name,
value: value
});
}, []),
blur: React.useCallback(function (name) {
dispatch({
type: "blur",
name: name
});
if (validateOnBlur) {
validate().catch(function () {});
}
}, [validate]),
push: React.useCallback(function (name, value) {
return dispatch({
type: "push",
name: name,
value: value
});
}, []),
remove: React.useCallback(function (name, index) {
return dispatch({
type: "remove",
name: name,
index: index
});
}, [])
});
}
exports.unstable_useFormState = unstable_useFormState;