2023-08-28 01:28:05 +00:00
|
|
|
// Reference: https://github.com/WordPress/gutenberg/tree/v16.4.0/packages/edit-site/src/components/layout/index.js
|
|
|
|
/* eslint-disable @woocommerce/dependency-group */
|
|
|
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
|
|
|
import classnames from 'classnames';
|
|
|
|
import {
|
|
|
|
useReducedMotion,
|
|
|
|
useResizeObserver,
|
|
|
|
useViewportMatch,
|
|
|
|
} from '@wordpress/compose';
|
|
|
|
import { __ } from '@wordpress/i18n';
|
2023-09-05 06:21:19 +00:00
|
|
|
import { useState } from '@wordpress/element';
|
2023-08-28 01:28:05 +00:00
|
|
|
import {
|
|
|
|
// @ts-ignore No types for this exist yet.
|
|
|
|
__unstableMotion as motion,
|
|
|
|
} from '@wordpress/components';
|
|
|
|
import {
|
|
|
|
privateApis as blockEditorPrivateApis,
|
|
|
|
// @ts-ignore No types for this exist yet.
|
|
|
|
} from '@wordpress/block-editor';
|
|
|
|
// @ts-ignore No types for this exist yet.
|
|
|
|
import useInitEditedEntityFromURL from '@wordpress/edit-site/build-module/components/sync-state-with-url/use-init-edited-entity-from-url';
|
|
|
|
// @ts-ignore No types for this exist yet.
|
|
|
|
import { useIsSiteEditorLoading } from '@wordpress/edit-site/build-module/components/layout/hooks';
|
|
|
|
// @ts-ignore No types for this exist yet.
|
|
|
|
import ErrorBoundary from '@wordpress/edit-site/build-module/components/error-boundary';
|
|
|
|
// @ts-ignore No types for this exist yet.
|
|
|
|
import { unlock } from '@wordpress/edit-site/build-module/lock-unlock';
|
|
|
|
// @ts-ignore No types for this exist yet.
|
|
|
|
import { NavigableRegion } from '@wordpress/interface';
|
2023-09-05 06:21:19 +00:00
|
|
|
|
2023-08-28 01:28:05 +00:00
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
|
|
|
import { Editor } from './editor';
|
|
|
|
import Sidebar from './sidebar';
|
|
|
|
import { SiteHub } from './site-hub';
|
2023-09-05 06:21:19 +00:00
|
|
|
import { LogoBlockContext } from './logo-block-context';
|
|
|
|
import ResizableFrame from './resizable-frame';
|
2023-09-05 07:12:04 +00:00
|
|
|
import { OnboardingTour, useOnboardingTour } from './onboarding-tour';
|
2023-08-28 01:28:05 +00:00
|
|
|
|
|
|
|
const { useGlobalStyle } = unlock( blockEditorPrivateApis );
|
|
|
|
|
|
|
|
const ANIMATION_DURATION = 0.5;
|
|
|
|
|
|
|
|
export const Layout = () => {
|
2023-09-05 06:21:19 +00:00
|
|
|
const [ logoBlock, setLogoBlock ] = useState< {
|
|
|
|
clientId: string | null;
|
|
|
|
isLoading: boolean;
|
|
|
|
} >( {
|
|
|
|
clientId: null,
|
|
|
|
isLoading: true,
|
|
|
|
} );
|
2023-08-28 01:28:05 +00:00
|
|
|
// This ensures the edited entity id and type are initialized properly.
|
|
|
|
useInitEditedEntityFromURL();
|
2023-09-05 07:12:04 +00:00
|
|
|
const { shouldTourBeShown, ...onboardingTourProps } = useOnboardingTour();
|
2023-08-28 01:28:05 +00:00
|
|
|
|
|
|
|
const isMobileViewport = useViewportMatch( 'medium', '<' );
|
|
|
|
const disableMotion = useReducedMotion();
|
|
|
|
const [ canvasResizer, canvasSize ] = useResizeObserver();
|
|
|
|
const isEditorLoading = useIsSiteEditorLoading();
|
2023-09-05 06:21:19 +00:00
|
|
|
const [ isResizableFrameOversized, setIsResizableFrameOversized ] =
|
|
|
|
useState( false );
|
2023-08-28 01:28:05 +00:00
|
|
|
const [ backgroundColor ] = useGlobalStyle( 'color.background' );
|
|
|
|
const [ gradientValue ] = useGlobalStyle( 'color.gradient' );
|
|
|
|
|
|
|
|
return (
|
2023-09-05 06:21:19 +00:00
|
|
|
<LogoBlockContext.Provider
|
|
|
|
value={ {
|
|
|
|
logoBlock,
|
|
|
|
setLogoBlock,
|
|
|
|
} }
|
|
|
|
>
|
|
|
|
<div className={ classnames( 'edit-site-layout' ) }>
|
|
|
|
<motion.div
|
|
|
|
className="edit-site-layout__header-container"
|
|
|
|
animate={ 'view' }
|
2023-08-28 01:28:05 +00:00
|
|
|
>
|
2023-09-05 06:21:19 +00:00
|
|
|
<SiteHub
|
|
|
|
as={ motion.div }
|
|
|
|
variants={ {
|
|
|
|
view: { x: 0 },
|
2023-08-28 01:28:05 +00:00
|
|
|
} }
|
2023-09-05 06:21:19 +00:00
|
|
|
isTransparent={ false }
|
|
|
|
className="edit-site-layout__hub"
|
|
|
|
/>
|
|
|
|
</motion.div>
|
2023-08-28 01:28:05 +00:00
|
|
|
|
2023-09-05 06:21:19 +00:00
|
|
|
<div className="edit-site-layout__content">
|
|
|
|
<NavigableRegion
|
|
|
|
ariaLabel={ __( 'Navigation', 'woocommerce' ) }
|
|
|
|
className="edit-site-layout__sidebar-region"
|
2023-08-28 01:28:05 +00:00
|
|
|
>
|
2023-09-05 06:21:19 +00:00
|
|
|
<motion.div
|
|
|
|
animate={ { opacity: 1 } }
|
|
|
|
transition={ {
|
|
|
|
type: 'tween',
|
|
|
|
duration:
|
|
|
|
// Disable transitiont in mobile to emulate a full page transition.
|
|
|
|
disableMotion || isMobileViewport
|
2023-08-28 01:28:05 +00:00
|
|
|
? 0
|
|
|
|
: ANIMATION_DURATION,
|
2023-09-05 06:21:19 +00:00
|
|
|
ease: 'easeOut',
|
|
|
|
} }
|
|
|
|
className="edit-site-layout__sidebar"
|
|
|
|
>
|
|
|
|
<Sidebar />
|
|
|
|
</motion.div>
|
|
|
|
</NavigableRegion>
|
|
|
|
|
|
|
|
{ ! isMobileViewport && (
|
|
|
|
<div
|
|
|
|
className={ classnames(
|
|
|
|
'edit-site-layout__canvas-container'
|
|
|
|
) }
|
|
|
|
>
|
|
|
|
{ canvasResizer }
|
|
|
|
{ !! canvasSize.width && (
|
|
|
|
<motion.div
|
|
|
|
whileHover={ {
|
|
|
|
scale: 1.005,
|
|
|
|
transition: {
|
|
|
|
duration: disableMotion ? 0 : 0.5,
|
|
|
|
ease: 'easeOut',
|
|
|
|
},
|
|
|
|
} }
|
|
|
|
initial={ false }
|
|
|
|
layout="position"
|
|
|
|
className={ classnames(
|
|
|
|
'edit-site-layout__canvas'
|
|
|
|
) }
|
|
|
|
transition={ {
|
|
|
|
type: 'tween',
|
|
|
|
duration: disableMotion
|
|
|
|
? 0
|
|
|
|
: ANIMATION_DURATION,
|
|
|
|
ease: 'easeOut',
|
|
|
|
} }
|
|
|
|
>
|
|
|
|
<ErrorBoundary>
|
|
|
|
<ResizableFrame
|
|
|
|
isReady={ ! isEditorLoading }
|
2023-09-05 07:12:04 +00:00
|
|
|
duringGuideTour={
|
|
|
|
shouldTourBeShown &&
|
|
|
|
! onboardingTourProps.showWelcomeTour
|
|
|
|
}
|
2023-09-05 06:21:19 +00:00
|
|
|
isFullWidth={ false }
|
|
|
|
defaultSize={ {
|
|
|
|
width:
|
|
|
|
canvasSize.width -
|
|
|
|
24 /* $canvas-padding */,
|
|
|
|
height: canvasSize.height,
|
|
|
|
} }
|
|
|
|
isOversized={
|
|
|
|
isResizableFrameOversized
|
|
|
|
}
|
|
|
|
setIsOversized={
|
|
|
|
setIsResizableFrameOversized
|
|
|
|
}
|
|
|
|
innerContentStyle={ {
|
|
|
|
background:
|
|
|
|
gradientValue ??
|
|
|
|
backgroundColor,
|
|
|
|
} }
|
|
|
|
>
|
|
|
|
<Editor
|
|
|
|
isLoading={ isEditorLoading }
|
|
|
|
/>
|
|
|
|
</ResizableFrame>
|
|
|
|
</ErrorBoundary>
|
|
|
|
</motion.div>
|
|
|
|
) }
|
|
|
|
</div>
|
|
|
|
) }
|
|
|
|
</div>
|
2023-08-28 01:28:05 +00:00
|
|
|
</div>
|
2023-09-05 07:12:04 +00:00
|
|
|
{ shouldTourBeShown && (
|
|
|
|
<OnboardingTour { ...onboardingTourProps } />
|
|
|
|
) }
|
2023-09-05 06:21:19 +00:00
|
|
|
</LogoBlockContext.Provider>
|
2023-08-28 01:28:05 +00:00
|
|
|
);
|
|
|
|
};
|