Skip to content

Commit 8d039d1

Browse files
authored
Pass down ancestors instead of computing them (#2635)
1 parent 87eea73 commit 8d039d1

File tree

3 files changed

+17
-27
lines changed

3 files changed

+17
-27
lines changed

packages/gitbook/src/app/(site)/(content)/[[...pathname]]/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export default async function Page(props: {
3535
customization,
3636
pages,
3737
page,
38+
ancestors,
3839
document,
3940
} = await getPageDataWithFallback({
4041
pagePathParams: params,
@@ -103,6 +104,7 @@ export default async function Page(props: {
103104
customization={customization}
104105
context={contentRefContext}
105106
page={page}
107+
ancestors={ancestors}
106108
document={document}
107109
withPageFeedback={
108110
// Display the page feedback in the page footer if the aside is not visible

packages/gitbook/src/components/PageBody/PageBody.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { getSpaceLanguage } from '@/intl/server';
1111
import { t } from '@/intl/translate';
1212
import { ContentTarget, SiteContentPointer, api } from '@/lib/api';
1313
import { hasFullWidthBlock, isNodeEmpty } from '@/lib/document';
14+
import { AncestorRevisionPage } from '@/lib/pages';
1415
import { ContentRefContext, resolveContentRef } from '@/lib/references';
1516
import { tcls } from '@/lib/tailwind';
1617
import { shouldTrackPageViews } from '@/lib/tracking';
@@ -31,6 +32,7 @@ export function PageBody(props: {
3132
contentTarget: ContentTarget;
3233
customization: CustomizationSettings | SiteCustomizationSettings;
3334
page: RevisionPageDocument;
35+
ancestors: AncestorRevisionPage[];
3436
document: JSONDocument | null;
3537
context: ContentRefContext;
3638
withPageFeedback: boolean;
@@ -42,6 +44,7 @@ export function PageBody(props: {
4244
customization,
4345
context,
4446
page,
47+
ancestors,
4548
document,
4649
withPageFeedback,
4750
} = props;
@@ -79,7 +82,7 @@ export function PageBody(props: {
7982
<PageCover as="hero" page={page} cover={page.cover} context={context} />
8083
) : null}
8184

82-
<PageHeader page={page} pages={context.pages} />
85+
<PageHeader page={page} ancestors={ancestors} pages={context.pages} />
8386
{document && !isNodeEmpty(document) ? (
8487
<React.Suspense
8588
fallback={

packages/gitbook/src/components/PageBody/PageHeader.tsx

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,32 @@
1-
import {
2-
RevisionPage,
3-
RevisionPageDocument,
4-
RevisionPageGroup,
5-
RevisionPageType,
6-
} from '@gitbook/api';
1+
import { RevisionPage, RevisionPageDocument } from '@gitbook/api';
72
import { Icon } from '@gitbook/icons';
83

94
import { pageHref } from '@/lib/links';
5+
import { AncestorRevisionPage } from '@/lib/pages';
106
import { tcls } from '@/lib/tailwind';
117

128
import { PageIcon } from '../PageIcon';
139
import { StyledLink } from '../primitives';
1410

15-
export function PageHeader(props: { page: RevisionPageDocument; pages: RevisionPage[] }) {
16-
const { page, pages } = props;
11+
export function PageHeader(props: {
12+
page: RevisionPageDocument;
13+
ancestors: AncestorRevisionPage[];
14+
pages: RevisionPage[];
15+
}) {
16+
const { page, ancestors, pages } = props;
1717

1818
if (!page.layout.title && !page.layout.description) {
1919
return null;
2020
}
2121

22-
const pathSegments = page.path.split('/').slice(0, -1); // Exclude the current page from the breadcrumbs
23-
const flattenedPages = flattenPages(pages);
24-
const breadcrumbs = pathSegments
25-
.map((pathSegment) =>
26-
flattenedPages.find((page) => 'slug' in page && page.slug == pathSegment),
27-
)
28-
.filter((page): page is RevisionPageDocument | RevisionPageGroup => page !== undefined);
29-
3022
return (
3123
<header
3224
className={tcls('max-w-3xl', 'mx-auto', 'mb-6', 'space-y-3', 'page-api-block:ml-0')}
3325
>
34-
{breadcrumbs?.length > 0 && (
26+
{ancestors.length > 0 && (
3527
<nav>
3628
<ol className={tcls('flex', 'flex-wrap', 'items-center', 'gap-2')}>
37-
{breadcrumbs.map((breadcrumb, index) => (
29+
{ancestors.map((breadcrumb, index) => (
3830
<>
3931
<li key={breadcrumb.id}>
4032
<StyledLink
@@ -58,7 +50,7 @@ export function PageHeader(props: { page: RevisionPageDocument; pages: RevisionP
5850
{breadcrumb.title}
5951
</StyledLink>
6052
</li>
61-
{index != breadcrumbs.length - 1 && (
53+
{index != ancestors.length - 1 && (
6254
<Icon
6355
icon="chevron-right"
6456
className={tcls(
@@ -87,10 +79,3 @@ export function PageHeader(props: { page: RevisionPageDocument; pages: RevisionP
8779
</header>
8880
);
8981
}
90-
91-
function flattenPages(pages: RevisionPage[]): RevisionPage[] {
92-
return pages.reduce<RevisionPage[]>((acc, page) => {
93-
const nestedPages = 'pages' in page && page.pages ? flattenPages(page.pages) : [];
94-
return acc.concat(page, ...nestedPages);
95-
}, []);
96-
}

0 commit comments

Comments
 (0)