import type { EnvironmentId, SidebarProjectGroupingMode, SidebarThreadSortOrder, } from "@t3tools/contracts"; import { DEFAULT_SIDEBAR_PROJECT_GROUPING_MODE, DEFAULT_SIDEBAR_PROJECT_SORT_ORDER, DEFAULT_SIDEBAR_THREAD_SORT_ORDER, } from "@t3tools/contracts"; import * as Arr from "effect/Array"; import * as Order from "effect/Order"; import { useRouter } from "expo-router"; import { useCallback, useMemo, useState } from "react"; import { useProjects, useThreadShells } from "../state/entities"; import { useWorkspaceState } from "../state/workspace"; import { buildThreadRoutePath } from "../lib/routes"; import { useSavedRemoteConnections } from "../state/use-remote-environment-registry"; import { HomeScreen } from "../features/home/HomeScreen"; import { HomeHeader } from "../features/home/HomeHeader"; import type { HomeProjectSortOrder } from "../features/home/homeThreadList"; import { useThreadListActions } from "../features/home/useThreadListActions"; interface HomeListOptions { readonly selectedEnvironmentId: EnvironmentId | null; readonly projectSortOrder: HomeProjectSortOrder; readonly threadSortOrder: SidebarThreadSortOrder; readonly projectGroupingMode: SidebarProjectGroupingMode; } /* ─── Route screen ───────────────────────────────────────────────────── */ export default function HomeRouteScreen() { const projects = useProjects(); const threads = useThreadShells(); const { state: catalogState } = useWorkspaceState(); const { savedConnectionsById } = useSavedRemoteConnections(); const router = useRouter(); const [searchQuery, setSearchQuery] = useState(""); const [listOptions, setListOptions] = useState({ selectedEnvironmentId: null, projectSortOrder: DEFAULT_SIDEBAR_PROJECT_SORT_ORDER === "manual" ? "updated_at" : DEFAULT_SIDEBAR_PROJECT_SORT_ORDER, threadSortOrder: DEFAULT_SIDEBAR_THREAD_SORT_ORDER, projectGroupingMode: DEFAULT_SIDEBAR_PROJECT_GROUPING_MODE, }); const { archiveThread, confirmDeleteThread } = useThreadListActions(); const environments = useMemo( () => Arr.sort( Object.values(savedConnectionsById).map((connection) => ({ environmentId: connection.environmentId, label: connection.environmentLabel, })), Order.mapInput( Order.String, (environment: { readonly label: string }) => environment.label, ), ), [savedConnectionsById], ); const selectedEnvironmentId = environments.some( (environment) => environment.environmentId === listOptions.selectedEnvironmentId, ) ? listOptions.selectedEnvironmentId : null; const setSelectedEnvironmentId = useCallback((environmentId: EnvironmentId | null) => { setListOptions((current) => ({ ...current, selectedEnvironmentId: environmentId })); }, []); const setProjectSortOrder = useCallback((projectSortOrder: HomeProjectSortOrder) => { setListOptions((current) => ({ ...current, projectSortOrder })); }, []); const setThreadSortOrder = useCallback((threadSortOrder: SidebarThreadSortOrder) => { setListOptions((current) => ({ ...current, threadSortOrder })); }, []); const setProjectGroupingMode = useCallback((projectGroupingMode: SidebarProjectGroupingMode) => { setListOptions((current) => ({ ...current, projectGroupingMode })); }, []); return ( <> router.push("/settings")} onProjectGroupingModeChange={setProjectGroupingMode} onProjectSortOrderChange={setProjectSortOrder} onSearchQueryChange={setSearchQuery} onStartNewTask={() => router.push("/new")} onThreadSortOrderChange={setThreadSortOrder} /> router.push("/connections/new")} onArchiveThread={archiveThread} onDeleteThread={confirmDeleteThread} onOpenEnvironments={() => router.push("/settings/environments")} onSelectThread={(thread) => { router.push(buildThreadRoutePath(thread)); }} projectGroupingMode={listOptions.projectGroupingMode} projects={projects} projectSortOrder={listOptions.projectSortOrder} savedConnectionsById={savedConnectionsById} searchQuery={searchQuery} selectedEnvironmentId={selectedEnvironmentId} threads={threads} threadSortOrder={listOptions.threadSortOrder} /> ); }