useRevealedSecret.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { useCallback, useRef, useState } from 'react'
  2. import { getAPIKeysById } from '@/data/api-keys/api-key-id-query'
  3. interface UseRevealedSecretOptions {
  4. projectRef?: string
  5. id?: string
  6. }
  7. export function useRevealedSecret({ projectRef, id }: UseRevealedSecretOptions) {
  8. const [data, setData] = useState<string | undefined | null>()
  9. const [isLoading, setIsLoading] = useState(false)
  10. const requestIdRef = useRef(0)
  11. const reveal = useCallback(async () => {
  12. if (!projectRef || !id) return
  13. const requestId = ++requestIdRef.current
  14. setIsLoading(true)
  15. try {
  16. const result = await getAPIKeysById({ projectRef, id, reveal: true })
  17. if (requestId !== requestIdRef.current) return
  18. setData(result.api_key)
  19. return result.api_key
  20. } catch (error) {
  21. if (requestId !== requestIdRef.current) return
  22. console.error('Failed to reveal secret key:', error)
  23. throw error
  24. } finally {
  25. if (requestId === requestIdRef.current) {
  26. setIsLoading(false)
  27. }
  28. }
  29. }, [projectRef, id])
  30. const clear = useCallback(() => {
  31. requestIdRef.current++
  32. setData(undefined)
  33. }, [])
  34. return { data, isLoading, reveal, clear }
  35. }