UNPKG

use-state-validate

Version:
1 lines 2.01 kB
import{useEffect,useRef,useState}from"react";const useStateValidate=(u,l)=>{const[e,r]=useState(deriveFieldObject(u,u,l)),t=useRef(e),a=useRef(!1);let i=useRef();const d=()=>clearTimeout(i.current),c=e=>{t.current={...t.current,...e},r(t.current)},n=()=>{d(),c(deriveFieldObject(u,u,l))},s=e=>{d(),c({cue:e,cueInvalid:e&&!t.current.valid})};return useEffect(()=>{a.current&&c(deriveFieldObject(u,e.value,l,t.current.cue))},l.deps||[]),useEffect(()=>(a.current&&n(),a.current=!0,d),[u]),{...e,restore:n,setCue:s,setValue:e=>{d();let r=t.current["cue"];0===l.cueDelay?r=!0:l.cueDelay&&(r=!1,i.current=setTimeout(()=>{s(!0)},l.cueDelay)),c(deriveFieldObject(u,e,l,r))}}},deriveFieldObject=(e,r,{cueDelay:u,deps:l,label:t,required:a,rules:i,...d},c=!1)=>{var i=validate(r,{label:t,required:a,rules:i}),n=0===i.length;return{changed:e!==r,cue:c,cueInvalid:c&&!n,errors:i,label:t||"",required:!!a,valid:n,value:r,...d}},validate=(u,r)=>{const l=r.label||"Field";return[[e=>!r.required||0===e||!!e,"boolean"!=typeof r.required&&r.required||l+" is required"],...r.rules||[]].map(([e,r])=>!e(u)&&(r||l+" is invalid")).filter(Boolean)},fieldBagChanged=e=>Object.values(e).every(({changed:e})=>e),fieldBagValid=e=>Object.values(e).every(({valid:e})=>e),fieldBagReduceToValues=e=>Object.entries(e).reduce((e,[r,u])=>(e[r]=u.value,e),{}),fieldBagTraverse=(e,r)=>Object.values(e).forEach(r),ruleEmail=()=>e=>/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(e),ruleEnum=r=>e=>-1<r.indexOf(e),ruleLength=({min:r,max:u})=>e=>(r||0)<=e.length&&e.length<=(u||Number.MAX_SAFE_INTEGER),ruleMatch=r=>e=>r.test(e),ruleNumeric=()=>e=>!isNaN(e),rulePhone=()=>ruleMatch(/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/),ruleZip=()=>ruleMatch(/^[0-9]{5}(?:-[0-9]{4})?$/),defineConfig=e=>e;export default useStateValidate;export{useStateValidate,fieldBagChanged,fieldBagValid,fieldBagReduceToValues,fieldBagTraverse,ruleEmail,ruleEnum,ruleLength,ruleMatch,ruleNumeric,rulePhone,ruleZip,defineConfig};