diff --git a/mailpoet/assets/js/src/automation/templates/components/template-preview.tsx b/mailpoet/assets/js/src/automation/templates/components/template-preview.tsx index eeeb130870..437edf9751 100644 --- a/mailpoet/assets/js/src/automation/templates/components/template-preview.tsx +++ b/mailpoet/assets/js/src/automation/templates/components/template-preview.tsx @@ -36,25 +36,32 @@ type Props = { }; export function TemplatePreview({ template }: Props): JSX.Element { - const [isLoaded, setIsLoaded] = useState(false); + const [state, setState] = useState<'loading' | 'loaded' | 'error'>('loading'); useEffect(() => { const controller = new AbortController(); const loadTemplate = async () => { - setIsLoaded(false); + setState('loading'); initializeHooks(); createStore(); initializeIntegrations(); - const data = await apiFetch<{ data: { automation: unknown } }>({ - path: `/automation-templates/${template.slug}`, - method: 'GET', - signal: controller.signal, - }); - dispatch(storeName).updateAutomation(data.data.automation); - setIsLoaded(true); + try { + const data = await apiFetch<{ data: { automation: unknown } }>({ + path: `/automation-templates/${template.slug}`, + method: 'GET', + signal: controller.signal, + }); + dispatch(storeName).updateAutomation(data.data.automation); + setState('loaded'); + } catch (error) { + if (!controller.signal.aborted) { + setState('error'); + } + } }; + void loadTemplate(); return () => { @@ -63,7 +70,7 @@ export function TemplatePreview({ template }: Props): JSX.Element { }; }, [template.slug]); - return isLoaded ? ( + return state === 'loaded' ? ( ) : (