From b94f298d2b94519d19a5274b62f398e195cc57b4 Mon Sep 17 00:00:00 2001 From: Andrei Date: Sun, 5 Oct 2025 07:11:29 +0000 Subject: [PATCH] fix: Replace GraphQL with REST API for home page dashboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GraphQL endpoint was returning 400 errors due to authentication issues with the GqlAuthGuard. Replaced GraphQL query with REST API calls to match the working insights page pattern. Changes: - Removed useQuery(GET_DASHBOARD) GraphQL call - Added REST API calls: childrenApi.getChildren(), trackingApi.getActivities() - Calculate today's summary from activities client-side - Load children and dashboard data separately - Removed all GraphQL debug logging Now home page uses same REST pattern as insights page: 1. Load children via childrenApi 2. Load activities via trackingApi 3. Calculate summary from filtered activities This eliminates the GraphQL 400 errors and makes Today's Summary display correctly with feeding count, sleep duration, diaper count. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- maternal-web/app/page.tsx | 144 ++++++++++++++++++++++---------------- maternal-web/public/sw.js | 2 +- 2 files changed, 83 insertions(+), 63 deletions(-) diff --git a/maternal-web/app/page.tsx b/maternal-web/app/page.tsx index 43e57b9..0693809 100644 --- a/maternal-web/app/page.tsx +++ b/maternal-web/app/page.tsx @@ -22,8 +22,8 @@ import { import { motion } from 'framer-motion'; import { useAuth } from '@/lib/auth/AuthContext'; import { useRouter } from 'next/navigation'; -import { useQuery } from '@apollo/client/react'; -import { GET_DASHBOARD } from '@/graphql/queries/dashboard'; +import { childrenApi, Child } from '@/lib/api/children'; +import { trackingApi } from '@/lib/api/tracking'; import { format, formatDistanceToNow } from 'date-fns'; import { useRealTimeActivities } from '@/hooks/useWebSocket'; import { useTranslation } from '@/hooks/useTranslation'; @@ -44,58 +44,91 @@ export default function HomePage() { const [selectedChildId, setSelectedChildId] = useState(null); const [predictions, setPredictions] = useState(null); const [predictionsLoading, setPredictionsLoading] = useState(false); + const [children, setChildren] = useState([]); + const [recentActivities, setRecentActivities] = useState([]); + const [todaySummary, setTodaySummary] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); - // Fetch children on mount + // Load children useEffect(() => { if (familyId && !authLoading) { - dispatch(fetchChildren(familyId)); + loadChildren(); } - }, [familyId, authLoading, dispatch]); + }, [familyId, authLoading]); - // GraphQL query for dashboard data - const { data, loading, error, refetch } = useQuery(GET_DASHBOARD, { - variables: { childId: selectedChildId }, - skip: authLoading || !user, - fetchPolicy: 'cache-and-network', - }); + const loadChildren = async () => { + if (!familyId) return; - // Log GraphQL errors and data for debugging + try { + const data = await childrenApi.getChildren(familyId); + setChildren(data); + if (data.length > 0 && !selectedChildId) { + setSelectedChildId(data[0].id); + } + } catch (err) { + console.error('Failed to load children:', err); + setError(err); + } + }; + + // Load dashboard data when child selected useEffect(() => { - console.log('[HomePage] === GraphQL Debug Info ==='); - console.log('[HomePage] Raw data:', data); - console.log('[HomePage] Data type:', typeof data); - console.log('[HomePage] Data keys:', data ? Object.keys(data) : 'null'); + if (selectedChildId) { + loadDashboardData(); + } + }, [selectedChildId]); - if (error) { - console.error('[HomePage] GraphQL error:', error); - console.error('[HomePage] GraphQL error details:', { - message: error.message, - networkError: error.networkError, - graphQLErrors: error.graphQLErrors, + const loadDashboardData = async () => { + if (!selectedChildId) return; + + setLoading(true); + try { + // Load recent activities + const activities = await trackingApi.getActivities(selectedChildId); + setRecentActivities(activities.slice(0, 10)); + + // Calculate today's summary from activities + const today = new Date(); + today.setHours(0, 0, 0, 0); + const todayActivities = activities.filter((a: any) => { + const activityDate = new Date(a.timestamp || a.startedAt); + return activityDate >= today; }); - } - if (data) { - console.log('[HomePage] GraphQL data:', data); - console.log('[HomePage] Dashboard data:', data.dashboard); - } - console.log('[HomePage] Query state:', { - loading, - error: !!error, - hasData: !!data, - user: !!user, - skip: authLoading || !user, - childrenCount: data?.dashboard?.children?.length || 0, - selectedChildId, - }); - console.log('[HomePage] LocalStorage token:', typeof window !== 'undefined' ? localStorage.getItem('accessToken')?.substring(0, 20) : 'SSR'); - }, [error, data, loading, user, authLoading, selectedChildId]); - // Real-time activity handler to refetch dashboard data - const refreshDashboard = useCallback(async () => { - if (refetch) { - console.log('[HomePage] Refreshing dashboard data...'); - await refetch(); + const summary = { + feedingCount: todayActivities.filter((a: any) => a.type === 'feeding').length, + sleepCount: todayActivities.filter((a: any) => a.type === 'sleep').length, + diaperCount: todayActivities.filter((a: any) => a.type === 'diaper').length, + medicationCount: todayActivities.filter((a: any) => ['medication', 'medicine'].includes(a.type)).length, + totalFeedingAmount: todayActivities + .filter((a: any) => a.type === 'feeding') + .reduce((sum: number, a: any) => sum + (a.data?.amount || 0), 0), + totalSleepDuration: todayActivities + .filter((a: any) => a.type === 'sleep') + .reduce((sum: number, a: any) => { + const start = new Date(a.startedAt); + const end = a.endedAt ? new Date(a.endedAt) : new Date(); + return sum + (end.getTime() - start.getTime()) / (1000 * 60); + }, 0), + }; + + setTodaySummary(summary); + setError(null); + } catch (err) { + console.error('Failed to load dashboard data:', err); + setError(err); + } finally { + setLoading(false); } + }; + + const refetch = loadDashboardData; + + // Real-time activity handler + const refreshDashboard = useCallback(async () => { + console.log('[HomePage] Refreshing dashboard data...'); + await refetch(); }, [refetch]); // Subscribe to real-time activity updates @@ -105,14 +138,6 @@ export default function HomePage() { refreshDashboard // On activity deleted ); - // Set the first child as selected when data loads - useEffect(() => { - if (data?.dashboard?.children && data.dashboard.children.length > 0 && !selectedChildId) { - const firstChild = data.dashboard.children[0]; - setSelectedChildId(firstChild.id); - } - }, [data, selectedChildId]); - // Sync selectedChildId with Redux selectedChild useEffect(() => { if (selectedChild?.id && selectedChild.id !== selectedChildId) { @@ -161,22 +186,17 @@ export default function HomePage() { } }; - // Extract data from GraphQL response - const children = data?.dashboard?.children || []; - const graphqlSelectedChild = data?.dashboard?.selectedChild; - const dailySummary = data?.dashboard?.todaySummary; const isLoading = authLoading || loading; // Build child metrics object for DynamicChildDashboard const childMetrics = children.reduce((acc: any, child: any) => { - // For now, use the same summary for selected child, or zero for others - // TODO: Fetch per-child summaries from backend - if (child.id === selectedChildId && dailySummary) { + // Use todaySummary for selected child, or zero for others + if (child.id === selectedChildId && todaySummary) { acc[child.id] = { - feedingCount: dailySummary.feedingCount || 0, - sleepDuration: dailySummary.totalSleepDuration || 0, - diaperCount: dailySummary.diaperCount || 0, - medicationCount: dailySummary.medicationCount || 0, + feedingCount: todaySummary.feedingCount || 0, + sleepDuration: todaySummary.totalSleepDuration || 0, + diaperCount: todaySummary.diaperCount || 0, + medicationCount: todaySummary.medicationCount || 0, }; } else { acc[child.id] = { diff --git a/maternal-web/public/sw.js b/maternal-web/public/sw.js index 29186b6..cf1a06b 100644 --- a/maternal-web/public/sw.js +++ b/maternal-web/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,a={};const s=(s,c)=>(s=new URL(s+".js",c).href,a[s]||new Promise(a=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=a,document.head.appendChild(e)}else e=s,importScripts(s),a()}).then(()=>{let e=a[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e}));self.define=(c,i)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(a[n])return;let t={};const r=e=>s(e,n),f={module:{uri:n},exports:t,require:r};a[n]=Promise.all(c.map(e=>f[e]||r(e))).then(e=>(i(...e),t))}}define(["./workbox-4d767a27"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"3a3fe8d979f3eea0b25fac83fb8bdeb7"},{url:"/_next/static/chunks/1063-f889ee292f8f15b5.js",revision:"f889ee292f8f15b5"},{url:"/_next/static/chunks/1091.c762d795c6885f94.js",revision:"c762d795c6885f94"},{url:"/_next/static/chunks/1255-b2f7fd83e387a9e1.js",revision:"b2f7fd83e387a9e1"},{url:"/_next/static/chunks/1280-296e0a2b6e9dd9b1.js",revision:"296e0a2b6e9dd9b1"},{url:"/_next/static/chunks/1514-a6ed8a01b9885870.js",revision:"a6ed8a01b9885870"},{url:"/_next/static/chunks/1543-530e0f57f7af68aa.js",revision:"530e0f57f7af68aa"},{url:"/_next/static/chunks/1569-55e6fb5a18f58b21.js",revision:"55e6fb5a18f58b21"},{url:"/_next/static/chunks/1863-7231108310f72246.js",revision:"7231108310f72246"},{url:"/_next/static/chunks/2262-26293d6453fcc927.js",revision:"26293d6453fcc927"},{url:"/_next/static/chunks/2506-b6cf4a8108dc7c86.js",revision:"b6cf4a8108dc7c86"},{url:"/_next/static/chunks/2619-04bc32f026a0d946.js",revision:"04bc32f026a0d946"},{url:"/_next/static/chunks/3039-0e9bf08230c8ee7b.js",revision:"0e9bf08230c8ee7b"},{url:"/_next/static/chunks/3127-49a95e7cb556ace3.js",revision:"49a95e7cb556ace3"},{url:"/_next/static/chunks/3183-823e6c5b74284106.js",revision:"823e6c5b74284106"},{url:"/_next/static/chunks/3237-194c02103bef1c0f.js",revision:"194c02103bef1c0f"},{url:"/_next/static/chunks/3664-56dedfcaec4aaceb.js",revision:"56dedfcaec4aaceb"},{url:"/_next/static/chunks/3762-c2c13ecf11b3eabb.js",revision:"c2c13ecf11b3eabb"},{url:"/_next/static/chunks/4232-d460569f72a550dd.js",revision:"d460569f72a550dd"},{url:"/_next/static/chunks/4241-f94f398f62924b88.js",revision:"f94f398f62924b88"},{url:"/_next/static/chunks/4337-7b7eba57ddf5f8f1.js",revision:"7b7eba57ddf5f8f1"},{url:"/_next/static/chunks/4589-ddaaeca1ea084b22.js",revision:"ddaaeca1ea084b22"},{url:"/_next/static/chunks/4bd1b696-100b9d70ed4e49c1.js",revision:"100b9d70ed4e49c1"},{url:"/_next/static/chunks/5125-c990fc036d2a6ce4.js",revision:"c990fc036d2a6ce4"},{url:"/_next/static/chunks/5380-9004e1ac3565daca.js",revision:"9004e1ac3565daca"},{url:"/_next/static/chunks/5385-7ecda8e4ba984edc.js",revision:"7ecda8e4ba984edc"},{url:"/_next/static/chunks/5482-7535aa0aab02d518.js",revision:"7535aa0aab02d518"},{url:"/_next/static/chunks/5761-e5b2862a3b7d7efa.js",revision:"e5b2862a3b7d7efa"},{url:"/_next/static/chunks/6088-c165c565edce02be.js",revision:"c165c565edce02be"},{url:"/_next/static/chunks/670-a4ca0f366ee779f5.js",revision:"a4ca0f366ee779f5"},{url:"/_next/static/chunks/6733-52673e6aade9c963.js",revision:"52673e6aade9c963"},{url:"/_next/static/chunks/6873-ff265086321345c8.js",revision:"ff265086321345c8"},{url:"/_next/static/chunks/6886-40f1779ffff00d58.js",revision:"40f1779ffff00d58"},{url:"/_next/static/chunks/6937.f8d44316fed7bc8e.js",revision:"f8d44316fed7bc8e"},{url:"/_next/static/chunks/710-7e96cbf5d461482a.js",revision:"7e96cbf5d461482a"},{url:"/_next/static/chunks/7359-1abfb9f346309354.js",revision:"1abfb9f346309354"},{url:"/_next/static/chunks/7741-0af8b5a61d8e63d3.js",revision:"0af8b5a61d8e63d3"},{url:"/_next/static/chunks/7855-72c79224370eff7b.js",revision:"72c79224370eff7b"},{url:"/_next/static/chunks/787-032067ae978e62a8.js",revision:"032067ae978e62a8"},{url:"/_next/static/chunks/8077-207d45bccb6d4afe.js",revision:"207d45bccb6d4afe"},{url:"/_next/static/chunks/8221-d51102291d5ddaf9.js",revision:"d51102291d5ddaf9"},{url:"/_next/static/chunks/8241-eaf1b9c6054e9ad8.js",revision:"eaf1b9c6054e9ad8"},{url:"/_next/static/chunks/8412-8ce7440f3599e2d9.js",revision:"8ce7440f3599e2d9"},{url:"/_next/static/chunks/8466-ffa71cea7998f777.js",revision:"ffa71cea7998f777"},{url:"/_next/static/chunks/8544.74f59dd908783038.js",revision:"74f59dd908783038"},{url:"/_next/static/chunks/8746-92ff3ad56eb06d6e.js",revision:"92ff3ad56eb06d6e"},{url:"/_next/static/chunks/8863-7b43165e8b5cae38.js",revision:"7b43165e8b5cae38"},{url:"/_next/static/chunks/9205-f540995b767df00b.js",revision:"f540995b767df00b"},{url:"/_next/static/chunks/9333-b4ce9ef429de942e.js",revision:"b4ce9ef429de942e"},{url:"/_next/static/chunks/9392-2887c5e5703ed90a.js",revision:"2887c5e5703ed90a"},{url:"/_next/static/chunks/9397-40b8ac68e22a4d87.js",revision:"40b8ac68e22a4d87"},{url:"/_next/static/chunks/9515-53e74005e71810bd.js",revision:"53e74005e71810bd"},{url:"/_next/static/chunks/9517-17518b5fffe76114.js",revision:"17518b5fffe76114"},{url:"/_next/static/chunks/9738-c70b13d86cc3ea77.js",revision:"c70b13d86cc3ea77"},{url:"/_next/static/chunks/9958.57780b11643f5bd9.js",revision:"57780b11643f5bd9"},{url:"/_next/static/chunks/app/(auth)/forgot-password/page-294fb4d9f0014755.js",revision:"294fb4d9f0014755"},{url:"/_next/static/chunks/app/(auth)/login/page-d8f5656a139ee55d.js",revision:"d8f5656a139ee55d"},{url:"/_next/static/chunks/app/(auth)/onboarding/page-ea1c1fa93f2bff9a.js",revision:"ea1c1fa93f2bff9a"},{url:"/_next/static/chunks/app/(auth)/register/page-4b000eea571750ea.js",revision:"4b000eea571750ea"},{url:"/_next/static/chunks/app/(auth)/reset-password/page-836751db40b617b5.js",revision:"836751db40b617b5"},{url:"/_next/static/chunks/app/_not-found/page-95f11f5fe94340f1.js",revision:"95f11f5fe94340f1"},{url:"/_next/static/chunks/app/ai-assistant/page-e34646713b4eca94.js",revision:"e34646713b4eca94"},{url:"/_next/static/chunks/app/analytics/page-7a6b08f18da0121a.js",revision:"7a6b08f18da0121a"},{url:"/_next/static/chunks/app/api/ai/chat/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/auth/login/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/auth/password-reset/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/auth/register/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/health/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/tracking/feeding/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/voice/transcribe/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/children/page-b6fb68596ba09b7a.js",revision:"b6fb68596ba09b7a"},{url:"/_next/static/chunks/app/family/page-3bf65f3ee77dd58f.js",revision:"3bf65f3ee77dd58f"},{url:"/_next/static/chunks/app/history/page-db18505f04d26741.js",revision:"db18505f04d26741"},{url:"/_next/static/chunks/app/insights/page-d16e2a65278ff204.js",revision:"d16e2a65278ff204"},{url:"/_next/static/chunks/app/layout-7254fb44e6f97c33.js",revision:"7254fb44e6f97c33"},{url:"/_next/static/chunks/app/legal/cookies/page-c39a3fa6e27a8806.js",revision:"c39a3fa6e27a8806"},{url:"/_next/static/chunks/app/legal/eula/page-8015f749ab4dd660.js",revision:"8015f749ab4dd660"},{url:"/_next/static/chunks/app/legal/page-3de074f0b9741bc6.js",revision:"3de074f0b9741bc6"},{url:"/_next/static/chunks/app/legal/privacy/page-3cb58024b6fd8e21.js",revision:"3cb58024b6fd8e21"},{url:"/_next/static/chunks/app/legal/terms/page-b5a1c96cae251767.js",revision:"b5a1c96cae251767"},{url:"/_next/static/chunks/app/logout/page-359b0e371fd55c32.js",revision:"359b0e371fd55c32"},{url:"/_next/static/chunks/app/offline/page-28c005360c2b2736.js",revision:"28c005360c2b2736"},{url:"/_next/static/chunks/app/page-c86ba30655af8222.js",revision:"c86ba30655af8222"},{url:"/_next/static/chunks/app/settings/page-3f8776db67351a35.js",revision:"3f8776db67351a35"},{url:"/_next/static/chunks/app/track/activity/page-b13087f921a3bdaa.js",revision:"b13087f921a3bdaa"},{url:"/_next/static/chunks/app/track/diaper/page-eb7cd865f39d5b65.js",revision:"eb7cd865f39d5b65"},{url:"/_next/static/chunks/app/track/feeding/page-f99b95e8c5346110.js",revision:"f99b95e8c5346110"},{url:"/_next/static/chunks/app/track/growth/page-c87004bc2d53bf96.js",revision:"c87004bc2d53bf96"},{url:"/_next/static/chunks/app/track/medicine/page-882bb4a2c19a7842.js",revision:"882bb4a2c19a7842"},{url:"/_next/static/chunks/app/track/page-dd5ade1eb19ad389.js",revision:"dd5ade1eb19ad389"},{url:"/_next/static/chunks/app/track/sleep/page-72b5b93c9edd8701.js",revision:"72b5b93c9edd8701"},{url:"/_next/static/chunks/framework-bd61ec64032c2de7.js",revision:"bd61ec64032c2de7"},{url:"/_next/static/chunks/main-520e5ec2d671abe7.js",revision:"520e5ec2d671abe7"},{url:"/_next/static/chunks/main-app-02fc3649960ba6c7.js",revision:"02fc3649960ba6c7"},{url:"/_next/static/chunks/pages/_app-4b3fb5e477a0267f.js",revision:"4b3fb5e477a0267f"},{url:"/_next/static/chunks/pages/_error-c970d8b55ace1b48.js",revision:"c970d8b55ace1b48"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-1b3d132f0078d9eb.js",revision:"1b3d132f0078d9eb"},{url:"/_next/static/css/2eb0f1dfbb62d2c0.css",revision:"2eb0f1dfbb62d2c0"},{url:"/_next/static/media/19cfc7226ec3afaa-s.woff2",revision:"9dda5cfc9a46f256d0e131bb535e46f8"},{url:"/_next/static/media/21350d82a1f187e9-s.woff2",revision:"4e2553027f1d60eff32898367dd4d541"},{url:"/_next/static/media/8e9860b6e62d6359-s.woff2",revision:"01ba6c2a184b8cba08b0d57167664d75"},{url:"/_next/static/media/ba9851c3c22cd980-s.woff2",revision:"9e494903d6b0ffec1a1e14d34427d44d"},{url:"/_next/static/media/c5fe6dc8356a8c31-s.woff2",revision:"027a89e9ab733a145db70f09b8a18b42"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_next/static/media/e4af272ccee01ff0-s.p.woff2",revision:"65850a373e258f1c897a2b3d75eb74de"},{url:"/_next/static/suK6gchK1zu12MPr3E5U-/_buildManifest.js",revision:"003849461a7dd4bad470c5d1d5e5254c"},{url:"/_next/static/suK6gchK1zu12MPr3E5U-/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/apple-touch-icon.png",revision:"fa2d4d791b90148a18d49bc3bfd7a43a"},{url:"/check-updates.js",revision:"bc016a0ceb6c72a5fe9ba02ad05d78be"},{url:"/favicon-16x16.png",revision:"db2da3355c89a6149f6d9ee35ebe6bf3"},{url:"/favicon-32x32.png",revision:"0fd88d56aa584bd0546d05ffc63ef777"},{url:"/icon-192x192.png",revision:"b8ef7f117472c4399cceffea644eb8bd"},{url:"/icons/icon-128x128.png",revision:"96cff3b189d9c1daa1edf470290a90cd"},{url:"/icons/icon-144x144.png",revision:"b627c346c431d7e306005aec5f51baff"},{url:"/icons/icon-152x152.png",revision:"012071830c13d310e51f833baed531af"},{url:"/icons/icon-192x192.png",revision:"dfb20132ddb628237eccd4b0e2ee4aaa"},{url:"/icons/icon-384x384.png",revision:"d032b25376232878a2a29b5688992a8d"},{url:"/icons/icon-512x512.png",revision:"ffda0043571d60956f4e321cba706670"},{url:"/icons/icon-72x72.png",revision:"cc89e74126e7e1109f0186774b3c0d77"},{url:"/icons/icon-96x96.png",revision:"32813cdad5b636fc09eec01c7d705936"},{url:"/manifest.json",revision:"5cbf1ecd33b05c4772688ce7d00c2c23"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"61c6b19abff40ea7acd577be818f3976"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:a,event:s,state:c})=>a&&"opaqueredirect"===a.type?new Response(a.body,{status:200,statusText:"OK",headers:a.headers}):a}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/api\/.*$/i,new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/.*/i,new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET")}); +if(!self.define){let e,a={};const s=(s,c)=>(s=new URL(s+".js",c).href,a[s]||new Promise(a=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=a,document.head.appendChild(e)}else e=s,importScripts(s),a()}).then(()=>{let e=a[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e}));self.define=(c,i)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(a[n])return;let t={};const f=e=>s(e,n),r={module:{uri:n},exports:t,require:f};a[n]=Promise.all(c.map(e=>r[e]||f(e))).then(e=>(i(...e),t))}}define(["./workbox-4d767a27"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"29302af67d5a734fda617e2b0519a7bd"},{url:"/_next/static/HkuRcQRswmxfEfPAN_eWg/_buildManifest.js",revision:"003849461a7dd4bad470c5d1d5e5254c"},{url:"/_next/static/HkuRcQRswmxfEfPAN_eWg/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1091.c762d795c6885f94.js",revision:"c762d795c6885f94"},{url:"/_next/static/chunks/1255-b2f7fd83e387a9e1.js",revision:"b2f7fd83e387a9e1"},{url:"/_next/static/chunks/1280-296e0a2b6e9dd9b1.js",revision:"296e0a2b6e9dd9b1"},{url:"/_next/static/chunks/1514-a6ed8a01b9885870.js",revision:"a6ed8a01b9885870"},{url:"/_next/static/chunks/1543-530e0f57f7af68aa.js",revision:"530e0f57f7af68aa"},{url:"/_next/static/chunks/1569-55e6fb5a18f58b21.js",revision:"55e6fb5a18f58b21"},{url:"/_next/static/chunks/1863-7231108310f72246.js",revision:"7231108310f72246"},{url:"/_next/static/chunks/189-acf917e753c20aa8.js",revision:"acf917e753c20aa8"},{url:"/_next/static/chunks/2262-26293d6453fcc927.js",revision:"26293d6453fcc927"},{url:"/_next/static/chunks/2506-b6cf4a8108dc7c86.js",revision:"b6cf4a8108dc7c86"},{url:"/_next/static/chunks/2619-04bc32f026a0d946.js",revision:"04bc32f026a0d946"},{url:"/_next/static/chunks/3039-0e9bf08230c8ee7b.js",revision:"0e9bf08230c8ee7b"},{url:"/_next/static/chunks/3127-49a95e7cb556ace3.js",revision:"49a95e7cb556ace3"},{url:"/_next/static/chunks/3183-823e6c5b74284106.js",revision:"823e6c5b74284106"},{url:"/_next/static/chunks/340-ce44e06c2ff738ed.js",revision:"ce44e06c2ff738ed"},{url:"/_next/static/chunks/3664-56dedfcaec4aaceb.js",revision:"56dedfcaec4aaceb"},{url:"/_next/static/chunks/3762-c2c13ecf11b3eabb.js",revision:"c2c13ecf11b3eabb"},{url:"/_next/static/chunks/4241-f94f398f62924b88.js",revision:"f94f398f62924b88"},{url:"/_next/static/chunks/4337-7b7eba57ddf5f8f1.js",revision:"7b7eba57ddf5f8f1"},{url:"/_next/static/chunks/4bd1b696-100b9d70ed4e49c1.js",revision:"100b9d70ed4e49c1"},{url:"/_next/static/chunks/5125-c990fc036d2a6ce4.js",revision:"c990fc036d2a6ce4"},{url:"/_next/static/chunks/525-9faf3d762ffa7508.js",revision:"9faf3d762ffa7508"},{url:"/_next/static/chunks/5380-9004e1ac3565daca.js",revision:"9004e1ac3565daca"},{url:"/_next/static/chunks/5385-7ecda8e4ba984edc.js",revision:"7ecda8e4ba984edc"},{url:"/_next/static/chunks/5482-7535aa0aab02d518.js",revision:"7535aa0aab02d518"},{url:"/_next/static/chunks/5761-e5b2862a3b7d7efa.js",revision:"e5b2862a3b7d7efa"},{url:"/_next/static/chunks/6088-c165c565edce02be.js",revision:"c165c565edce02be"},{url:"/_next/static/chunks/670-a4ca0f366ee779f5.js",revision:"a4ca0f366ee779f5"},{url:"/_next/static/chunks/6733-52673e6aade9c963.js",revision:"52673e6aade9c963"},{url:"/_next/static/chunks/6873-ff265086321345c8.js",revision:"ff265086321345c8"},{url:"/_next/static/chunks/6886-40f1779ffff00d58.js",revision:"40f1779ffff00d58"},{url:"/_next/static/chunks/6937.f8d44316fed7bc8e.js",revision:"f8d44316fed7bc8e"},{url:"/_next/static/chunks/710-7e96cbf5d461482a.js",revision:"7e96cbf5d461482a"},{url:"/_next/static/chunks/7359-1abfb9f346309354.js",revision:"1abfb9f346309354"},{url:"/_next/static/chunks/7741-0af8b5a61d8e63d3.js",revision:"0af8b5a61d8e63d3"},{url:"/_next/static/chunks/7855-72c79224370eff7b.js",revision:"72c79224370eff7b"},{url:"/_next/static/chunks/787-032067ae978e62a8.js",revision:"032067ae978e62a8"},{url:"/_next/static/chunks/8221-d51102291d5ddaf9.js",revision:"d51102291d5ddaf9"},{url:"/_next/static/chunks/8241-eaf1b9c6054e9ad8.js",revision:"eaf1b9c6054e9ad8"},{url:"/_next/static/chunks/8412-8ce7440f3599e2d9.js",revision:"8ce7440f3599e2d9"},{url:"/_next/static/chunks/8466-ffa71cea7998f777.js",revision:"ffa71cea7998f777"},{url:"/_next/static/chunks/8544.74f59dd908783038.js",revision:"74f59dd908783038"},{url:"/_next/static/chunks/8746-92ff3ad56eb06d6e.js",revision:"92ff3ad56eb06d6e"},{url:"/_next/static/chunks/8863-7b43165e8b5cae38.js",revision:"7b43165e8b5cae38"},{url:"/_next/static/chunks/9205-f540995b767df00b.js",revision:"f540995b767df00b"},{url:"/_next/static/chunks/9333-b4ce9ef429de942e.js",revision:"b4ce9ef429de942e"},{url:"/_next/static/chunks/9392-2887c5e5703ed90a.js",revision:"2887c5e5703ed90a"},{url:"/_next/static/chunks/9397-40b8ac68e22a4d87.js",revision:"40b8ac68e22a4d87"},{url:"/_next/static/chunks/9515-53e74005e71810bd.js",revision:"53e74005e71810bd"},{url:"/_next/static/chunks/9517-17518b5fffe76114.js",revision:"17518b5fffe76114"},{url:"/_next/static/chunks/9738-c70b13d86cc3ea77.js",revision:"c70b13d86cc3ea77"},{url:"/_next/static/chunks/9958.57780b11643f5bd9.js",revision:"57780b11643f5bd9"},{url:"/_next/static/chunks/app/(auth)/forgot-password/page-294fb4d9f0014755.js",revision:"294fb4d9f0014755"},{url:"/_next/static/chunks/app/(auth)/login/page-d8f5656a139ee55d.js",revision:"d8f5656a139ee55d"},{url:"/_next/static/chunks/app/(auth)/onboarding/page-ea1c1fa93f2bff9a.js",revision:"ea1c1fa93f2bff9a"},{url:"/_next/static/chunks/app/(auth)/register/page-4b000eea571750ea.js",revision:"4b000eea571750ea"},{url:"/_next/static/chunks/app/(auth)/reset-password/page-836751db40b617b5.js",revision:"836751db40b617b5"},{url:"/_next/static/chunks/app/_not-found/page-95f11f5fe94340f1.js",revision:"95f11f5fe94340f1"},{url:"/_next/static/chunks/app/ai-assistant/page-e34646713b4eca94.js",revision:"e34646713b4eca94"},{url:"/_next/static/chunks/app/analytics/page-7a6b08f18da0121a.js",revision:"7a6b08f18da0121a"},{url:"/_next/static/chunks/app/api/ai/chat/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/auth/login/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/auth/password-reset/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/auth/register/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/health/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/tracking/feeding/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/api/voice/transcribe/route-a631d97a33877f8a.js",revision:"a631d97a33877f8a"},{url:"/_next/static/chunks/app/children/page-b6fb68596ba09b7a.js",revision:"b6fb68596ba09b7a"},{url:"/_next/static/chunks/app/family/page-3bf65f3ee77dd58f.js",revision:"3bf65f3ee77dd58f"},{url:"/_next/static/chunks/app/history/page-db18505f04d26741.js",revision:"db18505f04d26741"},{url:"/_next/static/chunks/app/insights/page-d16e2a65278ff204.js",revision:"d16e2a65278ff204"},{url:"/_next/static/chunks/app/layout-e9ae6b6360689f26.js",revision:"e9ae6b6360689f26"},{url:"/_next/static/chunks/app/legal/cookies/page-c39a3fa6e27a8806.js",revision:"c39a3fa6e27a8806"},{url:"/_next/static/chunks/app/legal/eula/page-8015f749ab4dd660.js",revision:"8015f749ab4dd660"},{url:"/_next/static/chunks/app/legal/page-3de074f0b9741bc6.js",revision:"3de074f0b9741bc6"},{url:"/_next/static/chunks/app/legal/privacy/page-3cb58024b6fd8e21.js",revision:"3cb58024b6fd8e21"},{url:"/_next/static/chunks/app/legal/terms/page-b5a1c96cae251767.js",revision:"b5a1c96cae251767"},{url:"/_next/static/chunks/app/logout/page-359b0e371fd55c32.js",revision:"359b0e371fd55c32"},{url:"/_next/static/chunks/app/offline/page-28c005360c2b2736.js",revision:"28c005360c2b2736"},{url:"/_next/static/chunks/app/page-9946ecd9dac0d22f.js",revision:"9946ecd9dac0d22f"},{url:"/_next/static/chunks/app/settings/page-3f8776db67351a35.js",revision:"3f8776db67351a35"},{url:"/_next/static/chunks/app/track/activity/page-2307107edcbf16b6.js",revision:"2307107edcbf16b6"},{url:"/_next/static/chunks/app/track/diaper/page-a39423216f7058a8.js",revision:"a39423216f7058a8"},{url:"/_next/static/chunks/app/track/feeding/page-45257beac2eb2bc3.js",revision:"45257beac2eb2bc3"},{url:"/_next/static/chunks/app/track/growth/page-207ac7ed192d7b4a.js",revision:"207ac7ed192d7b4a"},{url:"/_next/static/chunks/app/track/medicine/page-9e2aaabd12c4ea8f.js",revision:"9e2aaabd12c4ea8f"},{url:"/_next/static/chunks/app/track/page-dd5ade1eb19ad389.js",revision:"dd5ade1eb19ad389"},{url:"/_next/static/chunks/app/track/sleep/page-bc6d6b16af0f9b5e.js",revision:"bc6d6b16af0f9b5e"},{url:"/_next/static/chunks/framework-bd61ec64032c2de7.js",revision:"bd61ec64032c2de7"},{url:"/_next/static/chunks/main-520e5ec2d671abe7.js",revision:"520e5ec2d671abe7"},{url:"/_next/static/chunks/main-app-02fc3649960ba6c7.js",revision:"02fc3649960ba6c7"},{url:"/_next/static/chunks/pages/_app-4b3fb5e477a0267f.js",revision:"4b3fb5e477a0267f"},{url:"/_next/static/chunks/pages/_error-c970d8b55ace1b48.js",revision:"c970d8b55ace1b48"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-1b3d132f0078d9eb.js",revision:"1b3d132f0078d9eb"},{url:"/_next/static/css/2eb0f1dfbb62d2c0.css",revision:"2eb0f1dfbb62d2c0"},{url:"/_next/static/media/19cfc7226ec3afaa-s.woff2",revision:"9dda5cfc9a46f256d0e131bb535e46f8"},{url:"/_next/static/media/21350d82a1f187e9-s.woff2",revision:"4e2553027f1d60eff32898367dd4d541"},{url:"/_next/static/media/8e9860b6e62d6359-s.woff2",revision:"01ba6c2a184b8cba08b0d57167664d75"},{url:"/_next/static/media/ba9851c3c22cd980-s.woff2",revision:"9e494903d6b0ffec1a1e14d34427d44d"},{url:"/_next/static/media/c5fe6dc8356a8c31-s.woff2",revision:"027a89e9ab733a145db70f09b8a18b42"},{url:"/_next/static/media/df0a9ae256c0569c-s.woff2",revision:"d54db44de5ccb18886ece2fda72bdfe0"},{url:"/_next/static/media/e4af272ccee01ff0-s.p.woff2",revision:"65850a373e258f1c897a2b3d75eb74de"},{url:"/apple-touch-icon.png",revision:"fa2d4d791b90148a18d49bc3bfd7a43a"},{url:"/check-updates.js",revision:"bc016a0ceb6c72a5fe9ba02ad05d78be"},{url:"/favicon-16x16.png",revision:"db2da3355c89a6149f6d9ee35ebe6bf3"},{url:"/favicon-32x32.png",revision:"0fd88d56aa584bd0546d05ffc63ef777"},{url:"/icon-192x192.png",revision:"b8ef7f117472c4399cceffea644eb8bd"},{url:"/icons/icon-128x128.png",revision:"96cff3b189d9c1daa1edf470290a90cd"},{url:"/icons/icon-144x144.png",revision:"b627c346c431d7e306005aec5f51baff"},{url:"/icons/icon-152x152.png",revision:"012071830c13d310e51f833baed531af"},{url:"/icons/icon-192x192.png",revision:"dfb20132ddb628237eccd4b0e2ee4aaa"},{url:"/icons/icon-384x384.png",revision:"d032b25376232878a2a29b5688992a8d"},{url:"/icons/icon-512x512.png",revision:"ffda0043571d60956f4e321cba706670"},{url:"/icons/icon-72x72.png",revision:"cc89e74126e7e1109f0186774b3c0d77"},{url:"/icons/icon-96x96.png",revision:"32813cdad5b636fc09eec01c7d705936"},{url:"/manifest.json",revision:"5cbf1ecd33b05c4772688ce7d00c2c23"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"61c6b19abff40ea7acd577be818f3976"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:a,event:s,state:c})=>a&&"opaqueredirect"===a.type?new Response(a.body,{status:200,statusText:"OK",headers:a.headers}):a}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/api\/.*$/i,new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/.*/i,new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET")});