useValidateToken.ts 1.8 KB

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