UNPKG

3.1 kBJavaScriptView Raw
1import{startsWith,camelCase,setWith,clone,get}from"lodash";const PREFIX="@FORM";function isForm(e={}){const{key:t,type:i}=e;return t&&startsWith(i,PREFIX)}const RESET="RESET",CHANGE_FIELD="CHANGE_FIELD",CHANGE_MUTIL_FIELDS="CHANGE_MUTIL_FIELDS",REGISTER_FIELD="REGISTER_FIELD",REGISTER_MUTIL_FIELDS="REGISTER_MUTIL_FIELDS",Types={reset:`${PREFIX}/RESET`,registerField:`${PREFIX}/REGISTER_FIELD`,registerMutilFields:`${PREFIX}/REGISTER_MUTIL_FIELDS`,changeField:`${PREFIX}/CHANGE_FIELD`,changeMutilFields:`${PREFIX}/CHANGE_MUTIL_FIELDS`},Forms=new Map;function registerForm(e){Forms.set(e.key,e)}const camelCaseKey=e=>e.split(".").map(e=>camelCase(e)).join("."),initFieldState={name:void 0,dirty:!1,touched:!1,value:void 0,validating:void 0,errors:void 0},initState={fields:{},meta:{}};function registerField(e={},t,i){if(get(e,t))return e;const r={...initFieldState,name:t,value:i};return{...e,[t]:r}}function changeField(e={},t={}){const{name:i,...r}=t,s={...e[i]||initFieldState,name:i,...r};return{...e,[i]:s}}function r(e=initState,t){const{payload:i={},meta:r={},type:s}=t;if(s===Types.registerField){const{name:t,initialValue:s}=i;if(!t)return e;const n=registerField(e.fields,t,s);return{...e,fields:n,meta:r}}if(s===Types.registerMutilFields){const{fields:t=[]}=i,s=t.reduce((e,t)=>{const{name:i,initialValue:r}=t;return i?registerField(e,i,r):e},e.fields);return{...e,fields:s,meta:r}}if(s===Types.changeField){const{name:t}=i;if(!t)return e;const s=changeField(e.fields,i);return{...e,fields:s,meta:r}}if(s===Types.changeMutilFields){const{fields:t=[]}=i,s=t.reduce((e,t)=>{const{name:i}=t;return i?changeField(e,t):e},e.fields);return{...e,fields:s,meta:r}}if(s===Types.reset){const{initialValues:t={}}=i,s={};for(const i in e.fields)s[i]={...initFieldState,value:t[i]};return{...e,fields:s,meta:r}}return e}function reducer(e={},t){if(!isForm(t))return e;const{key:i}=t;if(!i)return e;const s=Forms.get(i);return s?setWith({...e},s.reduxPath,r(get(e,s.reduxPath),t),clone):e}const makeStateSelector=e=>t=>get(t.forms,e)||initState,createFormSelector=(e,t)=>{const i=t||camelCaseKey(e);return makeStateSelector(i)};class Form{constructor(e,t){this._key=e,t||(this._reduxPath=camelCaseKey(e))}get key(){return this._key}get reduxPath(){return this._reduxPath}get actions(){return{reset:(e={},t={})=>({type:Types.reset,key:this.key,payload:{initialValues:e},meta:t}),registerField:(e,t,i={})=>({type:Types.registerField,key:this.key,payload:{name:e,initialValue:t},meta:i}),registerMutilFields:(e=[],t={})=>({type:Types.registerMutilFields,key:this.key,payload:{fields:e},meta:t}),changeField:(e,t={},i={})=>({type:Types.changeField,key:this.key,payload:{...t,name:e},meta:i}),changeMutilFields:(e=[],t={})=>({type:Types.changeMutilFields,key:this.key,payload:{fields:e},meta:t})}}}function createFormActions(e,t={}){if(!e)throw Error("Form need a key");if(Forms.has(e))return Forms.get(e).actions;const i=new Form(e,t.reduxPath);return registerForm(i),i.actions}export{createFormActions,reducer as formReducer,createFormSelector,Types as FormTypes,isForm};
2//# sourceMappingURL=index.esm.js.map