diff --git a/app/components/AuthProvider.tsx b/app/components/AuthProvider.tsx index ec756a4..93a67c0 100644 --- a/app/components/AuthProvider.tsx +++ b/app/components/AuthProvider.tsx @@ -261,27 +261,8 @@ export function AuthProvider({ children }: { children: ReactNode }) { ); } - // Render without Dynamic until explicitly initialized - if (!isDynamicInitialized) { - return ( - {}, - }} - > - {children} - - ); - } - + // Always render DynamicContextProvider to avoid unmounting/remounting children + // Control visibility through isDynamicInitialized flag return ( - + {isDynamicInitialized && ( + + )} (null); const [llmProvider, setLlmProvider] = useState(''); + // Extract loadCacheInfo for reusability + const loadCacheInfo = async () => { + const { gwasDB } = await import('@/lib/gwas-db'); + const metadata = await gwasDB.getMetadata(); + if (metadata) { + const size = await gwasDB.getStorageSize(); + setCacheInfo({ + studies: metadata.totalStudies, + sizeMB: Math.round(size / 1024 / 1024) + }); + } else { + setCacheInfo(null); + } + }; + useEffect(() => { // Mark component as mounted setMounted(true); @@ -45,19 +60,29 @@ export default function MenuBar() { const config = getLLMConfig(); setLlmProvider(getProviderDisplayName(config.provider)); - // Load cache info - const loadCacheInfo = async () => { - const { gwasDB } = await import('@/lib/gwas-db'); - const metadata = await gwasDB.getMetadata(); - if (metadata) { - const size = await gwasDB.getStorageSize(); - setCacheInfo({ - studies: metadata.totalStudies, - sizeMB: Math.round(size / 1024 / 1024) - }); + // Load cache info on mount + loadCacheInfo(); + + // Listen for cache updates + const handleCacheUpdated = () => { + console.log('[MenuBar] Cache updated event received, refreshing cache info'); + loadCacheInfo(); + }; + + // Listen for visibility changes to refresh cache when user returns to tab + const handleVisibilityChange = () => { + if (document.visibilityState === 'visible') { + loadCacheInfo(); } }; - loadCacheInfo(); + + window.addEventListener('cacheUpdated', handleCacheUpdated); + document.addEventListener('visibilitychange', handleVisibilityChange); + + return () => { + window.removeEventListener('cacheUpdated', handleCacheUpdated); + document.removeEventListener('visibilitychange', handleVisibilityChange); + }; }, []); useEffect(() => { diff --git a/app/layout.tsx b/app/layout.tsx index 1e0d028..2ddb51a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,6 +2,9 @@ import type { Metadata } from "next"; import Script from "next/script"; import "./globals.css"; import { AuthProvider } from "./components/AuthProvider"; +import { GenotypeProvider } from "./components/UserDataUpload"; +import { ResultsProvider } from "./components/ResultsContext"; +import { CustomizationProvider } from "./components/CustomizationContext"; export const metadata: Metadata = { title: "Monadic DNA Explorer", @@ -72,7 +75,15 @@ export default function RootLayout({ - {children} + + + + + {children} + + + + ); diff --git a/app/page.tsx b/app/page.tsx index 4e8b7d2..f6a397b 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,9 +1,8 @@ "use client"; import { useEffect, useMemo, useState, useCallback, useRef } from "react"; -import { GenotypeProvider, useGenotype } from "./components/UserDataUpload"; -import { ResultsProvider, useResults } from "./components/ResultsContext"; -import { CustomizationProvider } from "./components/CustomizationContext"; +import { useGenotype } from "./components/UserDataUpload"; +import { useResults } from "./components/ResultsContext"; import { AuthButton, useAuth } from "./components/AuthProvider"; import { RunAllIcon, LLMChatIcon, OverviewReportIcon } from "./components/Icons"; import StudyResultReveal from "./components/StudyResultReveal"; @@ -100,7 +99,7 @@ type QualitySummary = { }; const defaultFilters: Filters = { - search: "", + search: "sleep", searchMode: "similarity", trait: "", minSampleSize: "500", @@ -110,7 +109,7 @@ const defaultFilters: Filters = { requireUserSNPs: false, sort: "relevance", sortDirection: "desc", - limit: 200, + limit: 1000, confidenceBand: null, offset: 0, }; @@ -625,6 +624,9 @@ function MainContent() { await addResultsBatch(results); // Embeddings will be fetched on-demand during LLM analysis const addTime = Date.now() - startAdd; console.log(`Finished adding ${results.length} results in ${addTime}ms`); + + // Notify MenuBar that cache has been updated + window.dispatchEvent(new CustomEvent('cacheUpdated')); } catch (error) { console.error('Run All failed:', error); setRunAllStatus(prev => ({ @@ -1412,13 +1414,5 @@ function MainContent() { } export default function HomePage() { - return ( - - - - - - - - ); + return ; }