46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { cache } from 'react';
|
|
|
|
import type { DocumentationPage } from 'contentlayer/generated';
|
|
import { allDocumentationPages } from 'contentlayer/generated';
|
|
|
|
import { buildDocumentationTree } from './build-documentation-tree';
|
|
|
|
/**
|
|
* Retrieves a specific documentation page from the page tree by its path.
|
|
*
|
|
* @param {string} pagePath - The path of the documentation page to retrieve.
|
|
* @returns {DocumentationPageWithChildren | undefined} The documentation page found in the tree, if any.
|
|
*/
|
|
export const getDocumentationPageTree = cache((pagePath: string) => {
|
|
const tree = buildDocumentationTree(allDocumentationPages);
|
|
|
|
type DocumentationPageWithChildren = DocumentationPage & {
|
|
previousPage?: DocumentationPage | null;
|
|
nextPage?: DocumentationPage | null;
|
|
children?: DocumentationPage[];
|
|
};
|
|
|
|
const findPageInTree = (
|
|
pages: DocumentationPageWithChildren[],
|
|
path: string,
|
|
): DocumentationPageWithChildren | undefined => {
|
|
for (const page of pages) {
|
|
if (page.resolvedPath === path) {
|
|
return page;
|
|
}
|
|
|
|
const hasChildren = page.children && page.children.length > 0;
|
|
|
|
if (hasChildren) {
|
|
const foundPage = findPageInTree(page.children ?? [], path);
|
|
|
|
if (foundPage) {
|
|
return foundPage;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
return findPageInTree(tree, pagePath);
|
|
});
|