useValidateToken.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import type { Dispatch, SetStateAction } from 'react'
  2. import { useCallback, useState } from 'react'
  3. import debounce from 'lodash-es/debounce'
  4. import type { DebouncedFunc } from 'lodash-es'
  5. import { validateProviderKey } from '@/service/common'
  6. export enum ValidatedStatus {
  7. Success = 'success',
  8. Error = 'error',
  9. Exceed = 'exceed',
  10. }
  11. export type ValidatedStatusState = {
  12. status?: ValidatedStatus
  13. message?: string
  14. }
  15. // export type ValidatedStatusState = ValidatedStatus | undefined | ValidatedError
  16. export type SetValidatedStatus = Dispatch<SetStateAction<ValidatedStatusState>>
  17. export type ValidateFn = DebouncedFunc<(token: any, config: ValidateFnConfig) => void>
  18. type ValidateTokenReturn = [
  19. boolean,
  20. ValidatedStatusState,
  21. SetValidatedStatus,
  22. ValidateFn,
  23. ]
  24. export type ValidateFnConfig = {
  25. beforeValidating: (token: any) => boolean
  26. }
  27. const useValidateToken = (providerName: string): ValidateTokenReturn => {
  28. const [validating, setValidating] = useState(false)
  29. const [validatedStatus, setValidatedStatus] = useState<ValidatedStatusState>({})
  30. const validate = useCallback(debounce(async (token: string, config: ValidateFnConfig) => {
  31. if (!config.beforeValidating(token))
  32. return false
  33. setValidating(true)
  34. try {
  35. const res = await validateProviderKey({ url: `/workspaces/current/providers/${providerName}/token-validate`, body: { token } })
  36. setValidatedStatus(
  37. res.result === 'success'
  38. ? { status: ValidatedStatus.Success }
  39. : { status: ValidatedStatus.Error, message: res.error })
  40. }
  41. catch (e: any) {
  42. setValidatedStatus({ status: ValidatedStatus.Error, message: e.message })
  43. }
  44. finally {
  45. setValidating(false)
  46. }
  47. }, 500), [])
  48. return [
  49. validating,
  50. validatedStatus,
  51. setValidatedStatus,
  52. validate,
  53. ]
  54. }
  55. export default useValidateToken