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 (

{__('Now pick a design for your new site.', 'extendify')}

{__('You can personalize this later.', 'extendify')}

{loading ? __( 'Please wait a moment while we generate style previews...', 'extendify', ) : __('Pick your style', 'extendify')}

{styles?.map((style) => ( ))} {styleData?.slice(styles?.length).map((data) => (
))}
) } const StylePreviewWrapper = ({ style }) => { const onSelect = useCallback((style) => { useUserSelectionStore.getState().setStyle(style) }, []) const context = useMemo( () => ({ type: 'style', detail: style.slug, measure: true, }), [style], ) return (
) }