"use client" import type { ReactNode } from "react" import type { FolderTreeNode } from "@/lib/sidebar-nav-data" import type { NavItemPrefs } from "@/lib/sidebar-nav-context" import { SidebarFolderRowExpanded, type SidebarFolderRowExpandedProps, } from "@/components/gmail/sidebar/sidebar-folder-row-expanded" export type SidebarFolderRowContextProps = Omit< SidebarFolderRowExpandedProps, "node" | "depth" > import { SidebarFolderButtonCollapsed } from "@/components/gmail/sidebar/sidebar-folder-button-collapsed" export function sidebarVisibleFolderNodes( nodes: FolderTreeNode[], getNavItemPrefs: (id: string) => Required>, folderUnreadCounts: Record ): FolderTreeNode[] { return nodes.filter((node) => { const p = getNavItemPrefs(node.id) if (p.sidebar === "hide") return false if ( p.sidebar === "showUnread" && (folderUnreadCounts[node.id] ?? 0) === 0 ) { return false } return true }) } export function renderExpandedFolderSubtree( nodes: FolderTreeNode[], depth: number, props: SidebarFolderRowContextProps ): ReactNode { const { expandedFolderIds, getNavItemPrefs, folderUnreadCounts } = props return sidebarVisibleFolderNodes(nodes, getNavItemPrefs, folderUnreadCounts).map( (node) => { const isBranchOpen = expandedFolderIds.has(node.id) const kids = node.children return (
{kids?.length && isBranchOpen ? (
{renderExpandedFolderSubtree(kids, depth + 1, props)}
) : null}
) } ) } export function renderCollapsedFolderList( nodes: FolderTreeNode[], opts: { getNavItemPrefs: (id: string) => Required> folderUnreadCounts: Record expandedFolderIds: Set isExpanded: boolean selectedFolder: string onSelectFolder: (id: string) => void } ): ReactNode { const walk = (list: FolderTreeNode[]): ReactNode[] => { const out: ReactNode[] = [] for (const node of sidebarVisibleFolderNodes( list, opts.getNavItemPrefs, opts.folderUnreadCounts )) { out.push( ) if (node.children?.length && opts.expandedFolderIds.has(node.id)) { out.push(...walk(node.children)) } } return out } return walk(nodes) }