This commit is contained in:
freedakgmail
2025-12-21 17:32:33 +08:00
parent cffdd75e96
commit 5c8c70097c
190 changed files with 2746 additions and 893 deletions
+62 -13
View File
@@ -12,23 +12,25 @@ import type { FamilyMember } from "@/types/family"
import { useMemo, useEffect, useState } from "react"
import { useSession } from "next-auth/react"
import { BackButton } from "@/components/ui/back-button"
import { useDialog } from "@/components/ui/alert-dialog-custom"
export default function NewMemberPage() {
const router = useRouter()
const searchParams = useSearchParams()
const { addMember, treeData, getMember } = useFamily()
const { showAlert, showConfirm } = useDialog()
const { data: session, status } = useSession()
const [activeTab, setActiveTab] = useState("info")
const existingMembers = Object.values(treeData.members)
const isFirstMember = existingMembers.length === 0
// 未登录时重定向到登录页
useEffect(() => {
if (status === 'unauthenticated') {
router.push('/auth/signin')
}
}, [status, router])
const existingMembers = Object.values(treeData.members)
const isFirstMember = existingMembers.length === 0
// 从URL参数获取预填信息
const initialData = useMemo(() => {
@@ -128,9 +130,46 @@ export default function NewMemberPage() {
return '成员'
}, [searchParams, isFirstMember])
// 判断是否是给始祖添加父母(新成员将成为新始祖)
const isAddingParentToFounder = useMemo(() => {
const childId = searchParams.get('childId')
if (!childId) return false
const child = getMember(childId)
return child?.generation === 1
}, [searchParams, getMember])
// 是否应该显示始祖样式
const showFounderStyle = isFirstMember || isAddingParentToFounder
const handleSave = async (newMember: FamilyMember) => {
try {
// 检查是否正在给始祖添加父母
const childId = searchParams.get('childId')
if (childId && memberType === '父母') {
const child = getMember(childId)
// 如果子女不存在(已被删除),提示用户
if (!child) {
await showAlert('目标成员已不存在,无法添加父母。请返回成员列表重新操作。', "提示")
const params = new URLSearchParams(window.location.search)
router.push(`/members?${params.toString()}`)
return
}
// 如果子女是第1代(始祖),需要确认
if (child.generation === 1) {
const confirmed = await showConfirm(
'您正在给始祖添加父母,这将导致全族代数重新计算。\n原第1代将变为第2代,以此类推。\n\n是否继续?',
"确认操作"
)
if (!confirmed) {
return
}
}
}
// 如果是第一个成员,自动设置为始祖
const memberData = isFirstMember ? {
...newMember,
@@ -144,13 +183,23 @@ export default function NewMemberPage() {
updatedAt: new Date().toISOString(),
}
await addMember(memberData)
// 跳转到成员列表页,保留treeId参数
const params = new URLSearchParams(window.location.search)
router.push(`/members?${params.toString()}`)
const result = await addMember(memberData)
// 构建跳转参数
const params = new URLSearchParams()
const treeId = searchParams.get('treeId')
if (treeId) params.set('treeId', treeId)
// 如果有提示信息(代数调整),显示给用户,等待用户确认后再跳转
if (result.message) {
await showAlert(result.message, "提示")
}
// 跳转到新成员的详情页
router.push(`/members/${result.member.id}?${params.toString()}`)
} catch (error) {
console.error('添加成员失败:', error)
alert('添加成员失败: ' + (error as Error).message)
await showAlert('添加成员失败: ' + (error as Error).message, "错误")
}
}
@@ -167,8 +216,8 @@ export default function NewMemberPage() {
{/* Header Section */}
<div className="flex flex-col md:flex-row justify-between items-start gap-3 md:gap-6 pb-3 md:pb-4">
<div className="flex items-start gap-3 md:gap-6">
<div className={`h-14 w-14 md:h-24 md:w-24 rounded-lg bg-muted flex items-center justify-center border-2 ${isFirstMember ? 'border-amber-400 bg-amber-50/30' : 'border-primary/20'} overflow-hidden flex-shrink-0`}>
{isFirstMember ? (
<div className={`h-14 w-14 md:h-24 md:w-24 rounded-lg bg-muted flex items-center justify-center border-2 ${showFounderStyle ? 'border-amber-400 bg-amber-50/30' : 'border-primary/20'} overflow-hidden flex-shrink-0`}>
{showFounderStyle ? (
<span className="text-2xl md:text-4xl">👑</span>
) : (
<UserPlus className="h-8 w-8 md:h-16 md:w-16 text-muted-foreground" />
@@ -177,10 +226,10 @@ export default function NewMemberPage() {
<div className="min-w-0 flex-1">
<div className="flex items-center gap-2 md:gap-3 mb-1 md:mb-2 flex-wrap">
<h1 className="text-lg md:text-3xl font-bold font-serif text-foreground flex items-center gap-1 md:gap-2">
{isFirstMember && <span className="text-amber-600 text-lg md:text-2xl">👑</span>}
{isFirstMember ? '添加家族始祖' : `添加${memberType}`}
{showFounderStyle && <span className="text-amber-600 text-lg md:text-2xl">👑</span>}
{isFirstMember ? '添加家族始祖' : isAddingParentToFounder ? '添加新始祖' : `添加${memberType}`}
</h1>
{isFirstMember && (
{showFounderStyle && (
<span className="px-2 md:px-3 py-0.5 md:py-1 bg-gradient-to-r from-amber-100 to-orange-100 text-amber-800 text-xs md:text-sm font-semibold rounded-full border-2 border-amber-300 shadow-sm">
· 1
</span>