import type { EnvironmentId, SidebarProjectGroupingMode, SidebarThreadSortOrder, } from "@t3tools/contracts"; import { NativeHeaderToolbar, NativeStackScreenOptions } from "../../native/StackHeader"; import { useCallback, useRef } from "react"; import { Platform } from "react-native"; import type { SearchBarCommands } from "react-native-screens"; import { nativeHeaderScrollEdgeEffects } from "../../native/StackHeader"; import { useThemeColor } from "../../lib/useThemeColor"; import { useHardwareKeyboardCommand } from "../keyboard/hardwareKeyboardCommands"; import { withNativeGlassHeaderItem } from "../layout/native-glass-header-items"; import { createNativeMailSearchToolbarItem } from "../layout/native-mail-search-toolbar"; import type { HomeProjectSortOrder } from "./homeThreadList"; import { buildHomeListFilterMenu, type HomeListFilterMenuEnvironment, } from "./home-list-filter-menu"; import { hasCustomHomeListOptions, PROJECT_GROUPING_OPTIONS, PROJECT_SORT_OPTIONS, THREAD_SORT_OPTIONS, } from "./home-list-options"; export type HomeHeaderEnvironment = HomeListFilterMenuEnvironment; const HEADER_SCROLL_EDGE_EFFECTS = nativeHeaderScrollEdgeEffects(Platform.OS, Platform.Version); export function HomeHeader(props: { readonly environments: ReadonlyArray; readonly selectedEnvironmentId: EnvironmentId | null; readonly projectSortOrder: HomeProjectSortOrder; readonly threadSortOrder: SidebarThreadSortOrder; readonly projectGroupingMode: SidebarProjectGroupingMode; readonly onSearchQueryChange: (query: string) => void; readonly onEnvironmentChange: (environmentId: EnvironmentId | null) => void; readonly onProjectSortOrderChange: (sortOrder: HomeProjectSortOrder) => void; readonly onThreadSortOrderChange: (sortOrder: SidebarThreadSortOrder) => void; readonly onProjectGroupingModeChange: (mode: SidebarProjectGroupingMode) => void; readonly onOpenSettings: () => void; readonly onStartNewTask: () => void; }) { const searchBarRef = useRef(null); const iconColor = useThemeColor("--color-icon"); const hasCustomListOptions = hasCustomHomeListOptions(props); const focusSearch = useCallback(() => { searchBarRef.current?.focus(); return searchBarRef.current !== null; }, []); useHardwareKeyboardCommand("focusSearch", focusSearch); const filterMenu = buildHomeListFilterMenu(props); return ( <> [ withNativeGlassHeaderItem({ accessibilityLabel: "Open settings", icon: { name: "ellipsis", type: "sfSymbol" } as const, identifier: "home-settings", label: "", onPress: props.onOpenSettings, type: "button", }), ] : undefined, unstable_headerToolbarItems: Platform.OS === "ios" ? () => [ createNativeMailSearchToolbarItem({ composeButtonId: "home-new-task", composeSystemImageName: "square.and.pencil", filterMenu, filterButtonId: "home-filter", filterSystemImageName: hasCustomListOptions ? "line.3.horizontal.decrease.circle.fill" : "line.3.horizontal.decrease", onComposePress: props.onStartNewTask, onSearchTextChange: props.onSearchQueryChange, placeholder: "Search", searchTextChangeId: "home-search-text", }), ] : undefined, headerSearchBarOptions: Platform.OS === "ios" ? undefined : { ref: searchBarRef, allowToolbarIntegration: true, hideNavigationBar: false, placeholder: "Search", onCancelButtonPress: () => { props.onSearchQueryChange(""); }, onChangeText: (event) => { props.onSearchQueryChange(event.nativeEvent.text); }, }, }} /> {Platform.OS === "ios" ? null : ( )} {Platform.OS === "ios" ? null : ( Settings Environment props.onEnvironmentChange(null)} subtitle="Show threads from every environment" > All environments {props.environments.map((environment) => ( props.onEnvironmentChange(environment.environmentId)} > {environment.label} ))} Sort projects {PROJECT_SORT_OPTIONS.map((option) => ( props.onProjectSortOrderChange(option.value)} > {option.label} ))} Sort threads {THREAD_SORT_OPTIONS.map((option) => ( props.onThreadSortOrderChange(option.value)} > {option.label} ))} Group projects {PROJECT_GROUPING_OPTIONS.map((option) => ( props.onProjectGroupingModeChange(option.value)} subtitle={option.subtitle} > {option.label} ))} )} ); }