diff --git a/.changeset/famous-shrimps-double.md b/.changeset/famous-shrimps-double.md new file mode 100644 index 0000000000..198c0dc8f5 --- /dev/null +++ b/.changeset/famous-shrimps-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Bug fix: User can retry creating a new component if an error occurs, without having to reload the page. diff --git a/plugins/scaffolder/src/components/JobStatusModal/JobStatusModal.tsx b/plugins/scaffolder/src/components/JobStatusModal/JobStatusModal.tsx index 01a6346d24..5051475ae8 100644 --- a/plugins/scaffolder/src/components/JobStatusModal/JobStatusModal.tsx +++ b/plugins/scaffolder/src/components/JobStatusModal/JobStatusModal.tsx @@ -23,18 +23,23 @@ import { LinearProgress, } from '@material-ui/core'; -import React, { useCallback, useState } from 'react'; +import React, { useCallback } from 'react'; import { Job } from '../../types'; import { JobStage } from '../JobStage/JobStage'; type Props = { job: Job | null; toCatalogLink?: string; + open: boolean; + setOpen: (newState: boolean) => void; }; -export const JobStatusModal = ({ job, toCatalogLink }: Props) => { - const [isOpen, setOpen] = useState(true); - +export const JobStatusModal = ({ + job, + toCatalogLink, + open, + setOpen, +}: Props) => { const renderTitle = () => { switch (job?.status) { case 'COMPLETED': @@ -47,16 +52,17 @@ export const JobStatusModal = ({ job, toCatalogLink }: Props) => { }; const onClose = useCallback(() => { + setOpen(false); if (!job) { return; } if (job.status === 'COMPLETED' || job.status === 'FAILED') { setOpen(false); } - }, [job]); + }, [job, setOpen]); return ( - + {renderTitle()} {!job ? ( diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx index 0754b64d7f..cdf9b05b4c 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx @@ -161,7 +161,12 @@ export const TemplatePage = () => { /> {loading && } - {modalOpen && } + {template && ( { const scaffolderApi = useApi(scaffolderApiRef); const [currentJob, setCurrentJob] = useState(null); + + useEffect(() => { + const resetCurrentJob = async () => { + if (jobId) { + const job = await scaffolderApi.getJob(jobId); + setCurrentJob(job); + } + }; + + resetCurrentJob(); + }, [jobId, scaffolderApi]); + const shouldBeRunningInterval = jobId && currentJob?.status !== 'COMPLETED' && currentJob?.status !== 'FAILED'; + useInterval( async () => { if (jobId) {