import { useState } from 'react' import { useDebounceFn } from 'ahooks' import type { DebouncedFunc } from 'lodash-es' import { ValidatedStatus } from './declarations' import type { ValidateCallback, ValidateValue, ValidatedStatusState } from './declarations' export const useValidate: (value: ValidateValue) => [DebouncedFunc<(validateCallback: ValidateCallback) => Promise>, boolean, ValidatedStatusState] = (value) => { const [validating, setValidating] = useState(false) const [validatedStatus, setValidatedStatus] = useState({}) const { run } = useDebounceFn(async (validateCallback: ValidateCallback) => { if (!validateCallback.before(value)) { setValidating(false) setValidatedStatus({}) return } setValidating(true) if (validateCallback.run) { const res = await validateCallback?.run(value) setValidatedStatus( res.status === 'success' ? { status: ValidatedStatus.Success } : { status: ValidatedStatus.Error, message: res.message }) setValidating(false) } }, { wait: 1000 }) return [run, validating, validatedStatus] }