"use client" import { SiteHeader } from "@/components/site-header" import { useFamily } from "@/context/family-context" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Download, Upload, AlertTriangle, RefreshCw, FileText, Bell, History, Database, User as UserIcon } from "lucide-react" import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" import { useRef, useState, useEffect } from "react" import { exportToGedcom, importFromGedcom } from "@/lib/gedcom" import { NotificationSettings } from "@/components/settings/notification-settings" import { ActivityLogViewer } from "@/components/settings/activity-log-viewer" import { upgradeDatabase } from "@/lib/db-upgrade" import { ErrorBoundary } from "@/components/error-boundary" import { useSession } from "next-auth/react" import { Avatar, AvatarFallback } from "@/components/ui/avatar" import { ChangePassword } from "@/components/settings/change-password" interface UserProfile { id: string email: string name: string | null createdAt: string updatedAt: string ownedTreesCount: number collaborations: Array<{ treeId: string treeName: string role: string }> } export default function SettingsPage() { const { treeData, loadData, resetData } = useFamily() const { data: session } = useSession() const [importStatus, setImportStatus] = useState("") const [gedcomStatus, setGedcomStatus] = useState("") const [userProfile, setUserProfile] = useState(null) const fileInputRef = useRef(null) const gedcomInputRef = useRef(null) const getUserInitial = () => { if (session?.user?.name) { return session.user.name.charAt(0).toUpperCase() } if (session?.user?.email) { return session.user.email.charAt(0).toUpperCase() } return "U" } // 获取用户资料 useEffect(() => { if (session?.user?.id) { fetch('/api/user/profile') .then(res => res.json()) .then(data => { if (data.user) { setUserProfile(data.user) } }) .catch(err => console.error('获取用户资料失败:', err)) } }, [session?.user?.id]) const getRoleText = (role: string) => { const roleMap: Record = { 'OWNER': '所有者', 'EDITOR': '编辑者', 'VIEWER': '查看者' } return roleMap[role] || role } const getRoleBadgeColor = (role: string) => { const colorMap: Record = { 'OWNER': 'bg-purple-100 text-purple-700 border-purple-200', 'EDITOR': 'bg-blue-100 text-blue-700 border-blue-200', 'VIEWER': 'bg-gray-100 text-gray-700 border-gray-200' } return colorMap[role] || 'bg-gray-100 text-gray-700' } return (

系统设置 (Settings)

{/* 用户信息和密码修改 - 两列布局 */} {session && (
用户信息 您的账号信息和角色
{getUserInitial()}

{session.user?.name || "用户"}

{session.user?.email}

用户 ID: {session.user?.id}

{userProfile && (userProfile.ownedTreesCount > 0 || userProfile.collaborations.length > 0) && (

我的家族树

{/* 显示拥有的家族树(所有者) */} {userProfile.ownedTreesCount > 0 && (
{getRoleText('OWNER')} {userProfile.ownedTreesCount} 个家族树
)} {/* 显示协作的家族树 */} {userProfile.collaborations.length > 0 && (
{userProfile.collaborations.map((collab) => (
{collab.treeName} {getRoleText(collab.role)}
))}
)}
)}
)} {/* 通知设置和数据备份 - 两列布局 */}
数据备份 (Backup) 将家族数据导出为 JSON 文件进行本地保存。
{/* 数据恢复和 GEDCOM - 两列布局 */}
数据恢复 (Restore) 从 JSON 备份文件恢复数据。注意:这将覆盖当前的所有数据。 警告 导入操作不可撤销。建议在导入前先导出当前数据备份。
{ const file = e.target.files?.[0] if (!file) return const reader = new FileReader() reader.onload = async (event) => { try { const jsonStr = event.target?.result as string const data = JSON.parse(jsonStr) await loadData(data) setImportStatus("导入成功!") if (fileInputRef.current) fileInputRef.current.value = "" } catch (err) { console.error(err) setImportStatus("错误:无法解析 JSON 文件") } } reader.readAsText(file) }} /> {importStatus}
GEDCOM 格式 导入/导出标准 GEDCOM 格式,兼容其他家谱软件(如 Ancestry、MyHeritage)。
{ const file = e.target.files?.[0] if (!file) return const reader = new FileReader() reader.onload = async (event) => { try { const gedcomText = event.target?.result as string const importedData = importFromGedcom(gedcomText) await loadData(importedData) setGedcomStatus("GEDCOM 导入成功!") if (gedcomInputRef.current) gedcomInputRef.current.value = "" } catch (err) { console.error(err) setGedcomStatus("错误:无法解析 GEDCOM 文件") } } reader.readAsText(file) }} /> {gedcomStatus && {gedcomStatus}}
{/* 数据库和系统管理 - 两列布局 */}
数据库维护 升级数据库以支持新功能(如操作日志) 如果操作日志功能不工作,请点击下方按钮升级数据库。升级会保留所有现有数据。 危险区域 (Danger Zone) 这些操作不可逆,请谨慎使用。
{/* 操作日志 - 全宽 */}
) }