0.8.0.0
This commit is contained in:
+114
-89
@@ -6,6 +6,7 @@ import type { FamilyMember } from "@/types/family"
|
||||
import { PhotoGallery } from "@/components/members/photo-gallery"
|
||||
import { StoryManager } from "@/components/members/story-manager"
|
||||
import { useDialog } from "@/components/ui/alert-dialog-custom"
|
||||
// useDialog 已导入,用于 showAlert 和 showConfirm
|
||||
import { permissions } from "@/lib/permissions"
|
||||
import { MemberNameWithStatus } from "@/components/member-name-with-status"
|
||||
import { MemberVersionHistory } from "@/components/members/member-version-history"
|
||||
@@ -24,7 +25,7 @@ import { AddRelationDialog, type RelationType } from "@/components/tree/add-rela
|
||||
export default function MemberProfilePage() {
|
||||
const { id } = useParams()
|
||||
const { treeData, currentTree, getMember, updateMember, deleteMember, isLoading } = useFamily()
|
||||
const { showConfirm } = useDialog()
|
||||
const { showConfirm, showAlert } = useDialog()
|
||||
const router = useRouter()
|
||||
const { data: session, status } = useSession()
|
||||
const [isEditing, setIsEditing] = useState(false)
|
||||
@@ -90,6 +91,90 @@ export default function MemberProfilePage() {
|
||||
}
|
||||
}, [member?.avatarUrl])
|
||||
|
||||
// 姓名分解函数
|
||||
const parseName = (fullName: string): { surname: string; givenName: string } => {
|
||||
const name = fullName.trim()
|
||||
if (!name) return { surname: '', givenName: '' }
|
||||
|
||||
const compoundSurnames = [
|
||||
'欧阳', '太史', '端木', '上官', '司马', '东方', '独孤', '南宫', '万俟', '闻人',
|
||||
'夏侯', '诸葛', '尉迟', '公羊', '赫连', '澹台', '皇甫', '宗政', '濮阳', '公冶',
|
||||
'太叔', '申屠', '公孙', '慕容', '仲孙', '钟离', '长孙', '宇文', '司徒', '鲜于',
|
||||
'司空', '闾丘', '子车', '亓官', '司寇', '巫马', '公西', '颛孙', '壤驷', '公良',
|
||||
'漆雕', '乐正', '宰父', '谷梁', '拓跋', '夹谷', '轩辕', '令狐', '段干', '百里',
|
||||
'呼延', '东郭', '南门', '羊舌', '微生', '公户', '公玉', '公仪', '梁丘', '公仲',
|
||||
'公上', '公门', '公山', '公坚', '左丘', '公伯', '西门', '公祖', '第五', '公乘',
|
||||
'贯丘', '公皙', '南荣', '东里', '东宫', '仲长', '子书', '子桑', '即墨', '达奚', '褚师'
|
||||
]
|
||||
|
||||
for (const compound of compoundSurnames) {
|
||||
if (name.startsWith(compound) && name.length > compound.length) {
|
||||
return { surname: compound, givenName: name.slice(compound.length) }
|
||||
}
|
||||
}
|
||||
|
||||
if (name.length >= 2) {
|
||||
return { surname: name.charAt(0), givenName: name.slice(1) }
|
||||
}
|
||||
|
||||
return { surname: name, givenName: '' }
|
||||
}
|
||||
|
||||
// 创建新成员的处理函数 - 必须在条件return之前定义
|
||||
const handleCreateNewRelation = useCallback((prefillName: string, relationType: RelationType) => {
|
||||
if (!member) return
|
||||
const params = new URLSearchParams()
|
||||
|
||||
const { surname, givenName } = parseName(prefillName)
|
||||
if (surname) params.set("surname", surname)
|
||||
if (givenName) params.set("givenName", givenName)
|
||||
|
||||
if (relationType === "child") {
|
||||
params.set("generation", String(member.generation + 1))
|
||||
if (member.gender === "MALE") {
|
||||
params.set("fatherId", member.id)
|
||||
if (member.spouseIds?.length) {
|
||||
params.set("motherId", member.spouseIds[0])
|
||||
}
|
||||
} else if (member.gender === "FEMALE") {
|
||||
params.set("motherId", member.id)
|
||||
if (member.spouseIds?.length) {
|
||||
params.set("fatherId", member.spouseIds[0])
|
||||
}
|
||||
}
|
||||
} else if (relationType === "spouse") {
|
||||
params.set("generation", String(member.generation))
|
||||
params.set("spouseId", member.id)
|
||||
params.set("gender", member.gender === "MALE" ? "FEMALE" : "MALE")
|
||||
if (member.childrenIds && member.childrenIds.length > 0) {
|
||||
member.childrenIds.forEach(id => {
|
||||
params.append('childrenIds', id)
|
||||
})
|
||||
}
|
||||
} else if (relationType === "father") {
|
||||
params.set("generation", String(member.generation === 1 ? 1 : member.generation - 1))
|
||||
params.set("childId", member.id)
|
||||
params.set("gender", "MALE")
|
||||
if (member.motherId) {
|
||||
params.set("spouseId", member.motherId)
|
||||
}
|
||||
} else if (relationType === "mother") {
|
||||
params.set("generation", String(member.generation === 1 ? 1 : member.generation - 1))
|
||||
params.set("childId", member.id)
|
||||
params.set("gender", "FEMALE")
|
||||
if (member.fatherId) {
|
||||
params.set("spouseId", member.fatherId)
|
||||
}
|
||||
}
|
||||
|
||||
if (currentTree?.id) {
|
||||
params.set("treeId", currentTree.id)
|
||||
}
|
||||
|
||||
setRelationDialog(null)
|
||||
router.push(`/members/new?${params.toString()}`)
|
||||
}, [member, currentTree?.id, router])
|
||||
|
||||
// 显示加载状态
|
||||
if (isLoading) {
|
||||
return (
|
||||
@@ -122,97 +207,37 @@ export default function MemberProfilePage() {
|
||||
}
|
||||
|
||||
const handleDelete = async () => {
|
||||
const confirmed = await showConfirm("确定要删除这位成员吗?这将同时删除其关联关系。", "删除成员", "destructive")
|
||||
// 检查是否正在删除始祖
|
||||
let confirmMessage = "确定要删除这位成员吗?这将同时删除其关联关系。"
|
||||
if (member.generation === 1 && (!member.fatherId && !member.motherId)) {
|
||||
confirmMessage = "您正在删除始祖,这将导致全族代数重新计算。\n原第2代将变为第1代,以此类推。\n\n确定要删除这位成员吗?"
|
||||
}
|
||||
|
||||
const confirmed = await showConfirm(confirmMessage, "删除成员", "destructive")
|
||||
if (confirmed) {
|
||||
deleteMember(member.id)
|
||||
const params = new URLSearchParams(window.location.search)
|
||||
router.push(`/members?${params.toString()}`)
|
||||
try {
|
||||
const result = await deleteMember(member.id)
|
||||
|
||||
// 构建跳转参数,只保留 treeId
|
||||
const treeId = new URLSearchParams(window.location.search).get('treeId')
|
||||
const params = new URLSearchParams()
|
||||
if (treeId) params.set('treeId', treeId)
|
||||
|
||||
// 如果有提示信息(代数调整),显示给用户,等待确认后再跳转
|
||||
if (result.message) {
|
||||
await showAlert(result.message, "提示")
|
||||
}
|
||||
|
||||
// 删除后跳转到成员列表页
|
||||
router.push(`/members?${params.toString()}`)
|
||||
} catch (error) {
|
||||
console.error('删除成员失败:', error)
|
||||
await showAlert('删除成员失败: ' + (error as Error).message, "错误")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 姓名分解函数
|
||||
const parseName = (fullName: string): { surname: string; givenName: string } => {
|
||||
const name = fullName.trim()
|
||||
if (!name) return { surname: '', givenName: '' }
|
||||
|
||||
const compoundSurnames = [
|
||||
'欧阳', '太史', '端木', '上官', '司马', '东方', '独孤', '南宫', '万俟', '闻人',
|
||||
'夏侯', '诸葛', '尉迟', '公羊', '赫连', '澹台', '皇甫', '宗政', '濮阳', '公冶',
|
||||
'太叔', '申屠', '公孙', '慕容', '仲孙', '钟离', '长孙', '宇文', '司徒', '鲜于',
|
||||
'司空', '闾丘', '子车', '亓官', '司寇', '巫马', '公西', '颛孙', '壤驷', '公良',
|
||||
'漆雕', '乐正', '宰父', '谷梁', '拓跋', '夹谷', '轩辕', '令狐', '段干', '百里',
|
||||
'呼延', '东郭', '南门', '羊舌', '微生', '公户', '公玉', '公仪', '梁丘', '公仲',
|
||||
'公上', '公门', '公山', '公坚', '左丘', '公伯', '西门', '公祖', '第五', '公乘',
|
||||
'贯丘', '公皙', '南荣', '东里', '东宫', '仲长', '子书', '子桑', '即墨', '达奚', '褚师'
|
||||
]
|
||||
|
||||
for (const compound of compoundSurnames) {
|
||||
if (name.startsWith(compound) && name.length > compound.length) {
|
||||
return { surname: compound, givenName: name.slice(compound.length) }
|
||||
}
|
||||
}
|
||||
|
||||
if (name.length >= 2) {
|
||||
return { surname: name.charAt(0), givenName: name.slice(1) }
|
||||
}
|
||||
|
||||
return { surname: name, givenName: '' }
|
||||
}
|
||||
|
||||
// 创建新成员的处理函数
|
||||
const handleCreateNewRelation = useCallback((prefillName: string, relationType: RelationType) => {
|
||||
if (!member) return
|
||||
const params = new URLSearchParams()
|
||||
|
||||
const { surname, givenName } = parseName(prefillName)
|
||||
if (surname) params.set("surname", surname)
|
||||
if (givenName) params.set("givenName", givenName)
|
||||
|
||||
if (relationType === "child") {
|
||||
params.set("generation", String(member.generation + 1))
|
||||
if (member.gender === "MALE") {
|
||||
params.set("fatherId", member.id)
|
||||
if (member.spouseIds?.length) {
|
||||
params.set("motherId", member.spouseIds[0])
|
||||
}
|
||||
} else if (member.gender === "FEMALE") {
|
||||
params.set("motherId", member.id)
|
||||
if (member.spouseIds?.length) {
|
||||
params.set("fatherId", member.spouseIds[0])
|
||||
}
|
||||
}
|
||||
} else if (relationType === "spouse") {
|
||||
params.set("generation", String(member.generation))
|
||||
params.set("spouseId", member.id)
|
||||
params.set("gender", member.gender === "MALE" ? "FEMALE" : "MALE")
|
||||
if (member.childrenIds && member.childrenIds.length > 0) {
|
||||
member.childrenIds.forEach(id => {
|
||||
params.append('childrenIds', id)
|
||||
})
|
||||
}
|
||||
} else if (relationType === "father") {
|
||||
params.set("generation", String(member.generation - 1))
|
||||
params.set("childId", member.id)
|
||||
params.set("gender", "MALE")
|
||||
if (member.motherId) {
|
||||
params.set("spouseId", member.motherId)
|
||||
}
|
||||
} else if (relationType === "mother") {
|
||||
params.set("generation", String(member.generation - 1))
|
||||
params.set("childId", member.id)
|
||||
params.set("gender", "FEMALE")
|
||||
if (member.fatherId) {
|
||||
params.set("spouseId", member.fatherId)
|
||||
}
|
||||
}
|
||||
|
||||
if (currentTree?.id) {
|
||||
params.set("treeId", currentTree.id)
|
||||
}
|
||||
|
||||
setRelationDialog(null)
|
||||
router.push(`/members/new?${params.toString()}`)
|
||||
}, [member, currentTree?.id, router])
|
||||
// 创建新成员的处理函数 - 已移到条件return之前
|
||||
|
||||
const handleQuickAddChild = () => {
|
||||
setRelationDialog({ type: 'child' })
|
||||
@@ -259,7 +284,7 @@ export default function MemberProfilePage() {
|
||||
setLastSaveTime(Date.now())
|
||||
} catch (error) {
|
||||
console.error('上传头像失败:', error)
|
||||
alert('上传头像失败: ' + (error instanceof Error ? error.message : '未知错误'))
|
||||
showAlert('上传头像失败: ' + (error instanceof Error ? error.message : '未知错误'), "错误")
|
||||
} finally {
|
||||
setIsUploadingAvatar(false)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user