| 1 | import type { EnvironmentId } from "@t3tools/contracts"; |
| 2 | import * as Arr from "effect/Array"; |
| 3 | import * as Order from "effect/Order"; |
| 4 | import { useFocusEffect } from "@react-navigation/native"; |
| 5 | import { useCallback, useMemo, useState } from "react"; |
| 6 | |
| 7 | import { useSavedRemoteConnections } from "../../state/use-remote-environment-registry"; |
| 8 | import { useArchivedThreadListActions } from "../home/useThreadListActions"; |
| 9 | import { |
| 10 | ArchivedThreadsScreen, |
| 11 | type ArchivedThreadsHeaderEnvironment, |
| 12 | } from "./ArchivedThreadsScreen"; |
| 13 | import { buildArchivedThreadGroups, type ArchivedThreadSortOrder } from "./archivedThreadList"; |
| 14 | import { |
| 15 | refreshArchivedThreadsForEnvironment, |
| 16 | useArchivedThreadSnapshots, |
| 17 | } from "./useArchivedThreadSnapshots"; |
| 18 | |
| 19 | export 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 | } |