Skip to content
Source
Sign inSign up

ArchivedThreadsRouteScreen.tsx

89 lines3.1 KB

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 = (thread: { readonly environmentId: EnvironmentId }) => {
61 refreshArchivedThreadsForEnvironment(thread.environmentId);
62 };
63 const { unarchiveThread, confirmDeleteThread } =
64 useArchivedThreadListActions(refreshChangedEnvironment);
65​
66 useFocusEffect(
67 useCallback(() => {
68 refresh();
69 }, [refresh]),
70 );
71​
72 return (
73 <ArchivedThreadsScreen
74 environments={environments}
75 error={error}
76 groups={groups}
77 isLoading={isLoading}
78 onDeleteThread={confirmDeleteThread}
79 onEnvironmentChange={setSelectedEnvironmentId}
80 onRefresh={refresh}
81 onSearchQueryChange={setSearchQuery}
82 onSortOrderChange={setSortOrder}
83 onUnarchiveThread={unarchiveThread}
84 searchQuery={searchQuery}
85 selectedEnvironmentId={selectedEnvironmentId}
86 sortOrder={sortOrder}
87 />
88 );