54 lines
1.2 KiB
TypeScript
54 lines
1.2 KiB
TypeScript
|
/**
|
||
|
* External dependencies
|
||
|
*/
|
||
|
import { createContext, useCallback, useState } from '@wordpress/element';
|
||
|
import clsx from 'clsx';
|
||
|
|
||
|
/**
|
||
|
* Internal dependencies
|
||
|
*/
|
||
|
import './style.scss';
|
||
|
|
||
|
export enum SidebarNavigationAnimationDirection {
|
||
|
Forward = 'forward',
|
||
|
Back = 'back',
|
||
|
}
|
||
|
|
||
|
type SidebarNavigationContextType = {
|
||
|
navigate: ( direction: SidebarNavigationAnimationDirection ) => void;
|
||
|
};
|
||
|
|
||
|
export const SidebarNavigationContext =
|
||
|
createContext< SidebarNavigationContextType >( {
|
||
|
navigate: () => void 0,
|
||
|
} );
|
||
|
|
||
|
export function SidebarContent( { children }: { children: JSX.Element } ) {
|
||
|
const [ navState, setNavState ] = useState< {
|
||
|
direction: SidebarNavigationAnimationDirection | null;
|
||
|
} >( {
|
||
|
direction: null,
|
||
|
} );
|
||
|
|
||
|
const navigate = useCallback(
|
||
|
( direction: SidebarNavigationAnimationDirection ) => {
|
||
|
setNavState( { direction } );
|
||
|
},
|
||
|
[]
|
||
|
);
|
||
|
|
||
|
const wrapperCls = clsx(
|
||
|
'woocommerce-customize-store-edit-site-sidebar__screen-wrapper',
|
||
|
{
|
||
|
'slide-from-left': navState.direction === 'back',
|
||
|
'slide-from-right': navState.direction === 'forward',
|
||
|
}
|
||
|
);
|
||
|
|
||
|
return (
|
||
|
<SidebarNavigationContext.Provider value={ { navigate } }>
|
||
|
<div className={ wrapperCls }>{ children }</div>
|
||
|
</SidebarNavigationContext.Provider>
|
||
|
);
|
||
|
}
|