import {useState, useEffect} from 'react'; export function useToggle(initVal){ const [val, setVal] = useState(initVal); return [val, () => setVal(!val)]; } function useTransformState(initVal, transform, callback, validate){ const [val, setVal] = useState(initVal); function set(v0){ let v = transform(v0); if(!validate || validate(v, v0)){ setVal(v); !callback || callback(v); } } return [val, set]; } export function useDefaultState(initVal, transform, callback, validate){ let def = (v) => (typeof v === 'undefined') ? initVal : v; let newTransform = transform ? (v) => transform(def(v)) : def; return useTransformState(initVal, newTransform, callback, validate); } // if v has a target.value, like an onChange event object, it extracts the value, otherwise passes v unchanged function checkInput(v){ return (v && v.target && typeof v.target.value !== 'undefined') ? v.target.value : v; } export function useInput(initVal, transform: any = false, callback: any = false, validate: any = false){ let newTransform = transform ? (v) => transform(checkInput(v)) : checkInput; return useDefaultState(initVal, newTransform, callback, validate); } export function useNumberInput(initVal, callback: any = false, validate: any = false){ return useInput(initVal, (e) => { switch(typeof e){ case 'string': return e.length?parseInt(e):0; case 'number': return e; default: return 0; } return }, callback, validate); } export function useSubmit(submitFn){ const [submitting, setSubmitting] = useState(false); useEffect(() => { if(submitting){ submitFn(); setSubmitting(false); } }); return (e) => { e.preventDefault(); setSubmitting(true); } } //callbackFns can be a single callback or an array of them export function useSubmitPromise(promiseFn, callbackFns){ if(!Array.isArray(callbackFns)){ callbackFns = [callbackFns]; } const [submitting, setSubmitting] = useState(false); useEffect(() => { if(submitting){ let promise = promiseFn(); for(let i=0; i { alert(err); }) .finally(() => { setSubmitting(false); }); } }); return (e) => { e.preventDefault(); setSubmitting(true); } }