useValidateToken.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { useState, useCallback } 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. const useValidateToken = (providerName: string): [boolean, ValidatedStatus | undefined, DebouncedFunc<(token: string) => Promise<void>>] => {
  11. const [validating, setValidating] = useState(false)
  12. const [validatedStatus, setValidatedStatus] = useState<ValidatedStatus | undefined>()
  13. const validate = useCallback(debounce(async (token: string) => {
  14. if (!token) {
  15. setValidatedStatus(undefined)
  16. return
  17. }
  18. setValidating(true)
  19. try {
  20. const res = await validateProviderKey({ url: `/workspaces/current/providers/${providerName}/token-validate`, body: { token } })
  21. setValidatedStatus(res.result === 'success' ? ValidatedStatus.Success : ValidatedStatus.Error)
  22. } catch (e: any) {
  23. if (e.status === 400) {
  24. e.json().then(({ code }: any) => {
  25. if (code === 'provider_request_failed') {
  26. setValidatedStatus(ValidatedStatus.Exceed)
  27. }
  28. })
  29. } else {
  30. setValidatedStatus(ValidatedStatus.Error)
  31. }
  32. } finally {
  33. setValidating(false)
  34. }
  35. }, 500), [])
  36. return [
  37. validating,
  38. validatedStatus,
  39. validate,
  40. ]
  41. }
  42. export default useValidateToken