您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

sessions.tsx 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { MoreButton } from '@/components/more-button';
  2. import { RAGFlowAvatar } from '@/components/ragflow-avatar';
  3. import { Button } from '@/components/ui/button';
  4. import { Card, CardContent } from '@/components/ui/card';
  5. import { SearchInput } from '@/components/ui/input';
  6. import { useSetModalState } from '@/hooks/common-hooks';
  7. import {
  8. useFetchDialog,
  9. useGetChatSearchParams,
  10. } from '@/hooks/use-chat-request';
  11. import { cn } from '@/lib/utils';
  12. import { PanelLeftClose, PanelRightClose, Plus } from 'lucide-react';
  13. import { useCallback, useState } from 'react';
  14. import { useHandleClickConversationCard } from '../hooks/use-click-card';
  15. import { useSelectDerivedConversationList } from '../hooks/use-select-conversation-list';
  16. type SessionProps = Pick<
  17. ReturnType<typeof useHandleClickConversationCard>,
  18. 'handleConversationCardClick'
  19. > & { switchSettingVisible(): void };
  20. export function Sessions({
  21. handleConversationCardClick,
  22. switchSettingVisible,
  23. }: SessionProps) {
  24. const { list: conversationList, addTemporaryConversation } =
  25. useSelectDerivedConversationList();
  26. const { data } = useFetchDialog();
  27. const { visible, switchVisible } = useSetModalState(true);
  28. const [searchStr, setSearchStr] = useState('');
  29. const handleCardClick = useCallback(
  30. (conversationId: string, isNew: boolean) => () => {
  31. handleConversationCardClick(conversationId, isNew);
  32. },
  33. [handleConversationCardClick],
  34. );
  35. const { conversationId } = useGetChatSearchParams();
  36. if (!visible) {
  37. return (
  38. <PanelRightClose
  39. className="cursor-pointer size-4 mt-8"
  40. onClick={switchVisible}
  41. />
  42. );
  43. }
  44. return (
  45. <section className="p-6 w-[296px] flex flex-col">
  46. <section className="flex items-center text-base justify-between gap-2">
  47. <div className="flex gap-3 items-center min-w-0">
  48. <RAGFlowAvatar
  49. avatar={data.icon}
  50. name={data.name}
  51. className="size-8"
  52. ></RAGFlowAvatar>
  53. <span className="flex-1 truncate">{data.name}</span>
  54. </div>
  55. <PanelLeftClose
  56. className="cursor-pointer size-4"
  57. onClick={switchVisible}
  58. />
  59. </section>
  60. <div className="flex justify-between items-center mb-4 pt-10">
  61. <span className="text-base font-bold">Conversations</span>
  62. <Button variant={'ghost'} onClick={addTemporaryConversation}>
  63. <Plus></Plus>
  64. </Button>
  65. </div>
  66. <div className="pb-4">
  67. <SearchInput
  68. onChange={(e) => setSearchStr(e.target.value)}
  69. value={searchStr}
  70. ></SearchInput>
  71. </div>
  72. <div className="space-y-4 flex-1 overflow-auto">
  73. {conversationList.map((x) => (
  74. <Card
  75. key={x.id}
  76. onClick={handleCardClick(x.id, x.is_new)}
  77. className={cn('cursor-pointer bg-transparent', {
  78. 'bg-bg-card': conversationId === x.id,
  79. })}
  80. >
  81. <CardContent className="px-3 py-2 flex justify-between items-center group">
  82. {x.name}
  83. <MoreButton></MoreButton>
  84. </CardContent>
  85. </Card>
  86. ))}
  87. </div>
  88. <div className="py-2">
  89. <Button className="w-full" onClick={switchSettingVisible}>
  90. Chat Settings
  91. </Button>
  92. </div>
  93. </section>
  94. );
  95. }