0.8.0.0
This commit is contained in:
+62
-13
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user