1import type { EnvironmentId } from "@t3tools/contracts";
2import * as Arr from "effect/Array";
3import * as Order from "effect/Order";
4import { useFocusEffect } from "@react-navigation/native";
5import { useCallback, useMemo, useState } from "react";
6
7import { useSavedRemoteConnections } from "../../state/use-remote-environment-registry";
8import { useArchivedThreadListActions } from "../home/useThreadListActions";
9import {
10 ArchivedThreadsScreen,
11 type ArchivedThreadsHeaderEnvironment,
12} from "./ArchivedThreadsScreen";
13import { buildArchivedThreadGroups, type ArchivedThreadSortOrder } from "./archivedThreadList";
14import {
15 refreshArchivedThreadsForEnvironment,
16 useArchivedThreadSnapshots,
17} from "./useArchivedThreadSnapshots";
18
19export function ArchivedThreadsRouteScreen() {
20 const { savedConnectionsById } = useSavedRemoteConnections();
21 const [searchQuery, setSearchQuery] = useState("");
22 const [selectedEnvironmentId, setSelectedEnvironmentId] = useState<EnvironmentId | null>(null);
23 const [sortOrder, setSortOrder] = useState<ArchivedThreadSortOrder>("newest");
24 const environments = useMemo<ReadonlyArray<ArchivedThreadsHeaderEnvironment>>(
25 () =>
26 Arr.sort(
27 Object.values(savedConnectionsById).map((connection) => ({
28 environmentId: connection.environmentId,
29 label: connection.environmentLabel,
30 })),
31 Order.mapInput(Order.String, (environment: ArchivedThreadsHeaderEnvironment) =>
32 environment.label.toLocaleLowerCase(),
33 ),
34 ),
35 [savedConnectionsById],
36 );
37 const environmentIds = useMemo(
38 () => environments.map((environment) => environment.environmentId),
39 [environments],
40 );
41 const environmentLabels = useMemo(
42 () =>
43 Object.fromEntries(
44 environments.map((environment) => [environment.environmentId, environment.label]),
45 ),
46 [environments],
47 );
48 const { error, isLoading, refresh, snapshots } = useArchivedThreadSnapshots(environmentIds);
49 const groups = useMemo(
50 () =>
51 buildArchivedThreadGroups({
52 snapshots,
53 environmentLabels,
54 environmentId: selectedEnvironmentId,
55 searchQuery,
56 sortOrder,
57 }),
58 [environmentLabels, searchQuery, selectedEnvironmentId, snapshots, sortOrder],
59 );
60 const refreshChangedEnvironment = useCallback(
61 (thread: { readonly environmentId: EnvironmentId }) => {
62 refreshArchivedThreadsForEnvironment(thread.environmentId);
63 },
64 [],
65 );
66 const { unarchiveThread, confirmDeleteThread } =
67 useArchivedThreadListActions(refreshChangedEnvironment);
68
69 useFocusEffect(
70 useCallback(() => {
71 refresh();
72 }, [refresh]),
73 );
74
75 return (
76 <ArchivedThreadsScreen
77 environments={environments}
78 error={error}
79 groups={groups}
80 isLoading={isLoading}
81 onDeleteThread={confirmDeleteThread}
82 onEnvironmentChange={setSelectedEnvironmentId}
83 onRefresh={refresh}
84 onSearchQueryChange={setSearchQuery}
85 onSortOrderChange={setSortOrder}
86 onUnarchiveThread={unarchiveThread}
87 searchQuery={searchQuery}
88 selectedEnvironmentId={selectedEnvironmentId}
89 sortOrder={sortOrder}
90 />
91 );
92}