diff --git a/mailpoet/assets/js/src/automation/editor/components/header/index.tsx b/mailpoet/assets/js/src/automation/editor/components/header/index.tsx index 79b047e5e9..02d7d5cc70 100644 --- a/mailpoet/assets/js/src/automation/editor/components/header/index.tsx +++ b/mailpoet/assets/js/src/automation/editor/components/header/index.tsx @@ -1,8 +1,9 @@ import { Button, Icon, NavigableMenu } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; import { wordpress } from '@wordpress/icons'; +import { PinnedItems } from '@wordpress/interface'; import { MoreMenu } from './more_menu'; -import { store } from '../../store'; +import { store, storeName } from '../../store'; // See: // https://github.com/WordPress/gutenberg/blob/9601a33e30ba41bac98579c8d822af63dd961488/packages/edit-post/src/components/header/index.js @@ -42,6 +43,7 @@ export function Header(): JSX.Element { + diff --git a/mailpoet/assets/js/src/automation/editor/components/sidebar/header.tsx b/mailpoet/assets/js/src/automation/editor/components/sidebar/header.tsx new file mode 100644 index 0000000000..3f30ee72f8 --- /dev/null +++ b/mailpoet/assets/js/src/automation/editor/components/sidebar/header.tsx @@ -0,0 +1,50 @@ +import { Button } from '@wordpress/components'; +import { useDispatch } from '@wordpress/data'; +import { stepSidebarKey, store, workflowSidebarKey } from '../../store'; + +// See: https://github.com/WordPress/gutenberg/blob/9601a33e30ba41bac98579c8d822af63dd961488/packages/edit-post/src/components/sidebar/settings-header/index.js + +type Props = { + sidebarKey: string; +}; + +export function Header({ sidebarKey }: Props): JSX.Element { + const { openSidebar } = useDispatch(store); + const openWorkflowSettings = () => openSidebar(workflowSidebarKey); + const openStepSettings = () => openSidebar(stepSidebarKey); + + const [workflowAriaLabel, workflowActiveClass] = + sidebarKey === workflowSidebarKey + ? ['Workflow (selected)', 'is-active'] + : ['Workflow', '']; + + const [stepAriaLabel, stepActiveClass] = + sidebarKey === stepSidebarKey + ? ['Step (selected)', 'is-active'] + : ['Step', '']; + + return ( + + ); +} diff --git a/mailpoet/assets/js/src/automation/editor/components/sidebar/index.tsx b/mailpoet/assets/js/src/automation/editor/components/sidebar/index.tsx index 241df3f459..f0df51921f 100644 --- a/mailpoet/assets/js/src/automation/editor/components/sidebar/index.tsx +++ b/mailpoet/assets/js/src/automation/editor/components/sidebar/index.tsx @@ -1,9 +1,21 @@ import { ComponentProps } from 'react'; +import { useSelect } from '@wordpress/data'; import { Platform } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { cog } from '@wordpress/icons'; -import { ComplementaryArea } from '@wordpress/interface'; -import { storeName } from '../../store'; +import { + ComplementaryArea, + store as interfaceStore, +} from '@wordpress/interface'; +import { Header } from './header'; +import { StepSidebar } from './step'; +import { WorkflowSidebar } from './workflow'; +import { + stepSidebarKey, + store, + storeName, + workflowSidebarKey, +} from '../../store'; // See: // https://github.com/WordPress/gutenberg/blob/5caeae34b3fb303761e3b9432311b26f4e5ea3a6/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js @@ -17,10 +29,20 @@ const sidebarActiveByDefault = Platform.select({ type Props = ComponentProps; export function Sidebar(props: Props): JSX.Element { + const { sidebarName } = useSelect( + (select) => ({ + sidebarName: + select(interfaceStore).getActiveComplementaryArea(storeName) ?? + workflowSidebarKey, + }), + [], + ); + const workflowName = 'Testing workflow'; return ( } closeLabel={__('Close settings')} headerClassName="edit-post-sidebar__panel-tabs" title={__('Settings')} @@ -32,7 +54,8 @@ export function Sidebar(props: Props): JSX.Element { isActiveByDefault={sidebarActiveByDefault} {...props} > - Sidebar + {sidebarName === workflowSidebarKey && } + {sidebarName === stepSidebarKey && } ); } diff --git a/mailpoet/assets/js/src/automation/editor/components/sidebar/step/index.tsx b/mailpoet/assets/js/src/automation/editor/components/sidebar/step/index.tsx new file mode 100644 index 0000000000..865af406c0 --- /dev/null +++ b/mailpoet/assets/js/src/automation/editor/components/sidebar/step/index.tsx @@ -0,0 +1,5 @@ +import { PanelBody } from '@wordpress/components'; + +export function StepSidebar(): JSX.Element { + return Step settings; +} diff --git a/mailpoet/assets/js/src/automation/editor/components/sidebar/workflow/index.tsx b/mailpoet/assets/js/src/automation/editor/components/sidebar/workflow/index.tsx new file mode 100644 index 0000000000..fdf9c1b34f --- /dev/null +++ b/mailpoet/assets/js/src/automation/editor/components/sidebar/workflow/index.tsx @@ -0,0 +1,5 @@ +import { PanelBody } from '@wordpress/components'; + +export function WorkflowSidebar(): JSX.Element { + return Workflow settings; +} diff --git a/mailpoet/assets/js/src/automation/editor/index.tsx b/mailpoet/assets/js/src/automation/editor/index.tsx index 24ea8476af..a74082e8f6 100644 --- a/mailpoet/assets/js/src/automation/editor/index.tsx +++ b/mailpoet/assets/js/src/automation/editor/index.tsx @@ -14,9 +14,13 @@ import { store, storeName } from './store'; // See: https://github.com/WordPress/gutenberg/blob/9601a33e30ba41bac98579c8d822af63dd961488/packages/edit-post/src/components/layout/index.js function Editor(): JSX.Element { - const { isFullscreenActive } = useSelect( + const { + isFullscreenActive, + isSidebarOpened, + } = useSelect( (select) => ({ isFullscreenActive: select(store).isFeatureActive('fullscreenMode'), + isSidebarOpened: select(store).isSidebarOpened(), }), [], ); @@ -24,6 +28,9 @@ function Editor(): JSX.Element { const className = classnames( 'edit-post-layout', 'interface-interface-skeleton', + { + 'is-sidebar-opened': isSidebarOpened, + }, ); return ( diff --git a/mailpoet/assets/js/src/automation/editor/store/actions.ts b/mailpoet/assets/js/src/automation/editor/store/actions.ts index 5577c32af1..bbfa40b1b3 100644 --- a/mailpoet/assets/js/src/automation/editor/store/actions.ts +++ b/mailpoet/assets/js/src/automation/editor/store/actions.ts @@ -1,7 +1,18 @@ +import { store as interfaceStore } from '@wordpress/interface'; import { store as preferencesStore } from '@wordpress/preferences'; import { storeName } from './constants'; import { Feature } from './types'; +export const openSidebar = + (key) => + ({ registry }) => + registry.dispatch(interfaceStore).enableComplementaryArea(storeName, key); + +export const closeSidebar = + () => + ({ registry }) => + registry.dispatch(interfaceStore).disableComplementaryArea(storeName); + export const toggleFeature = (feature: Feature) => ({ registry }) => diff --git a/mailpoet/assets/js/src/automation/editor/store/constants.ts b/mailpoet/assets/js/src/automation/editor/store/constants.ts index cbf753e12b..542d1568e5 100644 --- a/mailpoet/assets/js/src/automation/editor/store/constants.ts +++ b/mailpoet/assets/js/src/automation/editor/store/constants.ts @@ -1 +1,4 @@ export const storeName = 'mailpoet/automation-editor'; + +export const workflowSidebarKey = 'mailpoet/automation-editor/workflow'; +export const stepSidebarKey = 'mailpoet/automation-editor/step'; diff --git a/mailpoet/assets/js/src/automation/editor/store/selectors.ts b/mailpoet/assets/js/src/automation/editor/store/selectors.ts index 623fd7a577..83f4921dca 100644 --- a/mailpoet/assets/js/src/automation/editor/store/selectors.ts +++ b/mailpoet/assets/js/src/automation/editor/store/selectors.ts @@ -1,4 +1,5 @@ import { createRegistrySelector } from '@wordpress/data'; +import { store as interfaceStore } from '@wordpress/interface'; import { store as preferencesStore } from '@wordpress/preferences'; import { storeName } from './constants'; import { Feature } from './types'; @@ -8,3 +9,8 @@ export const isFeatureActive = createRegistrySelector( (_, feature: Feature): boolean => select(preferencesStore).get(storeName, feature), ); + +export const isSidebarOpened = createRegistrySelector( + (select) => (): boolean => + !!select(interfaceStore).getActiveComplementaryArea(storeName), +); diff --git a/mailpoet/assets/js/src/types/index.ts b/mailpoet/assets/js/src/types/index.ts index e0faa0c496..d51c42f478 100644 --- a/mailpoet/assets/js/src/types/index.ts +++ b/mailpoet/assets/js/src/types/index.ts @@ -1,4 +1,5 @@ import { ColorPalette, FontSizePicker } from '@wordpress/components'; +import { store as interfaceStore } from '@wordpress/interface'; import { store as preferencesStore } from '@wordpress/preferences'; import './wordpress_modules'; @@ -42,8 +43,14 @@ declare module '@wordpress/block-editor' { } declare module '@wordpress/data' { + type InterfaceStore = 'core/interface' | typeof interfaceStore; type PreferencesStore = 'core/preferences' | typeof preferencesStore; + // there are no @types/wordpress__interface yet + function select(key: InterfaceStore): { + getActiveComplementaryArea: (scope: string) => string | undefined | null; + }; + // there are no @types/wordpress__preferences yet function select(key: PreferencesStore): { get: (scope: string, name: string) => T; diff --git a/mailpoet/assets/js/src/types/wordpress_modules.ts b/mailpoet/assets/js/src/types/wordpress_modules.ts index 5cd526fe66..ce016b91f4 100644 --- a/mailpoet/assets/js/src/types/wordpress_modules.ts +++ b/mailpoet/assets/js/src/types/wordpress_modules.ts @@ -1,11 +1,16 @@ /* eslint-disable @typescript-eslint/no-explicit-any -- some general types in this file need to use "any" */ +/* eslint-disable import/no-duplicates -- importing within multiple "declare module" blocks is OK */ // there are no @types/wordpress__interface yet declare module '@wordpress/interface' { + import { StoreDescriptor } from '@wordpress/data'; + + export const store: { name: 'core/interface' } & StoreDescriptor; export const ComplementaryArea: any; export const FullscreenMode: any; export const MoreMenuDropdown: any; export const InterfaceSkeleton: any; + export const PinnedItems: any; } // there are no @types/wordpress__preferences yet