/**
* External dependencies
*/
import { __ } from '@wordpress/i18n';
import { recordEvent } from '@woocommerce/tracks';
import { createRoot, render, unmountComponentAtNode } from '@wordpress/element';
/**
* Internal dependencies
*/
import PageTabs from './page-tabs';
import PresetsTab from './presets';
import { TRACKS_PREFIX } from './settings';
/**
* Insert root DOM element for tabs root.
*
* @return {HTMLDivElement} The root element for workflow tabs.
*/
const insertTabsRootDomElement = () => {
const rootElement = document.createElement( 'div' );
rootElement.setAttribute( 'id', 'automatewoo-workflow-tabs-root' );
const headerEnd = document.querySelector(
'#wpbody-content .wrap > h2.screen-reader-text'
);
headerEnd.parentNode.insertBefore( rootElement, headerEnd );
return rootElement;
};
const getHash = () => {
return window.location.hash.substr( 1 );
};
/**
* Hide WelcomeNotice when we are in Presets tab.
*/
const maybeHideWelcomeNotice = () => {
const welcomeNotice = document.querySelector(
'.automatewoo-welcome-notice'
);
if ( ! welcomeNotice ) {
return;
}
if ( getHash() === 'presets' ) {
welcomeNotice.style.display = 'none';
} else {
welcomeNotice.style.display = 'block';
}
};
const recordTracksTabViewEvent = ( tab ) => {
recordEvent( TRACKS_PREFIX + 'workflow_tab_view', { tab } );
};
const loadTabHandler = ( defaultTabName, tabs ) => {
let currentTab;
let reactTabsRoot;
const tabsRootEl = insertTabsRootDomElement();
const hackyUpdateAllWorkflowsTabVisibility = ( tabName ) => {
const elements = [
document.querySelector( '#wpbody-content .subsubsub' ),
document.querySelector( '#wpbody-content #posts-filter' ),
];
const display = tabName === defaultTabName ? 'block' : 'none';
elements.forEach( ( item ) => {
item.style.display = display;
} );
};
const onTabSelect = ( tabName ) => {
currentTab = tabName;
// Set the hash to remember the open tab
window.location.hash = tabName;
hackyUpdateAllWorkflowsTabVisibility( tabName );
recordTracksTabViewEvent( tabName );
};
const getTabContent = ( tab ) => {
maybeHideWelcomeNotice();
if ( tab.name === 'presets' ) {
return ;
}
};
const renderPageTabs = ( tabName ) => {
// If the tab doesn't exist use current or default
if ( ! tabs.find( ( tab ) => tab.name === tabName ) ) {
tabName = currentTab || defaultTabName;
}
currentTab = tabName;
const pageTabs = (
{ getTabContent }
);
if ( typeof createRoot !== 'undefined' ) {
// compatibility-code "WP >= 6.2" -- React >= 18
reactTabsRoot = createRoot( tabsRootEl );
reactTabsRoot.render( pageTabs );
} else {
// compatibility-code "WP < 6.2" -- React < 18
render( pageTabs, tabsRootEl );
}
recordTracksTabViewEvent( tabName );
hackyUpdateAllWorkflowsTabVisibility( tabName );
};
const handleHashChange = () => {
const tabName = getHash();
if ( tabName === currentTab ) {
// Tab name has not changed
return;
}
// Hack: Unmount and rerender tabs because we can't programmatically change the current tab
if ( typeof createRoot !== 'undefined' ) {
// compatibility-code "WP >= 6.2" -- React >= 18
if ( reactTabsRoot ) {
reactTabsRoot.unmount();
reactTabsRoot = null;
}
} else {
// compatibility-code "WP < 6.2" -- React < 18
unmountComponentAtNode( tabsRootEl );
}
renderPageTabs( tabName );
};
// Init
window.addEventListener( 'hashchange', handleHashChange, false );
renderPageTabs( getHash() );
};
if ( /edit.php.+post_type=aw_workflow/.test( window.location.href ) ) {
document.addEventListener(
'DOMContentLoaded',
() => {
loadTabHandler( 'workflows', [
{
name: 'workflows',
title: __( 'My workflows', 'automatewoo' ),
},
{
name: 'presets',
title: __( 'Browse presets', 'automatewoo' ),
},
] );
},
false
);
}