mirror of
https://github.com/grafana/grafana.git
synced 2025-08-01 09:52:12 +08:00
73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
import { useEffect, useRef } from 'react';
|
|
|
|
import { Trans, t } from '@grafana/i18n';
|
|
import { Alert, Spinner, Stack, Text } from '@grafana/ui';
|
|
import { useGetRepositoryJobsWithPathQuery } from 'app/api/clients/provisioning/v0alpha1';
|
|
|
|
import { useStepStatus } from '../Wizard/StepStatusContext';
|
|
|
|
import { JobContent } from './JobContent';
|
|
|
|
export interface FinishedJobProps {
|
|
jobUid: string;
|
|
repositoryName: string;
|
|
}
|
|
|
|
export function FinishedJobStatus({ jobUid, repositoryName }: FinishedJobProps) {
|
|
const hasRetried = useRef(false);
|
|
const { setStepStatusInfo } = useStepStatus();
|
|
const finishedQuery = useGetRepositoryJobsWithPathQuery({
|
|
name: repositoryName,
|
|
uid: jobUid,
|
|
});
|
|
const retryFailed = hasRetried.current && finishedQuery.isError;
|
|
|
|
const job = finishedQuery.data;
|
|
|
|
useEffect(() => {
|
|
const shouldRetry = !job && !hasRetried.current && !finishedQuery.isFetching;
|
|
let timeoutId: ReturnType<typeof setTimeout>;
|
|
|
|
if (shouldRetry) {
|
|
hasRetried.current = true;
|
|
timeoutId = setTimeout(() => {
|
|
finishedQuery.refetch();
|
|
}, 1000);
|
|
}
|
|
|
|
if (finishedQuery.isSuccess && job?.status?.state !== 'error') {
|
|
setStepStatusInfo({ status: 'success' });
|
|
}
|
|
|
|
return () => {
|
|
if (timeoutId) {
|
|
clearTimeout(timeoutId);
|
|
}
|
|
};
|
|
}, [finishedQuery, job, setStepStatusInfo]);
|
|
|
|
if (retryFailed) {
|
|
setStepStatusInfo({ status: 'error' });
|
|
return (
|
|
<Alert severity="error" title={t('provisioning.job-status.no-job-found', 'No job found')}>
|
|
<Trans i18nKey="provisioning.job-status.no-job-found-message">
|
|
The job may have been deleted or could not be retrieved. Cancel the current process and start again.
|
|
</Trans>
|
|
</Alert>
|
|
);
|
|
}
|
|
|
|
if (!job || finishedQuery.isLoading || finishedQuery.isFetching) {
|
|
return (
|
|
<Stack direction="row" alignItems="center" justifyContent="center" gap={2}>
|
|
<Spinner size={24} />
|
|
<Text element="h4" color="secondary">
|
|
<Trans i18nKey="provisioning.job-status.loading-finished-job">Loading finished job...</Trans>
|
|
</Text>
|
|
</Stack>
|
|
);
|
|
}
|
|
|
|
return <JobContent job={job} isFinishedJob={true} />;
|
|
}
|