2023-09-20 06:36:20 +00:00
/ * *
* External dependencies
* /
2023-09-30 00:17:36 +00:00
import {
useEffect ,
useState ,
createInterpolateElement ,
} from '@wordpress/element' ;
2023-09-20 06:36:20 +00:00
import { __ } from '@wordpress/i18n' ;
import { chevronLeft } from '@wordpress/icons' ;
2023-09-30 00:17:36 +00:00
import classNames from 'classnames' ;
2023-09-29 23:03:50 +00:00
import { Link } from '@woocommerce/components' ;
2023-09-30 00:17:36 +00:00
import {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore No types for this exist yet.
__unstableMotion as motion ,
Button ,
} from '@wordpress/components' ;
2023-09-20 06:36:20 +00:00
2023-08-18 05:30:25 +00:00
/ * *
* Internal dependencies
* /
import { CustomizeStoreComponent } from '../types' ;
2023-09-30 00:17:36 +00:00
import { SiteHub } from '../assembler-hub/site-hub' ;
import { ThemeCard } from './theme-card' ;
2023-09-29 23:03:50 +00:00
import { DesignChangeWarningModal } from './design-change-warning-modal' ;
2023-09-20 06:36:20 +00:00
import './intro.scss' ;
2023-09-29 23:03:50 +00:00
import { ADMIN_URL } from '~/utils/admin-settings' ;
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 } }
2023-08-18 05:30:25 +00:00
| { type : 'SELECTED_NEW_THEME' ; payload : { theme : string } } ;
export * as actions from './actions' ;
export * as services from './services' ;
export const Intro : CustomizeStoreComponent = ( { sendEvent , context } ) = > {
const {
2023-09-29 23:03:50 +00:00
intro : { themeCards , activeThemeHasMods , customizeStoreTaskCompleted } ,
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 [ isNetworkOffline , setIsNetworkOffline ] = useState ( false ) ;
const isJetpackOffline = false ;
const setOfflineBannerIamge = ( ) = > {
setIsNetworkOffline ( true ) ;
} ;
const removeOfflineBannerImage = ( ) = > {
setIsNetworkOffline ( false ) ;
} ;
useEffect ( ( ) = > {
window . addEventListener ( 'offline' , setOfflineBannerIamge ) ;
window . addEventListener ( 'online' , removeOfflineBannerImage ) ;
return ( ) = > {
window . addEventListener ( 'offline' , setOfflineBannerIamge ) ;
window . addEventListener ( 'online' , removeOfflineBannerImage ) ;
} ;
} , [ ] ) ;
let bannerText ;
let bannerTitle ;
let bannerButtonText ;
if ( isNetworkOffline ) {
bannerText = __ (
"Unfortunately, the [AI Store designer] isn't available right now as we can't detect your network. Please check your internet connection and try again." ,
'woocommerce'
) ;
bannerTitle = __ (
'Looking to design your store using AI?' ,
'woocommerce'
) ;
bannerButtonText = __ ( 'Retry' , 'woocommerce' ) ;
} else if ( isJetpackOffline ) {
bannerTitle = __ (
'Looking to design your store using AI?' ,
'woocommerce'
) ;
bannerText = __ (
"It looks like you're using Jetpack's offline mode — switch to online mode to start designing with AI." ,
'woocommerce'
) ;
bannerButtonText = __ ( 'Find out how' , 'woocommerce' ) ;
} else {
bannerTitle = __ (
'Use the power of AI to design your store' ,
'woocommerce'
) ;
bannerText = __ (
'Design the look of your store, create pages, and generate copy using our built-in AI tools.' ,
'woocommerce'
) ;
bannerButtonText = __ ( 'Design with AI' , 'woocommerce' ) ;
}
2023-09-29 23:03:50 +00:00
const [ openDesignChangeWarningModal , setOpenDesignChangeWarningModal ] =
useState ( false ) ;
2023-08-18 05:30:25 +00:00
return (
< >
2023-09-29 23:03:50 +00:00
{ openDesignChangeWarningModal && (
< DesignChangeWarningModal
title = { __ (
'Are you sure you want to start a new design?' ,
'woocommerce'
) }
isOpen = { true }
onRequestClose = { ( ) = > {
setOpenDesignChangeWarningModal ( false ) ;
} }
>
< p >
{ createInterpolateElement (
__ (
"The [AI designer*] will create a new store design for you, and you'll lose any changes you've made to your active theme. If you'd prefer to continue editing your theme, you can do so via the <EditorLink>Editor</EditorLink>." ,
'woocommerce'
) ,
{
EditorLink : (
< Link
onClick = { ( ) = > {
window . open (
` ${ ADMIN_URL } site-editor.php ` ,
'_blank'
) ;
return false ;
} }
href = ""
/ >
) ,
}
) }
< / p >
< div className = "woocommerce-customize-store__design-change-warning-modal-footer" >
< Button
onClick = { ( ) = >
setOpenDesignChangeWarningModal ( false )
}
variant = "link"
>
{ __ ( 'Cancel' , 'woocommerce' ) }
< / Button >
< Button
onClick = { ( ) = >
sendEvent ( { type : 'DESIGN_WITH_AI' } )
}
variant = "primary"
>
{ __ ( 'Design with AI' , 'woocommerce' ) }
< / Button >
< / div >
< / DesignChangeWarningModal >
) }
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 >
< p >
{ __ (
'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'
) }
< / p >
< / div >
< div className = "woocommerce-customize-store-main" >
2023-09-30 00:17:36 +00:00
< div
className = { classNames (
'woocommerce-customize-store-banner' ,
{
'offline-banner' :
isNetworkOffline || isJetpackOffline ,
}
) }
>
2023-09-20 06:36:20 +00:00
< div
className = { ` woocommerce-customize-store-banner-content ` }
>
2023-09-30 00:17:36 +00:00
< h1 > { bannerTitle } < / h1 >
< p > { bannerText } < / p >
< Button
2023-09-29 23:03:50 +00:00
onClick = { ( ) = > {
2023-09-30 00:17:36 +00:00
if ( isJetpackOffline ) {
sendEvent ( {
type : 'JETPACK_OFFLINE_HOWTO' ,
} ) ;
} else if ( isNetworkOffline === false ) {
if (
activeThemeHasMods &&
! customizeStoreTaskCompleted
) {
setOpenDesignChangeWarningModal (
true
) ;
} else {
sendEvent ( {
type : 'DESIGN_WITH_AI' ,
} ) ;
}
2023-09-29 23:03:50 +00:00
}
} }
2023-09-30 00:17:36 +00:00
variant = {
isJetpackOffline ? 'link' : 'primary'
}
2023-09-20 06:36:20 +00:00
>
2023-09-30 00:17:36 +00:00
{ bannerButtonText }
< / Button >
2023-09-20 06:36:20 +00:00
< / div >
< / div >
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" >
{ themeCards ? . map ( ( themeCard ) = > (
2023-09-30 00:17:36 +00:00
< ThemeCard
2023-09-29 07:44:22 +00:00
key = { themeCard . slug }
2023-09-30 00:17:36 +00:00
slug = { themeCard . slug }
description = { themeCard . description }
image = { themeCard . image }
name = { themeCard . name }
colorPalettes = { themeCard . colorPalettes }
link = { themeCard ? . link }
isActive = { themeCard . isActive }
/ >
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
< / >
) ;
} ;