ConversationSidebar.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. "use client";
  2. import { ConversationSummary } from "@/features/agent/types";
  3. import { ConversationHeader, type ConversationFilter } from "./ConversationHeader";
  4. import { ConversationSearch } from "./ConversationSearch";
  5. import { ConversationList } from "./ConversationList";
  6. import { Button } from "@/components/ui/button";
  7. import { Plus } from "lucide-react";
  8. interface ConversationSidebarProps {
  9. conversations: ConversationSummary[];
  10. selectedConversationId: number | null;
  11. searchQuery: string;
  12. onSearchChange: (value: string) => void;
  13. onSelectConversation: (id: number) => void;
  14. filter: ConversationFilter;
  15. onFilterChange: (filter: ConversationFilter) => void;
  16. /** 内部对话(知识库测试)模式:显示「新建内部对话」按钮,隐藏筛选 */
  17. mode?: "visitor" | "internal";
  18. onNewClick?: () => void;
  19. }
  20. export function ConversationSidebar({
  21. conversations,
  22. selectedConversationId,
  23. searchQuery,
  24. onSearchChange,
  25. onSelectConversation,
  26. filter,
  27. onFilterChange,
  28. mode = "visitor",
  29. onNewClick,
  30. }: ConversationSidebarProps) {
  31. return (
  32. <div className="w-80 min-w-0 flex-1 flex flex-col bg-white border-r border-gray-200 min-h-0 overflow-hidden">
  33. {mode === "internal" ? (
  34. <div className="h-14 flex items-center justify-between px-3 border-b border-border bg-background flex-shrink-0">
  35. <span className="text-sm font-medium text-foreground truncate">知识库测试</span>
  36. {onNewClick && (
  37. <Button size="sm" variant="outline" onClick={onNewClick} className="flex-shrink-0 gap-1">
  38. <Plus className="w-4 h-4" />
  39. 新建
  40. </Button>
  41. )}
  42. </div>
  43. ) : (
  44. <ConversationHeader filter={filter} onFilterChange={onFilterChange} />
  45. )}
  46. <div className="flex-shrink-0 px-2 min-w-0">
  47. <ConversationSearch value={searchQuery} onChange={onSearchChange} />
  48. </div>
  49. <ConversationList
  50. conversations={conversations}
  51. selectedConversationId={selectedConversationId}
  52. onSelect={onSelectConversation}
  53. searchQuery={searchQuery}
  54. />
  55. </div>
  56. );
  57. }