"use client" import { useState, useMemo, useEffect } from "react" import { SiteHeader } from "@/components/site-header" import { useFamily } from "@/context/family-context" import { useRouter } from "next/navigation" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" import { Search, Plus, Filter, X } from "lucide-react" import Link from "next/link" import { AvatarDisplay } from "@/components/ui/avatar-display" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Slider } from "@/components/ui/slider" import { Label } from "@/components/ui/label" import { Badge } from "@/components/ui/badge" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" export default function MembersPage() { const { treeData, searchMembers, setHighlightedMemberId } = useFamily() const router = useRouter() const [query, setQuery] = useState("") const [showFilters, setShowFilters] = useState(false) // 从 URL 参数读取搜索关键词 useEffect(() => { const params = new URLSearchParams(window.location.search) const searchParam = params.get('search') if (searchParam) { setQuery(searchParam) } }, []) // Filter States const [selectedSurname, setSelectedSurname] = useState("all") const [selectedHome, setSelectedHome] = useState("all") const [statusFilter, setStatusFilter] = useState("all") const [generationRange, setGenerationRange] = useState<[number, number]>([1, 100]) // Derived Data const allMembers = useMemo(() => Object.values(treeData.members), [treeData]) const { uniqueSurnames, uniqueHomes, minGen, maxGen } = useMemo(() => { const surnames = new Set() const homes = new Set() let min = 1000 let max = 0 allMembers.forEach((m) => { if (m.surname) surnames.add(m.surname) if (m.ancestralHome) homes.add(m.ancestralHome) if (m.generation) { if (m.generation < min) min = m.generation if (m.generation > max) max = m.generation } }) return { uniqueSurnames: Array.from(surnames).sort(), uniqueHomes: Array.from(homes).sort(), minGen: min === 1000 ? 1 : min, maxGen: max === 0 ? 100 : max, } }, [allMembers]) // Initialize slider when data loads useMemo(() => { if (minGen !== 1000 && maxGen !== 0) { // Only update if range is default // This is a bit tricky, for now let's just rely on user adjustment or default wide range // Ideally we sync this once. } }, [minGen, maxGen]) const filteredMembers = useMemo(() => { let result = allMembers // 1. Search Query if (query) { const lowerQuery = query.toLowerCase() result = result.filter( (m) => m.fullName.toLowerCase().includes(lowerQuery) || m.courtesyName?.toLowerCase().includes(lowerQuery) || m.artName?.toLowerCase().includes(lowerQuery), ) } // 2. Surname Filter if (selectedSurname !== "all") { result = result.filter((m) => m.surname === selectedSurname) } // 3. Home Filter if (selectedHome !== "all") { result = result.filter((m) => m.ancestralHome === selectedHome) } // 4. Status Filter if (statusFilter !== "all") { if (statusFilter === "living") { result = result.filter((m) => !m.deathDate) } else if (statusFilter === "deceased") { result = result.filter((m) => !!m.deathDate) } } // 5. Generation Filter result = result.filter((m) => m.generation >= generationRange[0] && m.generation <= generationRange[1]) // Sort return result.sort((a, b) => a.generation - b.generation || (a.birthDate || "").localeCompare(b.birthDate || "")) }, [allMembers, query, selectedSurname, selectedHome, statusFilter, generationRange]) // 按世代分组 const membersByGeneration = useMemo(() => { const groups = new Map() filteredMembers.forEach(member => { const gen = member.generation if (!groups.has(gen)) { groups.set(gen, []) } groups.get(gen)!.push(member) }) // 转换为数组并排序 return Array.from(groups.entries()) .sort((a, b) => a[0] - b[0]) .map(([generation, members]) => ({ generation, members })) }, [filteredMembers]) const clearFilters = () => { setSelectedSurname("all") setSelectedHome("all") setStatusFilter("all") setGenerationRange([1, 100]) // Reset to wide range setQuery("") } const activeFilterCount = (selectedSurname !== "all" ? 1 : 0) + (selectedHome !== "all" ? 1 : 0) + (statusFilter !== "all" ? 1 : 0) + (generationRange[0] > 1 || generationRange[1] < 100 ? 1 : 0) return (

家族成员列表

setQuery(e.target.value)} />
{/* Filter Bar */} {showFilters && (

高级筛选

{generationRange[0]} - {generationRange[1]} 世
setGenerationRange(val as [number, number])} className="py-4" />
)}
{filteredMembers.length === 0 ? (
没有找到匹配的成员。
) : (
{membersByGeneration.map(({ generation, members }) => (

第 {generation} 世

共 {members.length} 人
{members.map((member) => (

{member.fullName} {member.courtesyName && ( 字 {member.courtesyName} )}

{member.generationName ? `字辈: ${member.generationName}` : "未录入字辈"}

{member.ancestralHome || "籍贯未知"}

{(member.deathDate || member.tags?.length) && (
{member.deathDate && ( 已故 )} {member.tags?.map((tag) => ( {tag} ))}
)}
))}
))}
)}
) }