import { useCreateSite } from '@auto-launch/hooks/useCreateSite'; import { useRateLimitedCursor } from '@auto-launch/hooks/useRateLimitedCursor'; import { loaderSiteCreation } from '@auto-launch/icons'; import { clearPersistedLaunchData, useLaunchDataStore, } from '@auto-launch/state/launch-data'; import { useEffect, useRef, useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { Icon, info } from '@wordpress/icons'; import { AnimatePresence, motion } from 'framer-motion'; const { adminUrl, homeUrl } = window.extSharedData; export const CreatingSite = ({ height }) => { const { done } = useCreateSite(); const pos = useRef(0); const [currentMessage, setCurrentMessage] = useState(null); const [loadAdmin, setLoadAdmin] = useState(false); const { statusMessages, errorMessage, setErrorMessage, errorCount, needToStall, resetErrorCount, setPulse, } = useLaunchDataStore(); useRateLimitedCursor( () => { if (errorMessage) return false; if (pos.current >= statusMessages.length) return false; const remaining = statusMessages.length - pos.current; const MAX_BACKLOG = 3; // Skip ahead silently if backed up if (remaining > MAX_BACKLOG && pos.current > 0) { pos.current = statusMessages.length - MAX_BACKLOG; } setCurrentMessage(statusMessages[pos.current]); pos.current += 1; return pos.current < statusMessages.length; }, // Variable timer to feel more natural, 2.5-3.25s Math.floor(2500 + Math.random() * 750), [statusMessages.length], ); useEffect(() => { if (!errorMessage) return; const timeout = setTimeout(() => { // Clear after 5 seconds setErrorMessage(null); }, 5000); return () => clearTimeout(timeout); }, [errorMessage, setErrorMessage]); useEffect(() => { setPulse(!done); }, [done]); useEffect(() => { if (!done) return; setLoadAdmin(true); const timeout = setTimeout(() => { clearPersistedLaunchData(); window.location.replace(`${homeUrl}?extendify-launch-success=1`); }, 3000); return () => clearTimeout(timeout); }, [done]); useEffect(() => { if (!needToStall()) return; const timer = setTimeout(() => { resetErrorCount(); }, 10000); // reset after 10 seconds return () => clearTimeout(timer); }, [needToStall, errorCount, resetErrorCount]); if (needToStall()) { return (