import { useSelect } from '@wordpress/data'
import { useEffect, useState } from '@wordpress/element'
import { SWRConfig, useSWRConfig } from 'swr'
import { RetryNotice } from '@onboarding/components/RetryNotice'
import { useDisableWelcomeGuide } from '@onboarding/hooks/useDisableWelcomeGuide'
import { useBodyScrollLock } from '@onboarding/hooks/useScrollLock'
import { CreatingSite } from '@onboarding/pages/CreatingSite'
import { useGlobalStore } from '@onboarding/state/Global'
import { usePagesStore } from '@onboarding/state/Pages'
import { updateOption } from './api/WPApi'
import { ExitModal } from './components/ExitModal'
import { useSentry } from './hooks/useSentry'
import { useTelemetry } from './hooks/useTelemetry'
import { NeedsTheme } from './pages/NeedsTheme'
export const Onboarding = () => {
const [retrying, setRetrying] = useState(false)
const CurrentPage = usePagesStore((state) => {
const pageData = state.currentPageData()
return pageData?.component
})
const { fetcher, fetchData } = usePagesStore((state) =>
state.nextPageData(),
)
const { mutate } = useSWRConfig()
const { generating } = useGlobalStore()
const [show, setShow] = useState(false)
const [needsTheme, setNeedsTheme] = useState(false)
const theme = useSelect((select) => select('core').getCurrentTheme())
const { Sentry } = useSentry()
useDisableWelcomeGuide()
useBodyScrollLock()
useTelemetry()
const page = () => {
if (needsTheme) return
if (generating) return
if (!CurrentPage) return null
return
}
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(() => {
if (!show) return
// If the library happens to be open, try to close it.
const timeout = setTimeout(() => {
window.dispatchEvent(
new CustomEvent('extendify::close-library', { bubbles: true }),
)
}, 0)
document.title = 'Extendify Launch' // Don't translate
return () => clearTimeout(timeout)
}, [show])
useEffect(() => {
setShow(true)
updateOption('extendify_launch_loaded', new Date().toISOString())
}, [])
useEffect(() => {
if (fetcher) {
mutate(fetchData, fetcher)
}
}, [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)
Sentry.captureException(
new Error(error?.message ?? 'Unknown error'),
{
tags: { retrying: true },
extra: { cacheKey: key },
},
)
setRetrying(true)
setTimeout(() => {
setRetrying(false)
revalidate({ retryCount })
}, 5000)
},
}}>
{page()}
{retrying && }
)
}