Skip to content

Commit 3f3eedf

Browse files
committed
Remove hidden site spaces from navigation
Introduces filtering of hidden site spaces when parsing site context, sections, and groups. Ensures only visible site spaces are included unless they match the current site space ID, improving context accuracy for site structure handling.
1 parent b45feaf commit 3f3eedf

File tree

2 files changed

+60
-4
lines changed

2 files changed

+60
-4
lines changed

.changeset/three-melons-enjoy.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'gitbook': patch
3+
---
4+
5+
Remove hidden site spaces from navigation

packages/gitbook/src/lib/context.ts

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ export async function fetchSiteContextByIds(
259259
};
260260

261261
const sections = ids.siteSection
262-
? parseSiteSectionsAndGroups(siteStructure, ids.siteSection)
262+
? parseSiteSectionsAndGroups(siteStructure, ids.siteSection, ids.siteSpace)
263263
: null;
264264

265265
// Parse the current siteSpace and siteSpaces based on the site structure type.
@@ -274,7 +274,9 @@ export async function fetchSiteContextByIds(
274274
);
275275
}
276276

277-
return { siteSpaces, siteSpace };
277+
const visibleSiteSpaces = filterHiddenSiteSpaces(siteSpaces, ids.siteSpace);
278+
279+
return { siteSpaces: visibleSiteSpaces, siteSpace };
278280
}
279281

280282
if (siteStructure.type === 'sections') {
@@ -284,6 +286,7 @@ export async function fetchSiteContextByIds(
284286
);
285287

286288
const currentSection = sections.current;
289+
// hidden siteSpaces are already filtered in parseSiteSectionsAndGroups
287290
const siteSpaces = currentSection.siteSpaces;
288291
const siteSpace = currentSection.siteSpaces.find(
289292
(siteSpace) => siteSpace.id === ids.siteSpace
@@ -426,11 +429,59 @@ export function checkIsRootSiteContext(context: GitBookSiteContext): boolean {
426429
}
427430
}
428431

429-
function parseSiteSectionsAndGroups(structure: SiteStructure, siteSectionId: string) {
432+
/**
433+
* Filter out hidden site spaces from a list of site spaces.
434+
*/
435+
function filterHiddenSiteSpaces(siteSpaces: SiteSpace[], currentSiteSpaceId?: string): SiteSpace[] {
436+
return siteSpaces.filter(
437+
(siteSpace) => !siteSpace.hidden || siteSpace.id === currentSiteSpaceId
438+
);
439+
}
440+
441+
/**
442+
* Filter out hidden site spaces from sections and groups recursively.
443+
*/
444+
function filterHiddenSiteSpacesFromSections(
445+
sections: (SiteSection | SiteSectionGroup)[],
446+
currentSiteSpaceId?: string
447+
): (SiteSection | SiteSectionGroup)[] {
448+
return sections.map((item) => {
449+
if (item.object === 'site-section') {
450+
return {
451+
...item,
452+
siteSpaces: filterHiddenSiteSpaces(item.siteSpaces, currentSiteSpaceId),
453+
};
454+
}
455+
if (item.object === 'site-section-group') {
456+
return {
457+
...item,
458+
children: filterHiddenSiteSpacesFromSections(item.children, currentSiteSpaceId),
459+
};
460+
}
461+
return item;
462+
});
463+
}
464+
465+
function parseSiteSectionsAndGroups(
466+
structure: SiteStructure,
467+
siteSectionId: string,
468+
currentSiteSpaceId?: string
469+
) {
430470
const sectionsAndGroups = getSiteStructureSections(structure, { ignoreGroups: false });
471+
const filteredSectionsAndGroups = filterHiddenSiteSpacesFromSections(
472+
sectionsAndGroups,
473+
currentSiteSpaceId
474+
);
431475
const section = parseCurrentSection(structure, siteSectionId);
432476
assert(section, `couldn't find section "${siteSectionId}" in site structure`);
433-
return { list: sectionsAndGroups, current: section } satisfies SiteSections;
477+
const filteredSection = {
478+
...section,
479+
siteSpaces: filterHiddenSiteSpaces(section.siteSpaces, currentSiteSpaceId),
480+
};
481+
return {
482+
list: filteredSectionsAndGroups,
483+
current: filteredSection,
484+
} satisfies SiteSections;
434485
}
435486

436487
function parseCurrentSection(structure: SiteStructure, siteSectionId: string) {

0 commit comments

Comments
 (0)