Resolve sections in reusable content block

This commit is contained in:
taranvohra
2025-02-24 19:38:55 +05:30
parent a820739bd2
commit 303432ef9d
2 changed files with 31 additions and 2 deletions
@@ -252,7 +252,9 @@ export async function PageAside(props: {
async function PageAsideSections(props: { document: JSONDocument; context: ContentRefContext }) {
const { document, context } = props;
const sections = await getDocumentSections(document, (ref) => resolveContentRef(ref, context));
const sections = await getDocumentSections(context.space, document, (ref) =>
resolveContentRef(ref, context),
);
return sections.length > 1 ? <ScrollSectionsList sections={sections} /> : null;
}
+28 -1
View File
@@ -1,5 +1,6 @@
import { JSONDocument, ContentRef } from '@gitbook/api';
import { JSONDocument, ContentRef, Space } from '@gitbook/api';
import { getDocument } from './api';
import { getNodeText } from './document';
import { fetchOpenAPIBlock } from './openapi/fetch';
import { ResolvedContentRef } from './references';
@@ -16,6 +17,7 @@ export interface DocumentSection {
* Extract a list of sections from a document.
*/
export async function getDocumentSections(
space: Space,
document: JSONDocument,
resolveContentRef: (ref: ContentRef) => Promise<ResolvedContentRef | null>,
): Promise<DocumentSection[]> {
@@ -49,6 +51,31 @@ export async function getDocumentSections(
});
}
}
if (block.type === 'reusable-content') {
const resolved = await resolveContentRef(block.data.ref);
const documentId = resolved?.reusableContent?.document;
if (!documentId) {
throw new Error(`Expected a document ID for reusable content block`);
}
const document = await getDocument(space.id, documentId);
if (!document) {
throw new Error(`Document not found for reusable content block`);
}
const resuableContentSections = await getDocumentSections(
space,
document,
resolveContentRef,
);
sections.push(
...resuableContentSections.map((section) => ({
...section,
depth: section.depth + depth,
})),
);
}
}
return sections;