import {
useCallback,
useEffect,
useState,
useRef,
useMemo,
} from '@wordpress/element'
import { __ } from '@wordpress/i18n'
import { getStyles } from '@onboarding/api/DataApi'
import { SkeletonLoader } from '@onboarding/components/SkeletonLoader'
import { StylePreview } from '@onboarding/components/StyledPreview'
import { useFetch } from '@onboarding/hooks/useFetch'
import { useIsMountedLayout } from '@onboarding/hooks/useIsMounted'
import { PageLayout } from '@onboarding/layouts/PageLayout'
import { useUserSelectionStore } from '@onboarding/state/UserSelections'
import { pageState } from '@onboarding/state/factory'
export const fetcher = (params) => getStyles(params)
export const fetchData = (siteType) => {
siteType = siteType ?? useUserSelectionStore?.getState().siteType
return {
key: 'site-style',
siteType: siteType?.slug ?? 'default',
styles: siteType?.styles ?? [],
}
}
export const state = pageState('Design', (set, get) => ({
title: __('Design', 'extendify'),
default: undefined,
showInSidebar: true,
ready: false,
isDefault: () =>
useUserSelectionStore.getState().style?.slug === get().default?.slug,
}))
export const SiteStyle = () => {
const { data: styleData, loading } = useFetch(fetchData, fetcher)
const once = useRef(false)
const stylesRef = useRef()
const isMounted = useIsMountedLayout()
const [styles, setStyles] = useState([])
useEffect(() => {
state.setState({ ready: !loading })
}, [loading])
useEffect(() => {
if (!styleData?.length) return
;(async () => {
for (const style of styleData) {
if (!isMounted.current) return
setStyles((styles) => [...styles, style])
await new Promise((resolve) => setTimeout(resolve, 1000))
}
})()
}, [styleData, isMounted])
useEffect(() => {
if (styles?.length && !useUserSelectionStore.getState().style) {
useUserSelectionStore.getState().setStyle(styles[0])
state.setState({ default: styles[0] })
}
}, [styles])
useEffect(() => {
if (!styles?.length || once.current) return
once.current = true
// Focus the first style
stylesRef?.current?.querySelector('[role=button]')?.focus()
}, [styles])
return (
{__('You can personalize this later.', 'extendify')}
{__('Now pick a design for your new site.', 'extendify')}
{loading
? __(
'Please wait a moment while we generate style previews...',
'extendify',
)
: __('Pick your style', 'extendify')}