{"version":3,"file":"use-validated-state.cjs","names":[],"sources":["../../src/use-validated-state/use-validated-state.ts"],"sourcesContent":["import { useState } from 'react';\n\nexport interface UseValidatedStateValue<T> {\n  /** Current value */\n  value: T;\n\n  /** Last valid value */\n  lastValidValue: T | undefined;\n\n  /** True if the current value is valid, false otherwise */\n  valid: boolean;\n}\n\nexport type UseValidatedStateReturnValue<T> = [\n  /** Current value */\n  UseValidatedStateValue<T>,\n  /** Handler to update the state, passes `value` and `payload` to `onChange` */\n  (value: T) => void,\n];\n\nexport function useValidatedState<T>(\n  initialValue: T,\n  validate: (value: T) => boolean,\n  initialValidationState?: boolean\n): UseValidatedStateReturnValue<T> {\n  const [value, setValue] = useState<T>(initialValue);\n  const [lastValidValue, setLastValidValue] = useState<T | undefined>(\n    validate(initialValue) ? initialValue : undefined\n  );\n  const [valid, setValid] = useState<boolean>(\n    typeof initialValidationState === 'boolean' ? initialValidationState : validate(initialValue)\n  );\n\n  const onChange = (val: T) => {\n    if (validate(val)) {\n      setLastValidValue(val);\n      setValid(true);\n    } else {\n      setValid(false);\n    }\n\n    setValue(val);\n  };\n\n  return [{ value, lastValidValue, valid }, onChange] as const;\n}\n\nexport namespace useValidatedState {\n  export type ReturnValue<T> = UseValidatedStateReturnValue<T>;\n}\n"],"mappings":";;;AAoBA,SAAgB,kBACd,cACA,UACA,wBACiC;CACjC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAwB,aAAa;CACnD,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,UACrB,SAAS,aAAa,GAAG,eAAe,KAAA,EACzC;CACD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UACZ,OAAO,2BAA2B,YAAY,yBAAyB,SAAS,aAAa,CAC9F;CAED,MAAM,YAAY,QAAW;AAC3B,MAAI,SAAS,IAAI,EAAE;AACjB,qBAAkB,IAAI;AACtB,YAAS,KAAK;QAEd,UAAS,MAAM;AAGjB,WAAS,IAAI;;AAGf,QAAO,CAAC;EAAE;EAAO;EAAgB;EAAO,EAAE,SAAS"}