48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
export default async function breadcrumbs(req, res, next) {
|
|
if (!req.context.page) return next()
|
|
if (req.context.page.hidden) return next()
|
|
|
|
req.context.breadcrumbs = []
|
|
|
|
// Return an empty array on the landing page.
|
|
if (req.context.page.documentType === 'homepage') {
|
|
return next()
|
|
}
|
|
|
|
const currentSiteTree =
|
|
req.context.siteTree[req.context.currentLanguage][req.context.currentVersion]
|
|
|
|
await createBreadcrumb(
|
|
// Array of child pages on the root, i.e., the product level.
|
|
currentSiteTree.childPages,
|
|
req.context
|
|
)
|
|
|
|
return next()
|
|
}
|
|
|
|
async function createBreadcrumb(pageArray, context) {
|
|
// Find each page in the siteTree's array of child pages that starts with the requested path.
|
|
let childPage = pageArray.find((page) => context.currentPath.startsWith(page.href))
|
|
|
|
// Fall back to English if needed
|
|
if (!childPage) {
|
|
childPage = pageArray.find((page) =>
|
|
context.currentPath.startsWith(page.href.replace(`/${context.currentLanguage}`, '/en'))
|
|
)
|
|
if (!childPage) return
|
|
}
|
|
|
|
context.breadcrumbs.push({
|
|
documentType: childPage.page.documentType,
|
|
href: childPage.href,
|
|
title: childPage.renderedShortTitle || childPage.renderedFullTitle,
|
|
})
|
|
|
|
// Recursively loop through the siteTree and create each breadcrumb, until we reach the
|
|
// point where the current siteTree page is the same as the requested page. Then stop.
|
|
if (childPage.childPages && context.currentPath !== childPage.href) {
|
|
createBreadcrumb(childPage.childPages, context)
|
|
}
|
|
}
|