88 type EnvironmentMachineKind ,
99 resolveEnvironmentMachineKind ,
1010} from "@t3tools/contracts" ;
11- import { ArchivedThreadsHeader } from "./ArchivedThreadsHeader" ;
12- import type { ArchivedThreadsHeaderEnvironment } from "./ArchivedThreadsHeader.types" ;
13- export type { ArchivedThreadsHeaderEnvironment } from "./ArchivedThreadsHeader.types" ;
11+ import { useNavigation } from "@react-navigation/native" ;
12+ import { ScreenHeader } from "../../components/ScreenHeader" ;
1413import { SymbolView } from "../../components/AppSymbol" ;
1514import { useCallback , useMemo , useRef , type ComponentProps } from "react" ;
1615import {
@@ -34,6 +33,90 @@ import { ThreadSwipeable } from "../home/thread-swipe-actions";
3433import type { ArchivedThreadGroup , ArchivedThreadSortOrder } from "./archivedThreadList" ;
3534import { SettingsScreenContent } from "../settings/components/SettingsScreen" ;
3635
36+ export interface ArchivedThreadsHeaderEnvironment {
37+ readonly environmentId : EnvironmentId ;
38+ readonly label : string ;
39+ }
40+
41+ function ArchivedThreadsHeader ( props : {
42+ readonly environments : ReadonlyArray < ArchivedThreadsHeaderEnvironment > ;
43+ readonly searchQuery : string ;
44+ readonly selectedEnvironmentId : EnvironmentId | null ;
45+ readonly sortOrder : ArchivedThreadSortOrder ;
46+ readonly onEnvironmentChange : ( environmentId : EnvironmentId | null ) => void ;
47+ readonly onRefresh : ( ) => void ;
48+ readonly onSearchQueryChange : ( query : string ) => void ;
49+ readonly onSortOrderChange : ( sortOrder : ArchivedThreadSortOrder ) => void ;
50+ } ) {
51+ const navigation = useNavigation ( ) ;
52+ const { width } = useWindowDimensions ( ) ;
53+ const hasCustomFilter = props . selectedEnvironmentId !== null || props . sortOrder !== "newest" ;
54+ return (
55+ < ScreenHeader
56+ title = "Archived threads"
57+ sidebar = { false }
58+ onBack = { ( ) => navigation . goBack ( ) }
59+ search = { {
60+ value : props . searchQuery ,
61+ onChangeText : props . onSearchQueryChange ,
62+ placeholder : "Search archived threads" ,
63+ compactPlaceholder : "Search" ,
64+ mode : "inline" ,
65+ compactToolbar : width < 700 ,
66+ onRefresh : props . onRefresh ,
67+ refreshInToolbar : true ,
68+ refreshAccessibilityLabel : "Refresh archived threads" ,
69+ } }
70+ menus = { [
71+ {
72+ title : "Archived thread options" ,
73+ icon : hasCustomFilter
74+ ? "line.3.horizontal.decrease.circle.fill"
75+ : "line.3.horizontal.decrease.circle" ,
76+ items : [
77+ {
78+ id : "environment" ,
79+ title : "Environment" ,
80+ items : [
81+ {
82+ id : "environment:all" ,
83+ title : "All environments" ,
84+ selected : props . selectedEnvironmentId === null ,
85+ onPress : ( ) => props . onEnvironmentChange ( null ) ,
86+ } ,
87+ ...props . environments . map ( ( environment ) => ( {
88+ id : `environment:${ environment . environmentId } ` ,
89+ title : environment . label ,
90+ selected : props . selectedEnvironmentId === environment . environmentId ,
91+ onPress : ( ) => props . onEnvironmentChange ( environment . environmentId ) ,
92+ } ) ) ,
93+ ] ,
94+ } ,
95+ {
96+ id : "sort" ,
97+ title : "Sort by archived date" ,
98+ items : [
99+ {
100+ id : "sort:newest" ,
101+ title : "Newest first" ,
102+ selected : props . sortOrder === "newest" ,
103+ onPress : ( ) => props . onSortOrderChange ( "newest" ) ,
104+ } ,
105+ {
106+ id : "sort:oldest" ,
107+ title : "Oldest first" ,
108+ selected : props . sortOrder === "oldest" ,
109+ onPress : ( ) => props . onSortOrderChange ( "oldest" ) ,
110+ } ,
111+ ] ,
112+ } ,
113+ ] ,
114+ } ,
115+ ] }
116+ />
117+ ) ;
118+ }
119+
37120type ArchivedThreadListItem =
38121 | {
39122 readonly kind : "project" ;
0 commit comments