effector-form-solid
Version:
Effector Form by 42-px for Solidjs
2 lines (1 loc) • 6.72 kB
JavaScript
import{combine as e,createStore as r,createEvent as t,sample as i,merge as o}from"effector";import{useUnit as n}from"effector-solid";const s={store:function({init:e,domain:t,existing:i},o){return i||(t?t.createStore(e,o):r(e,o))},event:function({domain:e,existing:r}){return r||(e?e.createEvent():t())}};function l(r,t,i){var o,n,l,u,a,d,c,v,f,m,h,$;const g="function"==typeof t.init?t.init():t.init,x=s.store({domain:i,existing:null===(o=t.units)||void 0===o?void 0:o.$value,init:g},{sid:`${r}-$value`}),p=s.store({domain:i,existing:null===(n=t.units)||void 0===n?void 0:n.$errors,init:[]},{sid:`${r}-$errors`}),V=p.map((e=>e[0]?e[0]:null)),E=s.store({domain:i,existing:null===(l=t.units)||void 0===l?void 0:l.$initValue,init:g},{sid:`${r}-$initValue`}),y=s.store({domain:i,existing:null===(u=t.units)||void 0===u?void 0:u.$isTouched,init:!1},{sid:`${r}-$touched`}),T=e(x,E,((e,r)=>e!==r)),b=s.event({domain:i,existing:null===(a=t.units)||void 0===a?void 0:a.onChange}),F=s.event({domain:i,existing:null===(d=t.units)||void 0===d?void 0:d.onBlur}),O=s.event({domain:i,existing:null===(c=t.units)||void 0===c?void 0:c.changed}),k=s.event({domain:i,existing:null===(v=t.units)||void 0===v?void 0:v.addError}),S=s.event({domain:i,existing:null===(f=t.units)||void 0===f?void 0:f.validate}),w=s.event({domain:i,existing:null===(m=t.units)||void 0===m?void 0:m.resetErrors}),C=s.event({domain:i,existing:null===(h=t.units)||void 0===h?void 0:h.resetValue}),D=s.event({domain:i,existing:null===($=t.units)||void 0===$?void 0:$.reset}),B=V.map((e=>null===e)),P=V.map((e=>(null==e?void 0:e.errorText)||"")),I=e({value:x,errors:p,firstError:V,isValid:B,isDirty:T,isTouched:y}),j={value:x,initValue:E,isValid:B,isDirty:T,touched:y,errors:p,firstError:V,errorText:P,onChange:b,onBlur:F,addError:k,validate:S,reset:D,resetErrors:w,resetValue:C};return{changed:O,name:r,$initValue:E,$value:x,$errors:p,$firstError:V,$errorText:P,$isValid:B,$isDirty:T,$isTouched:y,$touched:y,$field:I,onChange:b,onBlur:F,addError:k,validate:S,set:b,reset:D,resetErrors:w,resetValue:C,filter:t.filter,"@@unitShape":()=>j}}function u(t){const{form:n,field:s,fieldConfig:l}=t,u=l.rules||[],a=n.validateOn||["submit"],d=l.validateOn||[],{$value:c,$errors:v,onBlur:f,changed:m,addError:h,validate:$,resetErrors:g,resetValue:x,reset:p}=s,V="function"==typeof u?r([],{sid:`${s.name}-$rulesSources`}):e(u.map((({source:e},t)=>{const i=`${s.name}-$rulesSources-${t}`;return e||r(null,{sid:i})}))),E=function(e){return(r,t,i)=>{const o=[],n="function"==typeof e?e(r,t):e;for(let e=0;e<n.length;e++){const s=n[e],l=i?i[e]:null,u=s.validator(r,t,l);"boolean"!=typeof u||u||o.push({rule:s.name,errorText:s.errorText,value:r}),"object"!=typeof u||u.isValid||o.push({rule:s.name,errorText:u.errorText,value:r})}return o}}(u),y=[...a,...d],T=[];if(y.includes("submit")){const r=i({source:e({fieldValue:c,form:n.$values,rulesSources:V}),clock:n.submit});T.push(r)}y.includes("blur")&&T.push(i({source:e({fieldValue:c,form:n.$values,rulesSources:V}),clock:f})),y.includes("change")&&T.push(i({source:e({fieldValue:c,form:n.$values,rulesSources:V}),clock:o([m,x,n.resetValues])})),T.push(i({source:e({fieldValue:c,form:n.$values,rulesSources:V}),clock:$})),T.push(i({source:e({fieldValue:c,form:n.$values,rulesSources:V}),clock:n.validate}));const b=i({source:c,clock:h,fn:(e,{rule:r,errorText:t})=>({rule:r,value:e,errorText:t})}),F=i({source:c,clock:n.addErrors,fn:(e,r)=>({value:e,newErrors:r})});v.on(T,((e,{form:r,fieldValue:t,rulesSources:i})=>E(t,r,i))).on(b,((e,r)=>[r,...e])).on(F,((e,{value:r,newErrors:t})=>{const i=[];for(const e of t)e.field===s.name&&i.push({value:r,rule:e.rule,errorText:e.errorText});return[...i,...e]})).reset(g,n.reset,p,n.resetErrors),y.includes("change")||v.reset(m)}function a({field:e,form:r}){const{$value:t,$initValue:n,$touched:s,onChange:l,changed:u,name:a,reset:d,resetValue:c,filter:v}=e,{setForm:f,setInitialForm:m,resetForm:h,resetTouched:$,resetValues:g}=r,x=i({source:n,clock:o([d,c,g,h])});s.on(u,(()=>!0)).reset(d,h,$),i(v?{source:l,filter:v,target:u}:{source:l,filter:()=>!0,target:u}),n.on(m,((e,r)=>r.hasOwnProperty(a)?r[a]:e)),t.on(u,((e,r)=>r)).on([f,m],((e,r)=>r.hasOwnProperty(a)?r[a]:e)).on(x,((e,r)=>r))}function d(r){const{filter:t,domain:o,fields:n,validateOn:d,units:c}=r,v={},f=[],m=[];for(const e in n){if(!n.hasOwnProperty(e))continue;const r=l(e,n[e],o);v[e]=r,f.push(r.$isDirty),m.push(r.$touched)}const h=function(r){const t={};for(const e in r)r.hasOwnProperty(e)&&(t[e]=r[e].$value);return e(t)}(v),$=function(r){const t=[];for(const e in r){if(!r.hasOwnProperty(e))continue;const{$firstError:i}=r[e];t.push(i)}return e(t).map((e=>e.every((e=>null===e))))}(v),g=t?e($,t,((e,r)=>e&&r)):$,x=e(f).map((e=>e.some(Boolean))),p=e(m).map((e=>e.some(Boolean))),V=e({isValid:$,isDirty:x,touched:p}),E=s.event({domain:o,existing:null==c?void 0:c.validate}),y=s.event({domain:o,existing:null==c?void 0:c.submit}),T=s.event({domain:o,existing:null==c?void 0:c.formValidated}),b=s.event({domain:o,existing:null==c?void 0:c.setInitialForm}),F=s.event({domain:o,existing:null==c?void 0:c.setForm}),O=s.event({domain:o,existing:null==c?void 0:c.addErrors}),k=s.event({domain:o,existing:null==c?void 0:c.reset}),S=s.event({domain:o,existing:null==c?void 0:c.resetValues}),w=s.event({domain:o,existing:null==c?void 0:c.resetErrors}),C=s.event({domain:o,existing:null==c?void 0:c.resetTouched}),D=i({source:h,clock:y}),B=i({source:h,clock:E});for(const e in v){if(!v.hasOwnProperty(e))continue;const r=n[e],t=v[e];a({form:{setForm:F,setInitialForm:b,resetForm:k,resetTouched:C,resetValues:S},field:t}),u({form:{$values:h,submit:y,reset:k,addErrors:O,resetValues:S,resetErrors:w,validate:E,validateOn:d},fieldConfig:r,field:t})}i({source:D,filter:g,target:T}),i({source:B,filter:g,target:T});const P={isValid:$,isDirty:x,touched:p,submit:y,reset:k,addErrors:O,validate:E,setForm:F,setInitialForm:b,resetTouched:C,resetValues:S,resetErrors:w,formValidated:T};return{fields:v,$values:h,$eachValid:$,$isValid:$,$isDirty:x,$touched:p,$meta:V,submit:y,validate:E,resetTouched:C,addErrors:O,reset:k,resetValues:S,resetErrors:w,setForm:F,setInitialForm:b,set:F,formValidated:T,"@@unitShape":()=>P}}const c=e=>[Object,Array].includes((e||{}).constructor)&&0===Object.entries(e||{}).length;function v(e,r){const t=Object.keys(e.fields);let i={};return c(r)?t.forEach((r=>{i={...i,[r]:n(e.fields[r])}})):r.forEach((r=>{i={...i,[r]:n(e.fields[r])}})),i}function f(e,r){const t=n(e),i=v(e,r);return{...t,submit:e=>{e.preventDefault(),t.submit()},fields:i}}function m(e,r){const t=n(e.fields[r]);return{...t,onChangeField:e=>{t.onChange(e.target.value)}}}export{d as createForm,f as useForm,m as useFormField,v as useFormSignals};