import { registerCoreBlocks } from '@wordpress/block-library'; import { useSelect, useDispatch } from '@wordpress/data'; import { useEffect, useState } from '@wordpress/element'; import { safeParseJson } from '@shared/lib/parsing'; import { SWRConfig, useSWRConfig } from 'swr'; import { updateOption } from '@launch/api/WPApi'; import { RestartLaunchModal } from '@launch/components/RestartLaunchModal'; import { RetryNotice } from '@launch/components/RetryNotice'; import { useTelemetry } from '@launch/hooks/useTelemetry'; import { CreatingSite } from '@launch/pages/CreatingSite'; import { NeedsTheme } from '@launch/pages/NeedsTheme'; import { useGlobalStore } from '@launch/state/Global'; import { usePagesStore } from '@launch/state/Pages'; import { useUserSelectionStore } from '@launch/state/user-selections'; export const LaunchPage = () => { const { updateSettings } = useDispatch('core/block-editor'); const [retrying, setRetrying] = useState(false); const { siteType } = useUserSelectionStore(); const CurrentPage = usePagesStore((state) => { const pageData = state.getCurrentPageData(); return pageData?.component; }); const { fetcher, fetchData } = usePagesStore((state) => state.getNextPageData(), ); const { setPage, currentPageIndex } = usePagesStore(); const { mutate } = useSWRConfig(); const { generating } = useGlobalStore(); const [show, setShow] = useState(false); const [needsTheme, setNeedsTheme] = useState(false); const theme = useSelect((select) => select('core').getCurrentTheme()); useTelemetry(); const page = () => { if (needsTheme) return ; // Site type is required to progress if (!siteType?.slug && currentPageIndex !== 0) { setPage(0); return null; } if (generating) return ; if (!CurrentPage) return null; return ( <> ); }; useEffect(() => { // Add editor styles to use for live previews updateSettings(safeParseJson(window.extOnbData.editorStyles)); }, [updateSettings]); useEffect(() => { // Keep an eye on this. If WP starts registering blocks when // importing the block-library module (as they likely should be doing) // then we will need to have a conditional here registerCoreBlocks(); }, []); useEffect(() => { // Check that the textdomain came back and that it's extendable if (!theme?.textdomain) return; if (theme?.textdomain === 'extendable') return; setNeedsTheme(true); }, [theme]); useEffect(() => { setShow(true); updateOption('extendify_launch_loaded', new Date().toISOString()); }, []); useEffect(() => { const fetchers = [].concat(fetcher); const fetchDatas = [].concat(fetchData); if (fetchers.length) { fetchers.forEach((fetcher, i) => { const data = typeof fetchDatas?.[i] === 'function' ? fetchDatas[i]() : fetchDatas?.[i]; mutate(data, (last) => last || fetcher(data), { revalidate: false }); }); } }, [fetcher, mutate, fetchData]); if (!show) return null; return ( { if (error?.data?.status === 403) { // if they are logged out, we can't recover window.location.reload(); return; } if (retrying) return; // TODO: Add back when we have something to show here // if (retryCount >= 5) { // console.error('Encountered unrecoverable error', error) // throw new Error(error?.message ?? 'Unknown error') // } console.error(key, error); setRetrying(true); setTimeout(() => { setRetrying(false); revalidate({ retryCount }); }, 5000); }, }}>
{page()}
); };