/** * External dependencies */ import { useState } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { chevronLeft } from '@wordpress/icons'; import { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore No types for this exist yet. __unstableMotion as motion, } from '@wordpress/components'; /** * Internal dependencies */ import { CustomizeStoreComponent } from '../types'; import { SiteHub } from '../assembler-hub/site-hub'; import { ThemeCard } from './theme-card'; import { DesignChangeWarningModal, StartNewDesignWarningModal, StartOverWarningModal, } from './warning-modals'; import { useNetworkStatus } from '~/utils/react-hooks/use-network-status'; import './intro.scss'; import { NetworkOfflineBanner, ThemeHasModsBanner, JetpackOfflineBanner, DefaultBanner, ExistingAiThemeBanner, ExistingThemeBanner, } from './intro-banners'; export type events = | { type: 'DESIGN_WITH_AI' } | { type: 'JETPACK_OFFLINE_HOWTO' } | { type: 'CLICKED_ON_BREADCRUMB' } | { type: 'SELECTED_BROWSE_ALL_THEMES' } | { type: 'SELECTED_ACTIVE_THEME'; payload: { theme: string } } | { type: 'SELECTED_NEW_THEME'; payload: { theme: string } }; export * as actions from './actions'; export * as services from './services'; type BannerStatus = keyof typeof BANNER_COMPONENTS; const BANNER_COMPONENTS = { 'network-offline': NetworkOfflineBanner, 'task-incomplete-active-theme-has-mods': ThemeHasModsBanner, 'jetpack-offline': JetpackOfflineBanner, 'existing-ai-theme': ExistingAiThemeBanner, 'existing-theme': ExistingThemeBanner, default: DefaultBanner, }; const MODAL_COMPONENTS = { 'no-modal': null, 'task-incomplete-override-design-changes': DesignChangeWarningModal, 'task-complete-with-ai-theme': StartOverWarningModal, 'task-complete-without-ai-theme': StartNewDesignWarningModal, }; type ModalStatus = keyof typeof MODAL_COMPONENTS; export const Intro: CustomizeStoreComponent = ( { sendEvent, context } ) => { const { intro: { themeData, activeThemeHasMods, customizeStoreTaskCompleted, currentThemeIsAiGenerated, }, } = context; const isJetpackOffline = false; const isNetworkOffline = useNetworkStatus(); const [ openDesignChangeWarningModal, setOpenDesignChangeWarningModal ] = useState( false ); let modalStatus: ModalStatus = 'no-modal'; let bannerStatus: BannerStatus = 'default'; switch ( true ) { case isNetworkOffline: bannerStatus = 'network-offline'; break; case isJetpackOffline as boolean: bannerStatus = 'jetpack-offline'; break; case ! customizeStoreTaskCompleted && activeThemeHasMods: bannerStatus = 'task-incomplete-active-theme-has-mods'; break; case customizeStoreTaskCompleted && currentThemeIsAiGenerated: bannerStatus = 'existing-ai-theme'; break; case customizeStoreTaskCompleted && ! currentThemeIsAiGenerated: bannerStatus = 'existing-theme'; break; } switch ( true ) { case openDesignChangeWarningModal === false: modalStatus = 'no-modal'; break; case bannerStatus === 'task-incomplete-active-theme-has-mods': modalStatus = 'task-incomplete-override-design-changes'; break; case bannerStatus === 'existing-ai-theme': modalStatus = 'task-complete-with-ai-theme'; break; case bannerStatus === 'existing-theme': modalStatus = 'task-complete-without-ai-theme'; break; } const ModalComponent = MODAL_COMPONENTS[ modalStatus ]; const BannerComponent = BANNER_COMPONENTS[ bannerStatus ]; return ( <> { ModalComponent && ( ) }
{ __( 'Customize your store', 'woocommerce' ) }

{ __( 'Create a store that reflects your brand and business. Select one of our professionally designed themes to customize, or create your own using AI.', 'woocommerce' ) }

{ __( 'Or select a professionally designed theme to customize and make your own.', 'woocommerce' ) }

{ themeData.themes?.map( ( theme ) => ( { if ( theme.is_active ) { sendEvent( { type: 'SELECTED_ACTIVE_THEME', payload: { theme: theme.slug }, } ); } else { sendEvent( { type: 'SELECTED_NEW_THEME', payload: { theme: theme.slug }, } ); } } } /> ) ) }
); };