import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Edit, Eye, Trash2 } from 'lucide-react' import { useState } from 'react' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Input } from '@/components/ui/input' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { useToast } from '@/hooks/use-toast' import type { Expression } from '@/types/expression' /** * 表达方式列表组件(桌面端Table + 移动端Card视图 + 分页) */ export function ExpressionList({ expressions, loading, total, page, pageSize, selectedIds, chatNameMap, onEdit, onViewDetail, onDelete, onToggleSelect, onToggleSelectAll, onPageChange, onJumpToPage, }: { expressions: Expression[] loading: boolean total: number page: number pageSize: number selectedIds: Set chatNameMap: Map onEdit: (expression: Expression) => void onViewDetail: (expression: Expression) => void onDelete: (expression: Expression) => void onToggleSelect: (id: number) => void onToggleSelectAll: () => void onPageChange: (newPage: number) => void onJumpToPage: (targetPage: string) => void }) { const { toast } = useToast() const getChatName = (expression: Expression): string => { return expression.chat_name || chatNameMap.get(expression.chat_id) || expression.chat_id } const totalPages = Math.ceil(total / pageSize) const handleJumpToPage = (jumpToPage: string) => { const targetPage = parseInt(jumpToPage) if (targetPage >= 1 && targetPage <= totalPages) { onJumpToPage(jumpToPage) } else { toast({ title: '无效的页码', description: `请输入1-${totalPages}之间的页码`, variant: 'destructive', }) } } return (
{/* 桌面端表格视图 */}
0} onCheckedChange={onToggleSelectAll} /> 情境 风格 聊天 操作 {loading ? ( 加载中... ) : expressions.length === 0 ? ( 暂无数据 ) : ( expressions.map((expression) => ( onToggleSelect(expression.id)} /> {expression.situation} {expression.style} {getChatName(expression)}
)) )}
{/* 移动端卡片视图 */}
{loading ? (
加载中...
) : expressions.length === 0 ? (
暂无数据
) : ( expressions.map((expression) => (
{/* 复选框和情境 */}
onToggleSelect(expression.id)} className="mt-1" />
情境

{expression.situation}

风格

{expression.style}

{/* 聊天名称 */}
聊天

{getChatName(expression)}

{/* 操作按钮 */}
)) )}
{/* 分页 */} {total > 0 && ( )}
) } /** * 分页组件 */ function Pagination({ total, page, pageSize, onPageChange, onJumpToPage, }: { total: number page: number pageSize: number onPageChange: (newPage: number) => void onJumpToPage: (targetPage: string) => void }) { const [jumpToPage, setJumpToPage] = useState('') const totalPages = Math.ceil(total / pageSize) const handleJump = () => { if (jumpToPage) { onJumpToPage(jumpToPage) setJumpToPage('') } } return (
共 {total} 条记录,第 {page} / {totalPages} 页
{/* 首页 */} {/* 上一页 */} {/* 页码跳转 */}
setJumpToPage(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleJump()} placeholder={page.toString()} className="w-16 h-8 text-center" min={1} max={totalPages} />
{/* 下一页 */} {/* 末页 */}
) }