{"version":3,"file":"useAIMetadataJob.mjs","sources":["../../../admin/src/hooks/useAIMetadataJob.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useQueryClient } from 'react-query';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { getTrad } from '../utils';\n\nconst fetchLatestJob = async (\n  get: ReturnType<typeof useFetchClient>['get']\n): Promise<AIMetadataJob | null> => {\n  try {\n    const { data } = await get('/upload/actions/generate-ai-metadata/latest');\n    return data;\n  } catch {\n    // Return null on any error - UI treats this as \"no active job\"\n    return null;\n  }\n};\n\nexport const useAIMetadataJob = (options?: { enabled?: boolean }) => {\n  const { get } = useFetchClient();\n  const { toggleNotification } = useNotification();\n  const { formatMessage } = useIntl();\n  const queryClient = useQueryClient();\n  const enabled = options?.enabled ?? true;\n\n  const [previousJobStatus, setPreviousJobStatus] = React.useState<AIMetadataJob['status'] | null>(\n    null\n  );\n\n  // Single query with conditional polling\n  const { data: job, refetch } = useQuery<AIMetadataJob | null, { message: string }>(\n    ['ai-metadata-latest-job'],\n    () => fetchLatestJob(get),\n    {\n      enabled,\n      // Poll every second when job is processing\n      refetchInterval: (data) => {\n        // If no data yet, don't poll\n        if (!data) return false;\n\n        // Poll while processing\n        if (data.status === 'processing') {\n          return 1000;\n        }\n\n        // Stop polling when completed or failed\n        return false;\n      },\n      retry: false,\n      refetchOnWindowFocus: false,\n    }\n  );\n\n  const currentJobStatus = job?.status ?? null;\n\n  // Detect status transitions and show notifications\n  React.useEffect(() => {\n    if (!currentJobStatus) return;\n\n    // Detect transition from active state to completed\n    if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {\n      toggleNotification({\n        type: 'success',\n        message: formatMessage({\n          id: getTrad('settings.form.aiMetadata.job-completed'),\n          defaultMessage: 'Successfully generated metadata',\n        }),\n      });\n      // Invalidate metadata count query to refresh the count\n      queryClient.invalidateQueries(['ai-metadata-count']);\n    }\n\n    // Detect transition from active state to failed\n    if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {\n      toggleNotification({\n        type: 'danger',\n        message: formatMessage({\n          id: getTrad('settings.form.aiMetadata.job-failed'),\n          defaultMessage: 'Failed to generate metadata. Please try again.',\n        }),\n      });\n    }\n\n    // Update previous status if it changed\n    if (previousJobStatus !== currentJobStatus) {\n      setPreviousJobStatus(currentJobStatus);\n    }\n  }, [currentJobStatus, previousJobStatus, toggleNotification, formatMessage, queryClient]);\n\n  return {\n    data: job,\n    refetch,\n  };\n};\n"],"names":["fetchLatestJob","get","data","useAIMetadataJob","options","useFetchClient","toggleNotification","useNotification","formatMessage","useIntl","queryClient","useQueryClient","enabled","previousJobStatus","setPreviousJobStatus","React","useState","job","refetch","useQuery","refetchInterval","status","retry","refetchOnWindowFocus","currentJobStatus","useEffect","type","message","id","getTrad","defaultMessage","invalidateQueries"],"mappings":";;;;;;;;;;;AASA,MAAMA,iBAAiB,OACrBC,GAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMD,GAAAA,CAAI,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,cAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcC,cAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAAA,IAAW,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAAA,EAAMe,GAAG,EAAEC,OAAO,EAAE,GAAGC,QAAAA,CAC7B;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GAAAA,CAAAA,EACrB;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAA,EAAc;gBAChC,OAAO,IAAA;AACT,YAAA;;YAGA,OAAO,KAAA;AACT,QAAA,CAAA;QACAC,KAAAA,EAAO,KAAA;QACPC,oBAAAA,EAAsB;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAAA,IAAU,IAAA;;AAGxCN,IAAAA,KAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAAA,EAAkB;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,WAAA,EAAa;YAC1ElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAAA,CAAQ,wCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD,QAAA;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,QAAA,EAAU;YACvElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAAA,CAAQ,qCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAAA,EAAkB;YAC1CV,oBAAAA,CAAqBU,gBAAAA,CAAAA;AACvB,QAAA;IACF,CAAA,EAAG;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAAA,EAAMe,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}