This commit is contained in:
freedakgmail
2025-11-23 09:24:14 +08:00
parent bade25ff26
commit 00cfae381b
488 changed files with 4141 additions and 1182075 deletions
+19 -41
View File
@@ -1,7 +1,7 @@
"use client"
import type React from "react"
import { createContext, useContext, useState, useCallback, useEffect, useRef } from "react"
import { createContext, useContext, useState, useCallback, useEffect, useRef, Suspense } from "react"
import type { FamilyMember, FamilyTreeData } from "@/types/family"
import { useSession } from "next-auth/react"
import { useSearchParams } from "next/navigation"
@@ -33,7 +33,7 @@ interface FamilyContextType {
const FamilyContext = createContext<FamilyContextType | undefined>(undefined)
export function FamilyProvider({ children }: { children: React.ReactNode }) {
function FamilyProviderInner({ children }: { children: React.ReactNode }) {
const { data: session, status } = useSession()
const searchParams = useSearchParams()
const [searchResults, setSearchResults] = useState<FamilyMember[]>([])
@@ -75,13 +75,11 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
// 如果正在加载相同的树,跳过
if (loadingTreeIdRef.current === targetTreeId) {
console.log('⏭️ 跳过重复加载:', targetTreeId)
return
}
// 如果 treeId 与当前树相同,跳过
if (treeId && treeId === currentTree?.id) {
console.log('⏭️ 已加载该树,跳过:', treeId)
return
}
@@ -101,15 +99,6 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
}
const data = await res.json()
console.log('🌳 获取家族树响应:', {
fetchUrl,
targetTreeId,
responseData: data,
treesCount: data.trees?.length,
firstTree: data.trees?.[0],
singleTree: data.tree
})
if (signal.aborted) return
let tree = null
@@ -119,28 +108,16 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
tree = data.tree
}
console.log('🎯 选择的家族树:', tree)
if (tree) {
setCurrentTree(tree)
// 加载该树的成员数据
console.log('🔄 开始加载成员数据:', { treeId: tree.id, treeName: tree.name })
try {
const memberRes = await fetch(`/api/trees/${tree.id}/members`, { signal })
console.log('📡 成员数据响应状态:', memberRes.status, memberRes.ok)
if (!memberRes.ok) {
throw new Error(`Failed to load members: ${memberRes.status}`)
}
const memberData = await memberRes.json()
console.log('📊 获取到的成员数据:', {
treeId: tree.id,
treeName: tree.name,
membersCount: memberData.members?.length || 0,
members: memberData.members,
rootId: memberData.rootId
})
if (signal.aborted) return
if (memberData.members) {
@@ -151,11 +128,6 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
},
{}
)
console.log('✅ 设置 treeData:', {
rootId: memberData.rootId || "",
membersMapKeys: Object.keys(membersMap),
membersMapCount: Object.keys(membersMap).length
})
setTreeData({
rootId: memberData.rootId || "",
members: membersMap,
@@ -163,7 +135,6 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
}
} catch (err: any) {
if (err.name === 'AbortError') {
console.log('❌ 成员数据加载被中断')
return
}
console.error('加载成员数据失败:', err)
@@ -176,7 +147,6 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
}
} catch (err: any) {
if (err.name === 'AbortError') {
console.log('❌ 家族树加载被中断')
return
}
@@ -357,15 +327,15 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
}, [loadData])
// 监听 treeData 变化
useEffect(() => {
console.log('🔄 FamilyContext treeData 更新:', {
rootId: treeData.rootId,
membersCount: Object.keys(treeData.members).length,
memberIds: Object.keys(treeData.members),
currentTreeId: currentTree?.id,
currentTreeName: currentTree?.name
})
}, [treeData, currentTree])
// useEffect(() => {
// console.log('🔄 FamilyContext treeData 更新:', {
// rootId: treeData.rootId,
// membersCount: Object.keys(treeData.members).length,
// memberIds: Object.keys(treeData.members),
// currentTreeId: currentTree?.id,
// currentTreeName: currentTree?.name
// })
// }, [treeData, currentTree])
return (
<FamilyContext.Provider
@@ -390,6 +360,14 @@ export function FamilyProvider({ children }: { children: React.ReactNode }) {
)
}
export function FamilyProvider({ children }: { children: React.ReactNode }) {
return (
<Suspense fallback={<div>Loading...</div>}>
<FamilyProviderInner>{children}</FamilyProviderInner>
</Suspense>
)
}
export function useFamily() {
const context = useContext(FamilyContext)
if (context === undefined) {