useValidateToken.ts 1.9 KB

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