libs/core/runtime-utils/src/get-data-for-page.ts
[buildingBlockId: string]:
|
import { ValidationRule } from '@allianz/taly-core';
import {
BannerBlockConfiguration,
BuildingBlockConfiguration,
HeaderAction,
OverarchingDetailsBlockConfiguration,
PageConfigurationWithTransformedDynamicForms
} from '@allianz/taly-core/schemas';
import { PageInJourneyExampleData } from '@allianz/taly-core/showroom';
export interface PageConfigOverrides {
[buildingBlockId: string]: {
validators?: ValidationRule[];
resources?: { [key: string]: unknown };
};
}
export interface DataForPage {
[buildingBlockId: string]: BuildingBlockConfiguration;
}
/**
* Utility function to be used in a generated page to extract the meta data matching the given page id.
* @param {PartialPageConfig} pagesConfig the pages configuration
* @param {string} id the page id to get the data for
* @param {PageConfigOverrides} pageConfigOverrides additional page-specific data that overrides the page config
* @returns {DataForPage} Building Block data for a specific page, or empty object if no data could be found.
*/
export function getDataForPage(
pagesConfig: PageConfigurationWithTransformedDynamicForms[],
id: string,
pageConfigOverrides: PageConfigOverrides = {},
showroomDataForPage?: PageInJourneyExampleData
): DataForPage {
const page = pagesConfig.find((item) => item.id === id);
if (!page) {
console.warn(`Could not find data for page '${id}'`);
return {};
}
const blockData = getAllBlocks(page);
if (!blockData || blockData.length === 0) {
console.warn(
`Page '${id}' seems to be empty. Please add Building Blocks to this page or remove it.`
);
return {};
}
const blockOverrides = blockData.map((block) => {
const blockOverrides = pageConfigOverrides[block.id] ?? {};
return { ...block, ...blockOverrides };
}) as BuildingBlockConfiguration[];
const blockMap = getBlockMap(blockOverrides, showroomDataForPage);
return blockMap;
}
export function getBlockMap(
blocks: (
| BuildingBlockConfiguration
| HeaderAction
| OverarchingDetailsBlockConfiguration
| BannerBlockConfiguration
)[],
showroomData?: PageInJourneyExampleData
) {
const blockMap = blocks
.map((block) => {
const showroomResources = showroomData?.[block.id]?.resources;
if (!block.resources && showroomResources) {
return { ...block, resources: showroomResources };
}
return block;
})
.reduce((collection, item) => {
return {
...collection,
[item.id]: item
};
}, {});
return blockMap;
}
function getAllBlocks(page: PageConfigurationWithTransformedDynamicForms) {
const result: (
| BuildingBlockConfiguration
| OverarchingDetailsBlockConfiguration
| BannerBlockConfiguration
)[] = [];
result.push(...(page.blocks ?? []));
if (page.overarchingDetailsBlock) {
result.push(page.overarchingDetailsBlock);
}
if (page.bannerBlock) {
result.push(page.bannerBlock);
}
return result;
}