import { useEffect, useLayoutEffect, useState } from '@wordpress/element';
import { __, isRTL } from '@wordpress/i18n';
import { NavigationButton } from '@launch/components/NavigationButton';
import {
PagesSelect,
state as pagesSelectState,
} from '@launch/pages/PagesSelect';
import { useGlobalStore } from '@launch/state/Global';
import { usePagesStore } from '@launch/state/Pages';
import { useUserSelectionStore } from '@launch/state/user-selections';
import { RightCaret, LeftCaret } from '@launch/svg';
const PagesPageData = {
component: PagesSelect,
state: pagesSelectState,
};
export const PageControl = () => {
const {
currentPageIndex,
addPage,
removePage,
pages,
getPageState,
previousPage,
replaceHistory,
} = usePagesStore();
const { siteStructure } = useUserSelectionStore();
useLayoutEffect(() => {
// If we later add more structures, consider having predefined paths
if (siteStructure === 'multi-page') {
addPage('page-select', PagesPageData, 'layout');
return;
}
removePage('page-select');
}, [siteStructure, addPage, removePage]);
useEffect(() => {
const replaceStateHistory = () => {
history.state === null && replaceHistory(currentPageIndex);
};
window.addEventListener('load', replaceStateHistory);
const popstate = () => {
const page = currentPageIndex - 1;
if (page === -1) history.go(-1);
previousPage();
};
window.addEventListener('popstate', popstate);
return () => {
window.removeEventListener('popstate', popstate);
};
}, [previousPage, currentPageIndex, replaceHistory]);
const pagesList = Array.from(pages.entries());
// Some pages act as a notice or loading message and move on their own
if (!getPageState(pagesList[currentPageIndex][0])?.useNav) return null;
return (
);
};
const Steps = () => {
const { currentPageIndex, pages, getPageState } = usePagesStore();
const totalPages = usePagesStore((state) => state.count());
const pagesList = Array.from(pages.entries());
return (
{pagesList.map(([page], index) => {
const bgColor =
index < currentPageIndex ? 'bg-design-main' : 'bg-gray-200';
if (!getPageState(page)?.useNav) return null;
return (
{(index !== currentPageIndex && (
)) || (
)}
{index < totalPages - 1 && (
)}
);
})}
);
};
const PrevButton = () => {
const { previousPage, currentPageIndex } = usePagesStore();
const onFirstPage = currentPageIndex === 0;
if (onFirstPage) {
return (
(window.location.href = `${window.extSharedData.adminUrl}admin.php?page=extendify-assist`)
}
className="border-gray-200 bg-white text-design-main hover:bg-gray-50 focus:bg-gray-50">
<>
{isRTL() ? (
) : (
)}
{__('Exit Launch', 'extendify-local')}
>
);
}
return (
<>
{isRTL() ? (
) : (
)}
{__('Back', 'extendify-local')}
>
);
};
const NextButton = () => {
const { nextPage, currentPageIndex, pages } = usePagesStore();
const totalPages = usePagesStore((state) => state.count());
const onLastPage = currentPageIndex === totalPages - 1;
const currentPageKey = Array.from(pages.keys())[currentPageIndex];
const pageState = pages.get(currentPageKey).state;
const [canProgress, setCanProgress] = useState(false);
const [canSkip, setCanSkip] = useState(false);
const nextPageOrComplete = () => {
if (onLastPage) {
useGlobalStore.setState({ generating: true });
} else {
nextPage();
}
};
useEffect(() => {
const { ready, canSkip } = pageState?.getState() || {};
setCanSkip(canSkip ?? false);
setCanProgress(ready ?? false);
return pageState.subscribe((s) => {
setCanSkip(s.canSkip);
setCanProgress(s.ready);
});
}, [pageState, currentPageIndex]);
return canSkip ? (
nextPageOrComplete()}
data-test="back-button"
className="mr-2 border-gray-200 bg-white text-design-main hover:bg-gray-50 focus:bg-gray-50">
<>
{__('Skip', 'extendify-local')}
{isRTL() ? (
) : (
)}
>
) : (
<>
{__('Next', 'extendify-local')}
{isRTL() ? (
) : (
)}
>
);
};