App.tsx
1 import { useState, useEffect, useCallback } from 'react'; 2 import { TooltipProvider } from '../components/ui/tooltip'; 3 import { HomePage } from './pages/HomePage'; 4 import { ReviewPage } from './pages/ReviewPage'; 5 import { UpdateBanner } from '../components/UpdateBanner'; 6 import { applyCodeFont } from '../components/SettingsDialog'; 7 import type { ReviewGuide } from '../lib/types'; 8 9 type Page = 'home' | 'review'; 10 11 export function App() { 12 const [page, setPage] = useState<Page>('home'); 13 14 useEffect(() => { 15 void window.electronAPI.loadPreferences().then((prefs) => { 16 if (prefs.codeFont) applyCodeFont(prefs.codeFont); 17 }); 18 }, []); 19 20 // When a background auto-review completes, the history list will refresh itself 21 // via the new-review-in-history event — handled in HomePage. 22 const [review, setReview] = useState<ReviewGuide | null>(null); 23 const [prefillPrUrl, setPrefillPrUrl] = useState<string | undefined>(); 24 25 const handleReviewReady = useCallback((r: ReviewGuide) => { 26 setPrefillPrUrl(undefined); 27 setReview(r); 28 setPage('review'); 29 }, []); 30 31 function handleBack() { 32 setReview(null); 33 setPage('home'); 34 } 35 36 function handleReReview(prUrl: string) { 37 setPrefillPrUrl(prUrl); 38 setReview(null); 39 setPage('home'); 40 } 41 42 // Navigate to a completed review when notification is clicked 43 useEffect(() => { 44 window.electronAPI.onReviewNavigate((reviewId) => { 45 void window.electronAPI.loadReview(reviewId).then((r) => { 46 handleReviewReady(r); 47 }); 48 }); 49 return () => { 50 window.electronAPI.offReviewNavigate(); 51 }; 52 }, [handleReviewReady]); 53 54 return ( 55 <> 56 <UpdateBanner /> 57 <TooltipProvider> 58 {page === 'home' && <HomePage onReviewReady={handleReviewReady} prefillPrUrl={prefillPrUrl} />} 59 {page === 'review' && review && <ReviewPage review={review} onBack={handleBack} onReReview={handleReReview} />} 60 </TooltipProvider> 61 </> 62 ); 63 }