mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-24 06:34:46 +08:00
70 lines
2.4 KiB
TypeScript
70 lines
2.4 KiB
TypeScript
"use client";
|
|
|
|
import Link from "next/link";
|
|
import { useMemo, useState } from "react";
|
|
|
|
import { Input } from "@/components/ui/input";
|
|
import { ScrollArea } from "@/components/ui/scroll-area";
|
|
import {
|
|
WorkspaceBody,
|
|
WorkspaceContainer,
|
|
WorkspaceHeader,
|
|
} from "@/components/workspace/workspace-container";
|
|
import { useI18n } from "@/core/i18n/hooks";
|
|
import { useThreads } from "@/core/threads/hooks";
|
|
import { pathOfThread, titleOfThread } from "@/core/threads/utils";
|
|
import { formatTimeAgo } from "@/core/utils/datetime";
|
|
|
|
export default function ChatsPage() {
|
|
const { t } = useI18n();
|
|
const { data: threads } = useThreads();
|
|
const [search, setSearch] = useState("");
|
|
const filteredThreads = useMemo(() => {
|
|
return threads?.filter((thread) => {
|
|
return titleOfThread(thread).toLowerCase().includes(search.toLowerCase());
|
|
});
|
|
}, [threads, search]);
|
|
return (
|
|
<WorkspaceContainer>
|
|
<WorkspaceHeader></WorkspaceHeader>
|
|
<WorkspaceBody>
|
|
<div className="flex size-full flex-col">
|
|
<header className="flex shrink-0 items-center justify-center pt-8">
|
|
<Input
|
|
type="search"
|
|
className="h-12 w-full max-w-(--container-width-md) text-xl"
|
|
placeholder={t.chats.searchChats}
|
|
autoFocus
|
|
value={search}
|
|
onChange={(e) => setSearch(e.target.value)}
|
|
/>
|
|
</header>
|
|
<main className="min-h-0 flex-1">
|
|
<ScrollArea className="size-full py-4">
|
|
<div className="mx-auto flex size-full max-w-(--container-width-md) flex-col">
|
|
{filteredThreads?.map((thread) => (
|
|
<Link
|
|
key={thread.thread_id}
|
|
href={pathOfThread(thread.thread_id)}
|
|
>
|
|
<div className="flex flex-col gap-2 border-b p-4">
|
|
<div>
|
|
<div>{titleOfThread(thread)}</div>
|
|
</div>
|
|
{thread.updated_at && (
|
|
<div className="text-muted-foreground text-sm">
|
|
{formatTimeAgo(thread.updated_at)}
|
|
</div>
|
|
)}
|
|
</div>
|
|
</Link>
|
|
))}
|
|
</div>
|
|
</ScrollArea>
|
|
</main>
|
|
</div>
|
|
</WorkspaceBody>
|
|
</WorkspaceContainer>
|
|
);
|
|
}
|