import { PageConfiguration } from '@allianz/taly-core/schemas';
import type { PagesJsonSchema, PfeJsonSchema } from '../../../../lib/model';
interface Page {
pageData: PageConfiguration;
previousItem?: PageConfiguration;
nextItem?: PageConfiguration;
}
export function createDefaultPFEConfig(pagesConfig: PagesJsonSchema): PfeJsonSchema {
const pfeConfig = {
navConfiguration: createPagesNavConfiguration(pagesConfig.pages),
appConfiguration: {
pfeConfig: {
validationErrorStateKey: 'validationErrorData',
backButtonLabel: 'Back',
nextButtonLabel: 'Next'
}
}
};
return pfeConfig;
}
export function createPagesNavConfiguration(pages: PageConfiguration[]) {
const pageItemsWithPrevNext: Page[] = Array.from(pageWalker(pages));
const pageConfigList = pageItemsWithPrevNext.map(({ pageData, nextItem }) => {
return singleNavigationPageConfig(pageData, nextItem);
});
return {
pages: pageConfigList
};
}
/**
* create a single pfe navigation config node, with minimal content to point to next page
*/
function singleNavigationPageConfig(
pageData: PageConfiguration,
nextPage: PageConfiguration | null = null
) {
const nextOptionList = [];
if (nextPage) {
nextOptionList.push({
nextPageId: nextPage.id
});
}
return {
pageId: pageData.id,
nextOptionList
};
}
/**
* support utility to enrich a given page array with previous and next pages pointers
*/
function* pageWalker(pages: PageConfiguration[]) {
for (const [index, pageData] of pages.entries()) {
const previousItem = pages[index - 1];
const nextItem = pages[index + 1];
yield { pageData, previousItem, nextItem };
}
}