This commit is contained in:
freedakgmail
2025-11-23 08:04:43 +08:00
parent e92884ae53
commit 81dbf709aa
95 changed files with 166729 additions and 2241 deletions
@@ -43,7 +43,7 @@ var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$ch
;
const FamilyContext = /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["createContext"])(undefined);
function FamilyProvider({ children }) {
const { data: session } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$2d$auth$40$4$2e$24$2e$13_next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0_$5f$react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSession"])();
const { data: session, status } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$2d$auth$40$4$2e$24$2e$13_next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0_$5f$react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2d$auth$2f$react$2f$index$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSession"])();
const searchParams = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$navigation$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useSearchParams"])();
const [searchResults, setSearchResults] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])([]);
const [isLoading, setIsLoading] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(true);
@@ -55,79 +55,116 @@ function FamilyProvider({ children }) {
const [currentTree, setCurrentTree] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useState"])(null);
// 监听 URL 和 Session 变化,加载家族树
(0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useEffect"])(()=>{
const treeId = searchParams.get('treeId');
console.log('FamilyContext - Effect triggered, treeId:', treeId, 'currentTree:', currentTree?.id);
// 如果 session 不存在,清除所有数据
if (!session?.user?.id) {
console.log('FamilyContext - No session, clearing data');
setCurrentTree(null);
setTreeData({
rootId: "",
members: {}
});
setIsLoading(false);
return;
}
// 如果 treeId 与当前树相同,跳过
if (treeId && treeId === currentTree?.id) {
console.log('FamilyContext - Same tree, skipping');
return;
}
// 如果没有 treeId 且已有树,跳过
if (!treeId && currentTree) {
console.log('FamilyContext - No treeId but has currentTree, skipping');
return;
}
// 需要加载新树
const targetTreeId = treeId || 'first';
console.log('FamilyContext - Loading tree:', targetTreeId);
setIsLoading(true);
const fetchUrl = targetTreeId === 'first' ? '/api/trees' : `/api/trees/${targetTreeId}`;
console.log('FamilyContext - Fetching URL:', fetchUrl);
fetch(fetchUrl).then((res)=>res.json()).then((data)=>{
let tree = null;
if (targetTreeId === 'first') {
tree = data.trees?.[0];
} else {
tree = data.tree;
const controller = new AbortController();
const signal = controller.signal;
const loadTree = async ()=>{
const treeId = searchParams.get('treeId');
// 如果 session 正在加载,等待
if (status === 'loading') {
return;
}
console.log('FamilyContext - Fetched tree:', tree?.name, tree?.id);
if (tree) {
setCurrentTree(tree);
// 加载该树的成员数据
return fetch(`/api/trees/${tree.id}/members`).then((res)=>res.json()).then((memberData)=>{
console.log('FamilyContext - Loaded members:', memberData.members?.length);
if (memberData.members) {
const membersMap = memberData.members.reduce((acc, member)=>{
acc[member.id] = member;
return acc;
}, {});
// 如果 session 不存在(未登录),清除所有数据
if (!session?.user?.id) {
if (!signal.aborted) {
setCurrentTree(null);
setTreeData({
rootId: "",
members: {}
});
setIsLoading(false);
}
return;
}
// 如果 treeId 与当前树相同,跳过
if (treeId && treeId === currentTree?.id) {
return;
}
// 如果没有 treeId 且已有树,跳过
if (!treeId && currentTree) {
return;
}
// 需要加载新树
const targetTreeId = treeId || 'first';
if (!signal.aborted) setIsLoading(true);
const fetchUrl = targetTreeId === 'first' ? '/api/trees' : `/api/trees/${targetTreeId}`;
try {
const res = await fetch(fetchUrl, {
signal
});
if (!res.ok) {
throw new Error(`HTTP error! status: ${res.status}`);
}
const data = await res.json();
if (signal.aborted) return;
let tree = null;
if (targetTreeId === 'first') {
tree = data.trees?.[0];
} else {
tree = data.tree;
}
if (tree) {
setCurrentTree(tree);
// 加载该树的成员数据
try {
const memberRes = await fetch(`/api/trees/${tree.id}/members`, {
signal
});
if (!memberRes.ok) {
throw new Error(`Failed to load members: ${memberRes.status}`);
}
const memberData = await memberRes.json();
if (signal.aborted) return;
if (memberData.members) {
const membersMap = memberData.members.reduce((acc, member)=>{
acc[member.id] = member;
return acc;
}, {});
setTreeData({
rootId: memberData.rootId || "",
members: membersMap
});
}
} catch (err) {
if (err.name === 'AbortError') return;
console.error('加载成员数据失败:', err);
// 即使成员加载失败,也保留树的信息
setTreeData({
rootId: memberData.rootId || "",
members: membersMap
rootId: "",
members: {}
});
}
});
} else {
// 没找到树(可能是被删除了,或者没有权限)
console.log('FamilyContext - Tree not found');
} else {
setCurrentTree(null);
setTreeData({
rootId: "",
members: {}
});
}
} catch (err) {
if (err.name === 'AbortError') return;
// 忽略 Failed to fetch 错误,通常发生在页面跳转或网络问题时
if (err.message === 'Failed to fetch' || err.toString().includes('Failed to fetch')) {
return;
}
console.error('加载家族树失败:', err.message || err);
setCurrentTree(null);
setTreeData({
rootId: "",
members: {}
});
} finally{
if (!signal.aborted) setIsLoading(false);
}
}).catch((err)=>{
console.error('FamilyContext - Load failed:', err);
setCurrentTree(null);
setTreeData({
rootId: "",
members: {}
});
}).finally(()=>setIsLoading(false));
};
loadTree();
return ()=>{
controller.abort();
};
}, [
searchParams,
session?.user?.id
session?.user?.id,
status,
currentTree?.id
]);
const getMember = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$next$40$16$2e$0$2e$3_react$2d$dom$40$19$2e$2$2e$0_react$40$19$2e$2$2e$0_$5f$react$40$19$2e$2$2e$0$2f$node_modules$2f$next$2f$dist$2f$server$2f$route$2d$modules$2f$app$2d$page$2f$vendored$2f$ssr$2f$react$2e$js__$5b$app$2d$ssr$5d$__$28$ecmascript$29$__["useCallback"])((id)=>{
return treeData.members[id];
@@ -286,7 +323,7 @@ function FamilyProvider({ children }) {
children: children
}, void 0, false, {
fileName: "[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx",
lineNumber: 286,
lineNumber: 316,
columnNumber: 5
}, this);
}