import type { EnvironmentId } from "@t3tools/contracts"; import * as Arr from "effect/Array"; import * as Order from "effect/Order"; import { useFocusEffect } from "@react-navigation/native"; import { useCallback, useMemo, useState } from "react"; import { useSavedRemoteConnections } from "../../state/use-remote-environment-registry"; import { useArchivedThreadListActions } from "../home/useThreadListActions"; import { ArchivedThreadsScreen, type ArchivedThreadsHeaderEnvironment, } from "./ArchivedThreadsScreen"; import { buildArchivedThreadGroups, type ArchivedThreadSortOrder } from "./archivedThreadList"; import { refreshArchivedThreadsForEnvironment, useArchivedThreadSnapshots, } from "./useArchivedThreadSnapshots"; export function ArchivedThreadsRouteScreen() { const { savedConnectionsById } = useSavedRemoteConnections(); const [searchQuery, setSearchQuery] = useState(""); const [selectedEnvironmentId, setSelectedEnvironmentId] = useState(null); const [sortOrder, setSortOrder] = useState("newest"); const environments = useMemo>( () => Arr.sort( Object.values(savedConnectionsById).map((connection) => ({ environmentId: connection.environmentId, label: connection.environmentLabel, })), Order.mapInput(Order.String, (environment: ArchivedThreadsHeaderEnvironment) => environment.label.toLocaleLowerCase(), ), ), [savedConnectionsById], ); const environmentIds = useMemo( () => environments.map((environment) => environment.environmentId), [environments], ); const environmentLabels = useMemo( () => Object.fromEntries( environments.map((environment) => [environment.environmentId, environment.label]), ), [environments], ); const { error, isLoading, refresh, snapshots } = useArchivedThreadSnapshots(environmentIds); const groups = useMemo( () => buildArchivedThreadGroups({ snapshots, environmentLabels, environmentId: selectedEnvironmentId, searchQuery, sortOrder, }), [environmentLabels, searchQuery, selectedEnvironmentId, snapshots, sortOrder], ); const refreshChangedEnvironment = useCallback( (thread: { readonly environmentId: EnvironmentId }) => { refreshArchivedThreadsForEnvironment(thread.environmentId); }, [], ); const { unarchiveThread, confirmDeleteThread } = useArchivedThreadListActions(refreshChangedEnvironment); useFocusEffect( useCallback(() => { refresh(); }, [refresh]), ); return ( ); }