- import { MoreButton } from '@/components/more-button';
- import { RAGFlowAvatar } from '@/components/ragflow-avatar';
- import { Button } from '@/components/ui/button';
- import { Card, CardContent } from '@/components/ui/card';
- import { SearchInput } from '@/components/ui/input';
- import { useSetModalState } from '@/hooks/common-hooks';
- import {
- useFetchDialog,
- useGetChatSearchParams,
- } from '@/hooks/use-chat-request';
- import { cn } from '@/lib/utils';
- import { PanelLeftClose, PanelRightClose, Plus } from 'lucide-react';
- import { useCallback, useState } from 'react';
- import { useHandleClickConversationCard } from '../hooks/use-click-card';
- import { useSelectDerivedConversationList } from '../hooks/use-select-conversation-list';
-
- type SessionProps = Pick<
- ReturnType<typeof useHandleClickConversationCard>,
- 'handleConversationCardClick'
- > & { switchSettingVisible(): void };
- export function Sessions({
- handleConversationCardClick,
- switchSettingVisible,
- }: SessionProps) {
- const { list: conversationList, addTemporaryConversation } =
- useSelectDerivedConversationList();
- const { data } = useFetchDialog();
- const { visible, switchVisible } = useSetModalState(true);
- const [searchStr, setSearchStr] = useState('');
-
- const handleCardClick = useCallback(
- (conversationId: string, isNew: boolean) => () => {
- handleConversationCardClick(conversationId, isNew);
- },
- [handleConversationCardClick],
- );
-
- const { conversationId } = useGetChatSearchParams();
-
- if (!visible) {
- return (
- <PanelRightClose
- className="cursor-pointer size-4 mt-8"
- onClick={switchVisible}
- />
- );
- }
-
- return (
- <section className="p-6 w-[296px] flex flex-col">
- <section className="flex items-center text-base justify-between gap-2">
- <div className="flex gap-3 items-center min-w-0">
- <RAGFlowAvatar
- avatar={data.icon}
- name={data.name}
- className="size-8"
- ></RAGFlowAvatar>
- <span className="flex-1 truncate">{data.name}</span>
- </div>
- <PanelLeftClose
- className="cursor-pointer size-4"
- onClick={switchVisible}
- />
- </section>
- <div className="flex justify-between items-center mb-4 pt-10">
- <span className="text-base font-bold">Conversations</span>
- <Button variant={'ghost'} onClick={addTemporaryConversation}>
- <Plus></Plus>
- </Button>
- </div>
- <div className="pb-4">
- <SearchInput
- onChange={(e) => setSearchStr(e.target.value)}
- value={searchStr}
- ></SearchInput>
- </div>
- <div className="space-y-4 flex-1 overflow-auto">
- {conversationList.map((x) => (
- <Card
- key={x.id}
- onClick={handleCardClick(x.id, x.is_new)}
- className={cn('cursor-pointer bg-transparent', {
- 'bg-bg-card': conversationId === x.id,
- })}
- >
- <CardContent className="px-3 py-2 flex justify-between items-center group">
- {x.name}
- <MoreButton></MoreButton>
- </CardContent>
- </Card>
- ))}
- </div>
- <div className="py-2">
- <Button className="w-full" onClick={switchSettingVisible}>
- Chat Settings
- </Button>
- </div>
- </section>
- );
- }
|