(globalThis.TURBOPACK || (globalThis.TURBOPACK = [])).push([typeof document === "object" ? document.currentScript : undefined, "[project]/Documents/go-new/chinese-family-tree/lib/mock-data.ts [app-client] (ecmascript)", ((__turbopack_context__) => { "use strict"; __turbopack_context__.s([ "mockFamilyData", ()=>mockFamilyData ]); // Helper to create a member quickly const createMember = (id, name, gender, generation, props = {})=>{ const surname = "李"; return { id, surname, givenName: name, fullName: surname + name, gender, generation, spouseIds: [], childrenIds: [], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), ...props }; }; const members = { // ========== 第一代 (曾祖父母辈,1920年代出生) ========== "1": createMember("1", "国强", "male", 1, { ancestralHome: "广东省广州市", bio: "李氏家族第一代,抗战时期参加革命工作,新中国成立后在政府部门工作,为人正直,深受敬重。", tags: [ "革命干部", "始祖" ], birthDate: "1925-03-15", deathDate: "2008-08-20", spouseIds: [ "2" ], childrenIds: [ "3", "4", "5" ] }), "2": createMember("2", "秀芳", "female", 1, { fullName: "王秀芳", surname: "王", givenName: "秀芳", ancestralHome: "广东省广州市", bio: "知识分子家庭出身,建国后在学校任教,相夫教子,育有三子。", birthDate: "1928-07-08", deathDate: "2015-12-10", spouseIds: [ "1" ], childrenIds: [ "3", "4", "5" ] }), // ========== 第二代 (祖父母辈,1950年代出生) ========== "3": createMember("3", "建华", "male", 2, { fatherId: "1", motherId: "2", ancestralHome: "广东省深圳市", birthPlace: "广东省深圳市", bio: "国强长子,改革开放后下海经商,迁往深圳创办家族企业,事业有成。", tags: [ "企业家" ], birthDate: "1952-05-20", deathDate: "2020-03-15", spouseIds: [ "6" ], childrenIds: [ "9", "10" ] }), "4": createMember("4", "建国", "male", 2, { fatherId: "1", motherId: "2", generationName: "建", rank: 2, bio: "次子,大学教授,追随教育事业迁往北京,从事教育工作四十余年,桃李满天下。", tags: [ "教授", "次子" ], birthDate: "1955-11-03", ancestralHome: "北京市", birthPlace: "北京市", spouseIds: [ "7" ], childrenIds: [ "11", "12", "13" ] }), "5": createMember("5", "建军", "male", 2, { fatherId: "1", motherId: "2", generationName: "建", rank: 3, bio: "三子,医生,支援西部建设迁往上海,从医三十余年,救死扶伤。", tags: [ "医生", "三子" ], birthDate: "1958-11-03", ancestralHome: "上海市", birthPlace: "上海市", spouseIds: [ "8" ], childrenIds: [ "14" ] }), // 第二代配偶 "6": createMember("6", "丽华", "female", 2, { fullName: "陈丽华", surname: "陈", givenName: "丽华", ancestralHome: "广东省深圳市", bio: "建华之妻,企业管理者,协助丈夫打理家族企业。", birthDate: "1955-05-20", deathDate: "2021-11-05", spouseIds: [ "3" ], childrenIds: [ "9", "10" ] }), "7": createMember("7", "美玲", "female", 2, { fullName: "张美玲", surname: "张", givenName: "美玲", ancestralHome: "广东省广州市", bio: "建国之妻,中学教师,与丈夫志同道合,共同从事教育事业。", birthDate: "1957-01-15", spouseIds: [ "4" ], childrenIds: [ "11", "12", "13" ] }), "8": createMember("8", "雅琴", "female", 2, { fullName: "林雅琴", surname: "林", givenName: "雅琴", ancestralHome: "福建省厦门市", bio: "建军之妻,护士长,温柔贤惠,善于持家。", birthDate: "1960-08-10", spouseIds: [ "5" ], childrenIds: [ "14" ] }), // ========== 第三代 (父母辈,1980年代出生) ========== "9": createMember("9", "志远", "male", 3, { fatherId: "3", motherId: "6", generationName: "志", rank: 1, ancestralHome: "广东省深圳市", birthPlace: "广东省深圳市", bio: "建华长子,留学归国,接管家族企业,推动企业转型升级。", tags: [ "企业家", "海归" ], birthDate: "1980-03-08", phone: "13800138001", email: "zhiyuan.li@company.com", address: "广东省广州市天河区珠江新城XX路XX号", spouseIds: [ "15" ], childrenIds: [ "17", "18" ] }), "10": createMember("10", "志强", "male", 3, { fatherId: "3", motherId: "6", generationName: "志", rank: 2, ancestralHome: "北京市", birthPlace: "北京市", bio: "建华次子,互联网创业者,北上创业,创办科技公司。", tags: [ "创业者", "科技" ], birthDate: "1983-07-22", phone: "13900139002", email: "zhiqiang.li@techco.com", address: "北京市朝阳区望京SOHO", spouseIds: [ "16" ], childrenIds: [ "19" ] }), "11": createMember("11", "志明", "male", 3, { fatherId: "4", motherId: "7", generationName: "志", rank: 1, ancestralHome: "广东省广州市", birthPlace: "广东省广州市", bio: "建国长子,大学副教授,从北京返回广州从事教育研究工作。", tags: [ "副教授", "学者" ], birthDate: "1982-01-18", phone: "13700137003", telephone: "020-8888-8888", email: "zhiming.li@university.edu.cn", address: "广东省广州市海珠区大学城", spouseIds: [ "20" ], childrenIds: [ "21", "22" ] }), "12": createMember("12", "志文", "male", 3, { fatherId: "4", motherId: "7", generationName: "志", rank: 2, bio: "建国次子,作家,追求文学梦想迁往成都,出版多部文学作品。", tags: [ "作家", "文学" ], birthDate: "1985-09-12", ancestralHome: "四川省成都市", birthPlace: "四川省成都市", phone: "13600136004", email: "zhiwen.li@writer.com" }), "13": createMember("13", "志勇", "male", 3, { fatherId: "4", motherId: "7", generationName: "志", rank: 3, ancestralHome: "上海市", birthPlace: "上海市", bio: "建国三子,律师,从北京迁往上海,执业于知名律师事务所。", tags: [ "律师" ], birthDate: "1988-11-05", phone: "13500135005", email: "zhiyong.li@lawfirm.com", address: "上海市浦东新区陆家嘴金融中心" }), "14": createMember("14", "志诚", "male", 3, { fatherId: "5", motherId: "8", generationName: "志", rank: 1, ancestralHome: "广东省深圳市", birthPlace: "广东省深圳市", bio: "建军独子,医生,从上海迁往深圳,继承父业,在医院工作。", tags: [ "医生" ], birthDate: "1986-04-28", phone: "13400134006", telephone: "0755-6666-6666", email: "zhicheng.li@hospital.com", address: "广东省深圳市福田区人民医院", spouseIds: [ "23" ], childrenIds: [ "24" ] }), // 第三代配偶 "15": createMember("15", "晓雯", "female", 3, { fullName: "赵晓雯", surname: "赵", givenName: "晓雯", ancestralHome: "上海市", bio: "志远之妻,金融行业从业者,MBA学位。", birthDate: "1982-06-15", spouseIds: [ "9" ], childrenIds: [ "17", "18" ] }), "16": createMember("16", "诗涵", "female", 3, { fullName: "刘诗涵", surname: "刘", givenName: "诗涵", ancestralHome: "北京市", bio: "志强之妻,设计师,从事品牌设计工作。", birthDate: "1985-10-08", spouseIds: [ "10" ], childrenIds: [ "19" ] }), "20": createMember("20", "雨欣", "female", 3, { fullName: "周雨欣", surname: "周", givenName: "雨欣", ancestralHome: "浙江省杭州市", bio: "志明之妻,中学教师,温柔贤淑。", birthDate: "1984-02-25", spouseIds: [ "11" ], childrenIds: [ "21", "22" ] }), "23": createMember("23", "婉婷", "female", 3, { fullName: "郑婉婷", surname: "郑", givenName: "婉婷", ancestralHome: "广东省广州市", bio: "志诚之妻,护士,在医院工作。", birthDate: "1988-12-03", spouseIds: [ "14" ], childrenIds: [ "24" ] }), // ========== 第四代 (子女辈,2010年代出生) ========== "17": createMember("17", "浩然", "male", 4, { fatherId: "9", motherId: "15", generationName: "浩", rank: 1, bio: "志远长子,在读高中生,成绩优异。", tags: [ "学生" ], birthDate: "2010-05-10" }), "18": createMember("18", "思琪", "female", 4, { fatherId: "9", motherId: "15", generationName: "思", rank: 2, bio: "志远次女,在读初中,喜欢绘画。", tags: [ "学生" ], birthDate: "2013-08-22" }), "19": createMember("19", "宇轩", "male", 4, { fatherId: "10", motherId: "16", generationName: "宇", rank: 1, bio: "志强独子,在读小学,对编程感兴趣。", tags: [ "学生" ], birthDate: "2015-11-18" }), "21": createMember("21", "梓涵", "female", 4, { fatherId: "11", motherId: "20", generationName: "梓", rank: 1, bio: "志明长女,在读大学,主修经济学。", tags: [ "大学生" ], birthDate: "2007-03-05" }), "22": createMember("22", "子轩", "male", 4, { fatherId: "11", motherId: "20", generationName: "子", rank: 2, bio: "志明次子,在读高中,擅长数学。", tags: [ "学生" ], birthDate: "2010-07-14" }), "24": createMember("24", "欣怡", "female", 4, { fatherId: "14", motherId: "23", generationName: "欣", rank: 1, bio: "志诚独女,在读初中,活泼可爱。", tags: [ "学生" ], birthDate: "2012-09-20" }) }; const mockFamilyData = { members, rootId: "1" }; if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) { __turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$); } }), "[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-client] (ecmascript)", ((__turbopack_context__) => { "use strict"; __turbopack_context__.s([ "FamilyTreeDB", ()=>FamilyTreeDB, "db", ()=>db ]); var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/dexie@4.2.1/node_modules/dexie/import-wrapper.mjs [app-client] (ecmascript)"); ; class FamilyTreeDB extends __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$40$4$2e$2$2e$1$2f$node_modules$2f$dexie$2f$import$2d$wrapper$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["default"] { members; settings; images; constructor(){ super("FamilyTreeDB"); this.version(1).stores({ members: "id, fullName, fatherId, motherId, [fatherId+motherId]", settings: "key", images: "id" }); } } const db = new FamilyTreeDB(); if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) { __turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$); } }), "[project]/Documents/go-new/chinese-family-tree/lib/notifications.ts [app-client] (ecmascript)", ((__turbopack_context__) => { "use strict"; __turbopack_context__.s([ "checkTodayAnniversaries", ()=>checkTodayAnniversaries, "checkUpcomingAnniversaries", ()=>checkUpcomingAnniversaries, "notifyTodayAnniversaries", ()=>notifyTodayAnniversaries, "requestNotificationPermission", ()=>requestNotificationPermission, "sendNotification", ()=>sendNotification, "setupDailyNotificationCheck", ()=>setupDailyNotificationCheck ]); async function requestNotificationPermission() { if (("TURBOPACK compile-time value", "object") === "undefined" || !("Notification" in window)) { console.warn("浏览器不支持通知"); return false; } if (Notification.permission === "granted") { return true; } if (Notification.permission !== "denied") { const permission = await Notification.requestPermission(); return permission === "granted"; } return false; } function sendNotification(title, options) { if (("TURBOPACK compile-time value", "object") === "undefined" || !("Notification" in window)) { return; } if (Notification.permission === "granted") { new Notification(title, { icon: "/icon.svg", badge: "/icon.svg", ...options }); } } function checkTodayAnniversaries(members) { const today = new Date(); const currentMonth = today.getMonth() + 1; const currentDay = today.getDate(); const birthdays = []; const deathdays = []; members.forEach((member)=>{ // 检查生日 if (member.birthDate) { const birthDate = new Date(member.birthDate); if (birthDate.getMonth() + 1 === currentMonth && birthDate.getDate() === currentDay) { birthdays.push(member); } } // 检查忌日 if (member.deathDate) { const deathDate = new Date(member.deathDate); if (deathDate.getMonth() + 1 === currentMonth && deathDate.getDate() === currentDay) { deathdays.push(member); } } }); return { birthdays, deathdays }; } function checkUpcomingAnniversaries(members, days = 7) { const today = new Date(); const birthdays = []; const deathdays = []; members.forEach((member)=>{ // 检查生日 if (member.birthDate) { const birthDate = new Date(member.birthDate); const thisYearBirthday = new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate()); if (thisYearBirthday < today) { thisYearBirthday.setFullYear(today.getFullYear() + 1); } const daysUntil = Math.ceil((thisYearBirthday.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); if (daysUntil > 0 && daysUntil <= days) { birthdays.push({ member, daysUntil }); } } // 检查忌日 if (member.deathDate) { const deathDate = new Date(member.deathDate); const thisYearDeathday = new Date(today.getFullYear(), deathDate.getMonth(), deathDate.getDate()); if (thisYearDeathday < today) { thisYearDeathday.setFullYear(today.getFullYear() + 1); } const daysUntil = Math.ceil((thisYearDeathday.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); if (daysUntil > 0 && daysUntil <= days) { deathdays.push({ member, daysUntil }); } } }); return { birthdays, deathdays }; } function notifyTodayAnniversaries(members) { const { birthdays, deathdays } = checkTodayAnniversaries(members); if (birthdays.length > 0) { const names = birthdays.map((m)=>m.fullName).join("、"); sendNotification("🎂 今日生日提醒", { body: `今天是 ${names} 的生日!`, tag: "birthday-today" }); } if (deathdays.length > 0) { const names = deathdays.map((m)=>m.fullName).join("、"); sendNotification("🕯️ 今日忌日提醒", { body: `今天是 ${names} 的忌日,缅怀先人。`, tag: "deathday-today" }); } } function setupDailyNotificationCheck(members) { if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable ; // 检查是否已经在今天检查过 const lastCheckDate = localStorage.getItem("lastNotificationCheck"); const today = new Date().toDateString(); if (lastCheckDate !== today) { notifyTodayAnniversaries(members); localStorage.setItem("lastNotificationCheck", today); } // 设置每小时检查一次(防止用户长时间开着页面) setInterval(()=>{ const currentDate = new Date().toDateString(); const lastCheck = localStorage.getItem("lastNotificationCheck"); if (lastCheck !== currentDate) { notifyTodayAnniversaries(members); localStorage.setItem("lastNotificationCheck", currentDate); } }, 60 * 60 * 1000); // 每小时检查一次 } if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) { __turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$); } }), "[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx [app-client] (ecmascript)", ((__turbopack_context__) => { "use strict"; __turbopack_context__.s([ "FamilyProvider", ()=>FamilyProvider, "useFamily", ()=>useFamily ]); var __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$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/next/dist/compiled/react/jsx-dev-runtime.js [app-client] (ecmascript)"); var __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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/next@16.0.3_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/next/dist/compiled/react/index.js [app-client] (ecmascript)"); var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$mock$2d$data$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/mock-data.ts [app-client] (ecmascript)"); var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/db.ts [app-client] (ecmascript)"); var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$2d$react$2d$hooks$40$4$2e$2$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_dexie$40$4$2e$2$2e$1_react$40$19$2e$2$2e$0$2f$node_modules$2f$dexie$2d$react$2d$hooks$2f$dist$2f$dexie$2d$react$2d$hooks$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/node_modules/.pnpm/dexie-react-hooks@4.2.0_@types+react@19.2.6_dexie@4.2.1_react@19.2.0/node_modules/dexie-react-hooks/dist/dexie-react-hooks.mjs [app-client] (ecmascript)"); var __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$notifications$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/Documents/go-new/chinese-family-tree/lib/notifications.ts [app-client] (ecmascript)"); ; var _s = __turbopack_context__.k.signature(), _s1 = __turbopack_context__.k.signature(); "use client"; ; ; ; ; ; 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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["createContext"])(undefined); function FamilyProvider({ children }) { _s(); 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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useState"])([]); const [isInitialized, setIsInitialized] = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useState"])(false); const [highlightedMemberId, setHighlightedMemberId] = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useState"])(null); // Live query to get all members const members = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$2d$react$2d$hooks$40$4$2e$2$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_dexie$40$4$2e$2$2e$1_react$40$19$2e$2$2e$0$2f$node_modules$2f$dexie$2d$react$2d$hooks$2f$dist$2f$dexie$2d$react$2d$hooks$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useLiveQuery"])({ "FamilyProvider.useLiveQuery[members]": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.toArray() }["FamilyProvider.useLiveQuery[members]"]); // Live query to get rootId const rootIdSetting = (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$2d$react$2d$hooks$40$4$2e$2$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_dexie$40$4$2e$2$2e$1_react$40$19$2e$2$2e$0$2f$node_modules$2f$dexie$2d$react$2d$hooks$2f$dist$2f$dexie$2d$react$2d$hooks$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useLiveQuery"])({ "FamilyProvider.useLiveQuery[rootIdSetting]": ()=>__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].settings.get("rootId") }["FamilyProvider.useLiveQuery[rootIdSetting]"]); // Initialize DB with mock data if empty (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useEffect"])({ "FamilyProvider.useEffect": ()=>{ const initDb = { "FamilyProvider.useEffect.initDb": async ()=>{ const count = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.count(); if (count === 0) { await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].transaction("rw", __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].settings, { "FamilyProvider.useEffect.initDb": async ()=>{ await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.bulkAdd(Object.values(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$mock$2d$data$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["mockFamilyData"].members)); await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].settings.put({ key: "rootId", value: __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$mock$2d$data$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["mockFamilyData"].rootId }); } }["FamilyProvider.useEffect.initDb"]); } setIsInitialized(true); } }["FamilyProvider.useEffect.initDb"]; initDb(); } }["FamilyProvider.useEffect"], []); // 设置通知检查 (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useEffect"])({ "FamilyProvider.useEffect": ()=>{ if (isInitialized && members && members.length > 0) { // 检查通知权限并设置每日检查 if ("Notification" in window && Notification.permission === "granted") { (0, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$notifications$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["setupDailyNotificationCheck"])(members); } } } }["FamilyProvider.useEffect"], [ isInitialized, members ]); // Construct treeData from DB results const treeData = { rootId: rootIdSetting?.value || "", members: (members || []).reduce((acc, member)=>{ acc[member.id] = member; return acc; }, {}) }; 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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useCallback"])({ "FamilyProvider.useCallback[getMember]": (id)=>{ return treeData.members[id]; } }["FamilyProvider.useCallback[getMember]"], [ treeData ]); const addMember = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useCallback"])({ "FamilyProvider.useCallback[addMember]": async (member)=>{ await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].transaction("rw", __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members, { "FamilyProvider.useCallback[addMember]": async ()=>{ // Add the member await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.add(member); // Update relationships (Father) if (member.fatherId) { const father = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.get(member.fatherId); if (father && !father.childrenIds.includes(member.id)) { await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.update(member.fatherId, { childrenIds: [ ...father.childrenIds, member.id ] }); } } // Update relationships (Mother) if (member.motherId) { const mother = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.get(member.motherId); if (mother && !mother.childrenIds.includes(member.id)) { await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.update(member.motherId, { childrenIds: [ ...mother.childrenIds, member.id ] }); } } // Update relationships (Spouses) if (member.spouseIds && member.spouseIds.length > 0) { for (const spouseId of member.spouseIds){ const spouse = await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.get(spouseId); if (spouse && !spouse.spouseIds.includes(member.id)) { await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.update(spouseId, { spouseIds: [ ...spouse.spouseIds, member.id ] }); } } } } }["FamilyProvider.useCallback[addMember]"]); } }["FamilyProvider.useCallback[addMember]"], []); const updateMember = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useCallback"])({ "FamilyProvider.useCallback[updateMember]": async (id, updates)=>{ await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.update(id, { ...updates, updatedAt: new Date().toISOString() }); } }["FamilyProvider.useCallback[updateMember]"], []); const deleteMember = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useCallback"])({ "FamilyProvider.useCallback[deleteMember]": async (id)=>{ await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].transaction("rw", __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].settings, { "FamilyProvider.useCallback[deleteMember]": async ()=>{ // Remove from DB await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.delete(id); // Note: In a real app, we should also remove references to this ID from other members' // childrenIds, spouseIds, etc. For now, we'll keep it simple as per the original implementation. // If we deleted the root, we might want to handle that, but for now let's leave it. } }["FamilyProvider.useCallback[deleteMember]"]); } }["FamilyProvider.useCallback[deleteMember]"], []); const loadData = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useCallback"])({ "FamilyProvider.useCallback[loadData]": async (data)=>{ await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].transaction("rw", __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members, __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].settings, { "FamilyProvider.useCallback[loadData]": async ()=>{ await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.clear(); await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].members.bulkAdd(Object.values(data.members)); await __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$db$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["db"].settings.put({ key: "rootId", value: data.rootId }); } }["FamilyProvider.useCallback[loadData]"]); } }["FamilyProvider.useCallback[loadData]"], []); const resetData = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useCallback"])({ "FamilyProvider.useCallback[resetData]": async ()=>{ await loadData(__TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$lib$2f$mock$2d$data$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["mockFamilyData"]); } }["FamilyProvider.useCallback[resetData]"], [ loadData ]); const searchMembers = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useCallback"])({ "FamilyProvider.useCallback[searchMembers]": (query)=>{ if (!query.trim()) { setSearchResults([]); return; } const lowerQuery = query.toLowerCase(); // Perform search on the in-memory treeData for simplicity and speed // (Dexie also supports querying, but we already have the data loaded) const results = Object.values(treeData.members).filter({ "FamilyProvider.useCallback[searchMembers].results": (member)=>member.fullName.includes(lowerQuery) || member.givenName.includes(lowerQuery) || member.courtesyName?.includes(lowerQuery) || member.artName?.includes(lowerQuery) }["FamilyProvider.useCallback[searchMembers].results"]); setSearchResults(results); } }["FamilyProvider.useCallback[searchMembers]"], [ treeData ]); // Listen for import events (legacy support for the file input in settings if needed, // but we should prefer using the context method) (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useEffect"])({ "FamilyProvider.useEffect": ()=>{ const handleImport = { "FamilyProvider.useEffect.handleImport": (e)=>{ loadData(e.detail); } }["FamilyProvider.useEffect.handleImport"]; window.addEventListener("family-data-import", handleImport); return ({ "FamilyProvider.useEffect": ()=>window.removeEventListener("family-data-import", handleImport) })["FamilyProvider.useEffect"]; } }["FamilyProvider.useEffect"], [ loadData ]); return /*#__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$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(FamilyContext.Provider, { value: { treeData, getMember, addMember, updateMember, deleteMember, searchResults, searchMembers, loadData, resetData, isLoading: !isInitialized || !members, highlightedMemberId, setHighlightedMemberId }, children: children }, void 0, false, { fileName: "[project]/Documents/go-new/chinese-family-tree/context/family-context.tsx", lineNumber: 185, columnNumber: 5 }, this); } _s(FamilyProvider, "Z8JbHypIWB7xWhr4KfFw1q/vc28=", false, function() { return [ __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$2d$react$2d$hooks$40$4$2e$2$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_dexie$40$4$2e$2$2e$1_react$40$19$2e$2$2e$0$2f$node_modules$2f$dexie$2d$react$2d$hooks$2f$dist$2f$dexie$2d$react$2d$hooks$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useLiveQuery"], __TURBOPACK__imported__module__$5b$project$5d2f$Documents$2f$go$2d$new$2f$chinese$2d$family$2d$tree$2f$node_modules$2f2e$pnpm$2f$dexie$2d$react$2d$hooks$40$4$2e$2$2e$0_$40$types$2b$react$40$19$2e$2$2e$6_dexie$40$4$2e$2$2e$1_react$40$19$2e$2$2e$0$2f$node_modules$2f$dexie$2d$react$2d$hooks$2f$dist$2f$dexie$2d$react$2d$hooks$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useLiveQuery"] ]; }); _c = FamilyProvider; function useFamily() { _s1(); const context = (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$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useContext"])(FamilyContext); if (context === undefined) { throw new Error("useFamily must be used within a FamilyProvider"); } return context; } _s1(useFamily, "b9L3QQ+jgeyIrH0NfHrJ8nn7VMU="); var _c; __turbopack_context__.k.register(_c, "FamilyProvider"); if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) { __turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$); } }), ]); //# sourceMappingURL=Documents_go-new_chinese-family-tree_a6cc4283._.js.map