"use client" import { useState, useEffect } from "react" import { ScrollArea } from "@/components/ui/scroll-area" import { Badge } from "@/components/ui/badge" import { User } from "lucide-react" import { format } from "date-fns" import { zhCN } from "date-fns/locale" interface MemberHistory { id: string memberId: string version: number snapshot: any changedBy: string changedAt: string changeType: "CREATE" | "UPDATE" | "DELETE" changes: Record | null user?: { name?: string | null email?: string | null } } interface MemberVersionHistoryProps { memberId: string treeId: string onVersionSelect?: (version: MemberHistory) => void } export function MemberVersionHistory({ memberId, treeId, onVersionSelect }: MemberVersionHistoryProps) { const [history, setHistory] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { loadHistory() }, [memberId, treeId]) const loadHistory = async () => { try { setLoading(true) const res = await fetch(`/api/trees/${treeId}/members/${memberId}/history`) if (!res.ok) throw new Error("获取历史失败") const data = await res.json() setHistory(data.history || []) } catch (error) { console.error("加载历史失败:", error) } finally { setLoading(false) } } const getChangeTypeLabel = (type: string) => { const labels: Record = { CREATE: "创建", UPDATE: "更新", DELETE: "删除", } return labels[type] || type } const getChangeTypeColor = (type: string) => { const colors: Record = { CREATE: "bg-green-100 text-green-700 border-green-200", UPDATE: "bg-blue-100 text-blue-700 border-blue-200", DELETE: "bg-red-100 text-red-700 border-red-200", } return colors[type] || "bg-gray-100 text-gray-700 border-gray-200" } const fieldLabels: Record = { fullName: '姓名', surname: '姓氏', givenName: '名字', gender: '性别', birthDate: '出生日期', deathDate: '去世日期', birthPlace: '出生地', ancestralHome: '祖籍', generation: '世代', generationName: '字辈', courtesyName: '字', artName: '号', posthumousName: '谥号', rank: '排行', bio: '简介', phone: '手机', telephone: '电话', email: '邮箱', address: '地址', photoIds: '照片', spouseIds: '配偶', childrenIds: '子女', motherId: '母亲', fatherId: '父亲', isFounder: '始祖', isLunarDate: '农历日期', burialPlace: '安葬地', tags: '标签', spouseFatherName: '岳父/公公', spouseMotherName: '岳母/婆婆', } const formatValue = (value: any) => { if (value === null || value === undefined) return '-' if (typeof value === 'boolean') return value ? '是' : '否' if (Array.isArray(value)) return value.length > 0 ? value.join(', ') : '-' return String(value) } const renderVersionChanges = (changes: Record | null, changeType: string) => { // 如果是创建操作,不显示变更详情 if (changeType === 'CREATE') { return (
创建了新成员
) } // 如果没有变更信息 if (!changes || Object.keys(changes).length === 0) { return (
无变更记录
) } // 分组显示变更 const relationFields = ['fatherId', 'motherId', 'spouseIds', 'childrenIds', 'spouseFatherName', 'spouseMotherName'] const changedRelations = Object.entries(changes).filter(([key]) => relationFields.includes(key)) const changedOthers = Object.entries(changes).filter(([key]) => !relationFields.includes(key)) return (
{/* 家族关系变更 */} {changedRelations.length > 0 && (

家族关系变更

{changedRelations.map(([field, change]) => (
{fieldLabels[field]}:
{formatValue(change.old)} {formatValue(change.new)}
))}
)} {/* 其他信息变更 */} {changedOthers.length > 0 && (

详细信息变更

{changedOthers.map(([field, change]) => (
{fieldLabels[field]}:
{formatValue(change.old)} {formatValue(change.new)}
))}
)}
) } if (loading) { return (
加载中...
) } if (history.length === 0) { return (
暂无历史记录
) } return (

共 {history.length} 个版本

{history.map((record) => (
{/* 版本头部 */}
{getChangeTypeLabel(record.changeType)} 版本 {record.version}
{format(new Date(record.changedAt), 'yyyy-MM-dd HH:mm', { locale: zhCN })}
{/* 操作人 */} {record.user && (
{record.user.name || record.user.email || '未知用户'}
)} {/* 变更详细内容 */} {renderVersionChanges(record.changes, record.changeType)}
))}
) }