import type { NativeStackHeaderItem, NativeStackHeaderItemMenu, } from "@react-navigation/native-stack"; import type { HomeListFilterMenu } from "../home/home-list-filter-menu"; import { withNativeGlassHeaderItem } from "../layout/native-glass-header-items"; type NativeHeaderMenuItems = NativeStackHeaderItemMenu["menu"]["items"]; type NativeHeaderIcon = NonNullable["icon"]>; function sfSymbolIcon(name: string): NativeHeaderIcon { return { type: "sfSymbol", name: name as never }; } function toNativeHeaderMenuItems(items: HomeListFilterMenu["items"]): NativeHeaderMenuItems { return items.map((item) => item.type === "action" ? { type: "action" as const, label: item.title, description: item.subtitle, onPress: item.onPress, state: item.state === "on" ? ("on" as const) : undefined, } : { type: "submenu" as const, label: item.title, items: toNativeHeaderMenuItems(item.items), }, ); } /** * Right-side UINavigationBar items for the sidebar column: the thread list * filter/sort menu plus the settings button, sharing one glass capsule — * the Messages-style grouped header buttons. */ export function createSidebarHeaderItems(input: { readonly filterIcon: string; readonly filterMenu: HomeListFilterMenu; readonly onOpenSettings: () => void; }): NativeStackHeaderItem[] { return [ withNativeGlassHeaderItem({ type: "menu", label: "", accessibilityLabel: "Filter and sort threads", icon: sfSymbolIcon(input.filterIcon), menu: { title: input.filterMenu.title, items: toNativeHeaderMenuItems(input.filterMenu.items), }, }), withNativeGlassHeaderItem({ type: "button", label: "", accessibilityLabel: "Open settings", icon: sfSymbolIcon("gearshape"), onPress: input.onOpenSettings, }), ]; }