12345678910111213141516171819202122232425262728293031 |
- 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<void>>, boolean, ValidatedStatusState] = (value) => {
- const [validating, setValidating] = useState(false)
- const [validatedStatus, setValidatedStatus] = useState<ValidatedStatusState>({})
- 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]
- }
|