mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-18 03:54:46 +08:00
feat: implement '/chats'
This commit is contained in:
@@ -1,17 +1,64 @@
|
|||||||
"use client";
|
"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 {
|
import {
|
||||||
WorkspaceBody,
|
WorkspaceBody,
|
||||||
WorkspaceContainer,
|
WorkspaceContainer,
|
||||||
WorkspaceHeader,
|
WorkspaceHeader,
|
||||||
} from "@/components/workspace/workspace-container";
|
} from "@/components/workspace/workspace-container";
|
||||||
|
import { useThreads } from "@/core/threads/hooks";
|
||||||
|
import { pathOfThread, titleOfThread } from "@/core/threads/utils";
|
||||||
|
import { formatTimeAgo } from "@/core/utils/datetime";
|
||||||
|
|
||||||
export default function ChatsPage() {
|
export default function ChatsPage() {
|
||||||
|
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 (
|
return (
|
||||||
<WorkspaceContainer>
|
<WorkspaceContainer>
|
||||||
<WorkspaceHeader></WorkspaceHeader>
|
<WorkspaceHeader></WorkspaceHeader>
|
||||||
<WorkspaceBody>
|
<WorkspaceBody>
|
||||||
<div className="flex size-full justify-center"></div>
|
<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="Search chats"
|
||||||
|
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>
|
||||||
|
<div className="text-muted-foreground text-sm">
|
||||||
|
{formatTimeAgo(thread.updated_at)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</ScrollArea>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
</WorkspaceBody>
|
</WorkspaceBody>
|
||||||
</WorkspaceContainer>
|
</WorkspaceContainer>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user