{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/hooks/useInputState/index.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useState } from 'react';\nimport { usePreservedCallback } from '../usePreservedCallback';\nimport { noop } from '@modern-kit/utils';\n\ninterface UseInputStateOptions {\n  validate?: (value: string) => string | null | undefined;\n}\n\ninterface UseInputStateReturn {\n  value: string;\n  error: string | null;\n  onChange: (e: ChangeEvent<HTMLInputElement>) => void;\n  resetError: () => void;\n  resetValue: () => void;\n  reset: () => void;\n}\n\n/**\n * @description input 필드의 상태를 관리하는 커스텀 훅\n *\n * @param {string | undefined} initialValue - 초기값 (선택사항)\n * @param {UseInputStateOptions} options - 옵션\n * @param {(value: string) => string | null | undefined} options.validate - 유효성 검증 함수, 문자열을 반환하면 error 상태의 값으로 처리됩니다.\n * @returns {UseInputStateReturn} 입력 상태와 관련된 객체\n * - `value`: 현재 입력값\n * - `error`: 값 검증 오류 메시지\n * - `onChange`: 입력값 변경 핸들러\n * - `resetError`: 오류 메시지 초기화 함수\n * - `resetValue`: 입력값 초기화 함수\n * - `reset`: 입력값과 오류 메시지를 모두 초기화하는 함수\n *\n * @example\n * ```tsx\n * const { value, onChange, reset } = useInputState('');\n * <input type=\"text\" onChange={onChange} value={value} />\n * ```\n *\n * @example\n * ```tsx\n * const { value, onChange, reset } = useInputState('', {\n *   validate: (value) => value.length > 10 ? 'error' : undefined\n * });\n * <input type=\"text\" onChange={onChange} value={value} />\n * ```\n */\nexport function useInputState(\n  initialValue: string = '',\n  options: UseInputStateOptions = {}\n): UseInputStateReturn {\n  const { validate } = options;\n\n  const [value, setValue] = useState<string>(initialValue);\n  const [error, setError] = useState<string | null>(null);\n\n  const preservedValidate = usePreservedCallback(validate ?? noop);\n\n  const onChange = useCallback(\n    (e: ChangeEvent<HTMLInputElement>) => {\n      const { value } = e.target;\n\n      const validationError = preservedValidate(value);\n      if (validationError) {\n        setError(validationError);\n      } else {\n        setError(null);\n      }\n      setValue(value);\n    },\n    [preservedValidate]\n  );\n\n  const resetError = useCallback(() => {\n    setError(null);\n  }, []);\n\n  const resetValue = useCallback(() => {\n    setValue(initialValue);\n  }, [initialValue]);\n\n  const reset = useCallback(() => {\n    resetValue();\n    resetError();\n  }, [resetValue, resetError]);\n\n  return { value, error, onChange, resetError, resetValue, reset };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,cACd,eAAuB,IACvB,UAAgC,EAAE,EACb;CACrB,MAAM,EAAE,aAAa;CAErB,MAAM,CAAC,OAAO,YAAY,SAAiB,aAAa;CACxD,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CAEvD,MAAM,oBAAoB,qBAAqB,YAAY,KAAK;CAEhE,MAAM,WAAW,aACd,MAAqC;EACpC,MAAM,EAAE,UAAU,EAAE;EAEpB,MAAM,kBAAkB,kBAAkB,MAAM;EAChD,IAAI,iBACF,SAAS,gBAAgB;OAEzB,SAAS,KAAK;EAEhB,SAAS,MAAM;IAEjB,CAAC,kBAAkB,CACpB;CAED,MAAM,aAAa,kBAAkB;EACnC,SAAS,KAAK;IACb,EAAE,CAAC;CAEN,MAAM,aAAa,kBAAkB;EACnC,SAAS,aAAa;IACrB,CAAC,aAAa,CAAC;CAOlB,OAAO;EAAE;EAAO;EAAO;EAAU;EAAY;EAAY,OAL3C,kBAAkB;GAC9B,YAAY;GACZ,YAAY;KACX,CAAC,YAAY,WAAW,CAEmC;EAAE"}