useWorkflowManagement.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { useEffect, useState } from 'react'
  2. import { useActionRunQuery } from '@/data/actions/action-detail-query'
  3. import { useActionRunLogsQuery } from '@/data/actions/action-logs-query'
  4. interface UseWorkflowManagementProps {
  5. workflowRunId?: string
  6. projectRef?: string
  7. onWorkflowComplete?: (status: 'SUCCESS' | 'FAILED') => void
  8. }
  9. export const useWorkflowManagement = ({
  10. workflowRunId,
  11. projectRef,
  12. onWorkflowComplete,
  13. }: UseWorkflowManagementProps) => {
  14. const [hasRefetched, setHasRefetched] = useState(false)
  15. const { data: workflowRun } = useActionRunQuery(
  16. { projectRef, runId: workflowRunId },
  17. {
  18. refetchInterval: (query) => {
  19. return query.state.error?.code === 404 ? false : 2000
  20. },
  21. refetchOnMount: 'always',
  22. staleTime: 0,
  23. }
  24. )
  25. const { data: workflowRunLogs } = useActionRunLogsQuery(
  26. { projectRef, runId: workflowRunId },
  27. {
  28. refetchInterval: (query) => {
  29. return query.state.error?.code === 404 ? false : 2000
  30. },
  31. refetchOnMount: 'always',
  32. staleTime: 0,
  33. }
  34. )
  35. // Handle workflow completion
  36. useEffect(() => {
  37. if (!workflowRun || !workflowRunId) return
  38. // Only refetch once per workflow completion
  39. if (!!workflowRun.status && workflowRun.status !== 'RUNNING' && !hasRefetched) {
  40. setHasRefetched(true)
  41. onWorkflowComplete?.(workflowRun.status)
  42. }
  43. }, [workflowRunId, hasRefetched, onWorkflowComplete, workflowRun])
  44. // Reset refetch flag when workflow ID changes
  45. useEffect(() => {
  46. setHasRefetched(false)
  47. }, [workflowRunId])
  48. return {
  49. run: workflowRun,
  50. logs: workflowRunLogs,
  51. }
  52. }