0.0.1.1
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user