2023-09-20 06:36:20 +00:00
/ * *
* External dependencies
* /
2023-10-04 12:24:51 +00:00
import { useState } from '@wordpress/element' ;
2023-09-20 06:36:20 +00:00
import { __ } from '@wordpress/i18n' ;
import { chevronLeft } from '@wordpress/icons' ;
2024-01-25 11:04:44 +00:00
import interpolateComponents from '@automattic/interpolate-components' ;
2023-09-30 00:17:36 +00:00
import {
2024-01-25 11:04:44 +00:00
Notice ,
2023-09-30 00:17:36 +00:00
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore No types for this exist yet.
__unstableMotion as motion ,
} from '@wordpress/components' ;
2023-09-20 06:36:20 +00:00
2023-08-18 05:30:25 +00:00
/ * *
* Internal dependencies
* /
2024-01-09 14:49:59 +00:00
import { CustomizeStoreComponent , FlowType } from '../types' ;
2023-09-30 00:17:36 +00:00
import { SiteHub } from '../assembler-hub/site-hub' ;
import { ThemeCard } from './theme-card' ;
2023-10-09 05:19:08 +00:00
import {
DesignChangeWarningModal ,
StartNewDesignWarningModal ,
StartOverWarningModal ,
} from './warning-modals' ;
2023-10-03 01:56:13 +00:00
import { useNetworkStatus } from '~/utils/react-hooks/use-network-status' ;
2023-10-04 12:24:51 +00:00
import './intro.scss' ;
import {
NetworkOfflineBanner ,
ThemeHasModsBanner ,
JetpackOfflineBanner ,
DefaultBanner ,
2023-10-09 05:19:08 +00:00
ExistingAiThemeBanner ,
ExistingThemeBanner ,
2024-01-11 14:32:16 +00:00
NoAIBanner ,
2024-01-18 13:59:10 +00:00
ExistingNoAiThemeBanner ,
2023-10-04 12:24:51 +00:00
} from './intro-banners' ;
2023-09-20 06:36:20 +00:00
2023-08-18 05:30:25 +00:00
export type events =
| { type : 'DESIGN_WITH_AI' }
2023-09-30 00:17:36 +00:00
| { type : 'JETPACK_OFFLINE_HOWTO' }
2023-08-18 05:30:25 +00:00
| { type : 'CLICKED_ON_BREADCRUMB' }
| { type : 'SELECTED_BROWSE_ALL_THEMES' }
2023-09-29 07:44:22 +00:00
| { type : 'SELECTED_ACTIVE_THEME' ; payload : { theme : string } }
2024-01-11 14:32:16 +00:00
| { type : 'SELECTED_NEW_THEME' ; payload : { theme : string } }
| { type : 'DESIGN_WITHOUT_AI' } ;
2023-08-18 05:30:25 +00:00
export * as actions from './actions' ;
export * as services from './services' ;
2023-10-04 12:24:51 +00:00
type BannerStatus = keyof typeof BANNER_COMPONENTS ;
const BANNER_COMPONENTS = {
'network-offline' : NetworkOfflineBanner ,
'task-incomplete-active-theme-has-mods' : ThemeHasModsBanner ,
'jetpack-offline' : JetpackOfflineBanner ,
2023-10-09 05:19:08 +00:00
'existing-ai-theme' : ExistingAiThemeBanner ,
'existing-theme' : ExistingThemeBanner ,
2024-01-11 14:32:16 +00:00
[ FlowType . noAI ] : NoAIBanner ,
2024-01-18 13:59:10 +00:00
'existing-no-ai-theme' : ExistingNoAiThemeBanner ,
2023-10-04 12:24:51 +00:00
default : DefaultBanner ,
} ;
const MODAL_COMPONENTS = {
'no-modal' : null ,
'task-incomplete-override-design-changes' : DesignChangeWarningModal ,
2023-10-09 05:19:08 +00:00
'task-complete-with-ai-theme' : StartOverWarningModal ,
'task-complete-without-ai-theme' : StartNewDesignWarningModal ,
2023-10-04 12:24:51 +00:00
} ;
type ModalStatus = keyof typeof MODAL_COMPONENTS ;
2023-08-18 05:30:25 +00:00
export const Intro : CustomizeStoreComponent = ( { sendEvent , context } ) = > {
const {
2023-10-09 05:19:08 +00:00
intro : {
themeData ,
activeThemeHasMods ,
customizeStoreTaskCompleted ,
currentThemeIsAiGenerated ,
} ,
2023-08-18 05:30:25 +00:00
} = context ;
2023-09-20 06:36:20 +00:00
2023-09-30 00:17:36 +00:00
const isJetpackOffline = false ;
2023-10-03 01:56:13 +00:00
const isNetworkOffline = useNetworkStatus ( ) ;
2023-09-30 00:17:36 +00:00
2024-01-25 11:04:44 +00:00
const [ showError , setShowError ] = useState (
context . flowType === FlowType . noAI && context . intro . hasErrors
) ;
2023-09-29 23:03:50 +00:00
const [ openDesignChangeWarningModal , setOpenDesignChangeWarningModal ] =
useState ( false ) ;
2023-10-04 12:24:51 +00:00
let modalStatus : ModalStatus = 'no-modal' ;
let bannerStatus : BannerStatus = 'default' ;
2024-01-18 13:59:10 +00:00
2023-10-04 12:24:51 +00:00
switch ( true ) {
case isNetworkOffline :
bannerStatus = 'network-offline' ;
break ;
case isJetpackOffline as boolean :
bannerStatus = 'jetpack-offline' ;
break ;
2024-01-18 13:59:10 +00:00
case context . flowType === FlowType . noAI &&
! customizeStoreTaskCompleted :
bannerStatus = FlowType . noAI ;
break ;
case context . flowType === FlowType . noAI && customizeStoreTaskCompleted :
bannerStatus = 'existing-no-ai-theme' ;
break ;
2023-10-09 05:19:08 +00:00
case ! customizeStoreTaskCompleted && activeThemeHasMods :
2023-10-04 12:24:51 +00:00
bannerStatus = 'task-incomplete-active-theme-has-mods' ;
break ;
2023-10-09 05:19:08 +00:00
case customizeStoreTaskCompleted && currentThemeIsAiGenerated :
2023-10-04 12:24:51 +00:00
bannerStatus = 'existing-ai-theme' ;
break ;
2023-10-09 05:19:08 +00:00
case customizeStoreTaskCompleted && ! currentThemeIsAiGenerated :
bannerStatus = 'existing-theme' ;
break ;
2023-10-04 12:24:51 +00:00
}
switch ( true ) {
case openDesignChangeWarningModal === false :
modalStatus = 'no-modal' ;
break ;
case bannerStatus === 'task-incomplete-active-theme-has-mods' :
modalStatus = 'task-incomplete-override-design-changes' ;
break ;
2023-10-09 05:19:08 +00:00
case bannerStatus === 'existing-ai-theme' :
modalStatus = 'task-complete-with-ai-theme' ;
break ;
case bannerStatus === 'existing-theme' :
modalStatus = 'task-complete-without-ai-theme' ;
break ;
2023-10-04 12:24:51 +00:00
}
const ModalComponent = MODAL_COMPONENTS [ modalStatus ] ;
const BannerComponent = BANNER_COMPONENTS [ bannerStatus ] ;
2024-01-16 08:07:47 +00:00
const sidebarMessage =
context . flowType === FlowType . AIOnline
? __ (
'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'
)
: __ (
'Create a store that reflects your brand and business. Select one of our professionally designed themes to customize, or create your own using our store designer.' ,
'woocommerce'
) ;
2023-08-18 05:30:25 +00:00
return (
< >
2023-10-04 12:24:51 +00:00
{ ModalComponent && (
< ModalComponent
sendEvent = { sendEvent }
setOpenDesignChangeWarningModal = {
setOpenDesignChangeWarningModal
}
/ >
2023-09-29 23:03:50 +00:00
) }
2023-09-20 06:36:20 +00:00
< div className = "woocommerce-customize-store-header" >
2023-09-30 00:17:36 +00:00
< SiteHub
as = { motion . div }
variants = { {
view : { x : 0 } ,
} }
isTransparent = { false }
className = "woocommerce-customize-store__content"
/ >
2023-09-20 06:36:20 +00:00
< / div >
< div className = "woocommerce-customize-store-container" >
< div className = "woocommerce-customize-store-sidebar" >
< div className = "woocommerce-customize-store-sidebar__title" >
< button
onClick = { ( ) = > {
sendEvent ( 'CLICKED_ON_BREADCRUMB' ) ;
} }
>
{ chevronLeft }
< / button >
{ __ ( 'Customize your store' , 'woocommerce' ) }
< / div >
2024-01-16 08:07:47 +00:00
< p > { sidebarMessage } < / p >
2023-09-20 06:36:20 +00:00
< / div >
< div className = "woocommerce-customize-store-main" >
2024-01-25 11:04:44 +00:00
{ showError && (
< Notice
onRemove = { ( ) = > setShowError ( false ) }
className = "woocommerce-cys-design-with-ai__error-notice"
status = "error"
>
{ interpolateComponents ( {
mixedString : __ (
'Oops! We encountered a problem while setting up the foundations. {{anchor}}Please try again{{/anchor}} or start with a theme.' ,
'woocommerce'
) ,
components : {
anchor : (
// eslint-disable-next-line jsx-a11y/anchor-has-content, jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions, jsx-a11y/anchor-is-valid
< a
className = "woocommerce-customize-store-error-link"
onClick = { ( ) = >
sendEvent ( 'DESIGN_WITHOUT_AI' )
}
/ >
) ,
} ,
} ) }
< / Notice >
) }
2023-10-04 12:24:51 +00:00
< BannerComponent
setOpenDesignChangeWarningModal = {
setOpenDesignChangeWarningModal
}
sendEvent = { sendEvent }
/ >
2023-09-20 06:36:20 +00:00
2023-09-30 00:17:36 +00:00
< p className = "select-theme-text" >
2023-09-20 06:36:20 +00:00
{ __ (
'Or select a professionally designed theme to customize and make your own.' ,
'woocommerce'
) }
< / p >
< div className = "woocommerce-customize-store-theme-cards" >
2023-10-05 13:33:50 +00:00
{ themeData . themes ? . map ( ( theme ) = > (
2023-09-30 00:17:36 +00:00
< ThemeCard
2023-10-05 13:33:50 +00:00
key = { theme . slug }
slug = { theme . slug }
description = { theme . description }
thumbnail_url = { theme . thumbnail_url }
name = { theme . name }
color_palettes = { theme . color_palettes }
2023-10-09 07:45:04 +00:00
total_palettes = { theme . total_palettes }
2023-10-05 13:33:50 +00:00
link_url = { theme ? . link_url }
is_active = { theme . is_active }
2023-11-09 01:32:47 +00:00
onClick = { ( ) = > {
if ( theme . is_active ) {
sendEvent ( {
type : 'SELECTED_ACTIVE_THEME' ,
payload : { theme : theme.slug } ,
} ) ;
} else {
sendEvent ( {
type : 'SELECTED_NEW_THEME' ,
payload : { theme : theme.slug } ,
} ) ;
}
} }
2023-09-30 00:17:36 +00:00
/ >
2023-09-20 06:36:20 +00:00
) ) }
< / div >
< div className = "woocommerce-customize-store-browse-themes" >
< button
onClick = { ( ) = >
sendEvent ( {
type : 'SELECTED_BROWSE_ALL_THEMES' ,
} )
}
>
{ __ ( 'Browse all themes' , 'woocommerce' ) }
< / button >
< / div >
< / div >
< / div >
2023-08-18 05:30:25 +00:00
< / >
) ;
} ;