63 lines · 1.9 KB · TypeScript
RawDownload
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<Extract<NativeStackHeaderItem, { type: "button" }>["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,    }),  ];}