| | import { useState } from 'react'; |
| | import { PatientHistoryPage } from './pages/PatientHistoryPage'; |
| |
|
| | import HomePage from './pages/HomePage.tsx'; |
| | import { PatientRegistry } from './pages/PatientRegistry.tsx'; |
| | import { GuidedCapturePage } from './pages/GuidedCapturePage'; |
| | import { AcetowhiteExamPage } from './pages/AcetowhiteExamPage'; |
| | import { GreenFilterPage } from './pages/GreenFilterPage'; |
| | import { LugolExamPage } from './pages/LugolExamPage'; |
| | import { BiopsyMarking } from './pages/BiopsyMarking'; |
| | import { ReportPage } from './pages/ReportPage'; |
| | import { Sidebar } from './components/Sidebar'; |
| | import { Header } from './components/Header'; |
| | import { Footer } from './components/Footer'; |
| | import { ChatBot } from './components/ChatBot'; |
| |
|
| | export function App() { |
| | const [currentPage, setCurrentPage] = useState<'home' | 'patientinfo' | 'patienthistory' | 'colposcopyimaging' | 'acetowhite' | 'greenfilter' | 'lugol' | 'guidedcapture' | 'biopsymarking' | 'capture' | 'annotation' | 'compare' | 'report' | 'settings'>('home'); |
| | const [currentPatientId, setCurrentPatientId] = useState<string | undefined>(undefined); |
| | const [isNewPatientFlow, setIsNewPatientFlow] = useState(false); |
| | const [capturedImages, setCapturedImages] = useState<any[]>([]); |
| | const [guidanceMode, setGuidanceMode] = useState<'capture' | 'annotation' | 'compare' | 'report'>('capture'); |
| |
|
| | const goToPatientRegistry = () => { |
| | setCurrentPatientId(undefined); |
| | setIsNewPatientFlow(false); |
| | setCurrentPage('patientinfo'); |
| | }; |
| |
|
| | const goToPatientHistory = (patientId?: string, isNewPatient: boolean = false) => { |
| | setCurrentPatientId(patientId); |
| | setIsNewPatientFlow(isNewPatient); |
| | setCurrentPage('patienthistory'); |
| | }; |
| |
|
| | const goToHome = () => { |
| | setCurrentPatientId(undefined); |
| | setIsNewPatientFlow(false); |
| | setCurrentPage('home'); |
| | }; |
| |
|
| | const goToColposcopyImaging = () => setCurrentPage('colposcopyimaging'); |
| | const goToAcetowhite = () => setCurrentPage('acetowhite'); |
| | const goToGreenFilter = () => setCurrentPage('greenfilter'); |
| | const goToLugol = () => setCurrentPage('lugol'); |
| | const goToGuidedCapture = () => { |
| | setCurrentPage('capture'); |
| | setGuidanceMode('capture'); |
| | }; |
| | const goToBiopsyMarking = () => setCurrentPage('biopsymarking'); |
| | const goToCapture = () => { |
| | setCurrentPage('capture'); |
| | setGuidanceMode('capture'); |
| | }; |
| | const goToAnnotation = () => { |
| | setCurrentPage('annotation'); |
| | setGuidanceMode('annotation'); |
| | }; |
| | const goToCompare = () => { |
| | setCurrentPage('compare'); |
| | setGuidanceMode('compare'); |
| | }; |
| | const goToReport = () => setCurrentPage('report'); |
| |
|
| | const renderMain = () => { |
| | switch (currentPage) { |
| | case 'home': |
| | return <HomePage onNavigateToPatients={goToPatientRegistry} onNext={goToPatientRegistry} />; |
| | case 'patientinfo': |
| | return <PatientRegistry onNewPatient={(newPatientId) => goToPatientHistory(newPatientId, true)} onSelectExisting={(id: string) => goToPatientHistory(id)} onBackToHome={goToHome} onNext={goToGuidedCapture} />; |
| | case 'patienthistory': |
| | return <PatientHistoryPage goToImaging={goToGuidedCapture} goBackToRegistry={goToPatientRegistry} patientID={currentPatientId} goToGuidedCapture={isNewPatientFlow ? goToGuidedCapture : undefined} />; |
| | |
| | case 'acetowhite': |
| | return <AcetowhiteExamPage goBack={goToColposcopyImaging} onNext={goToGreenFilter} />; |
| | case 'greenfilter': |
| | return <GreenFilterPage goBack={goToAcetowhite} onNext={goToLugol} />; |
| | case 'lugol': |
| | return <LugolExamPage goBack={goToGreenFilter} onNext={goToGuidedCapture} />; |
| | case 'biopsymarking': |
| | return <BiopsyMarking onBack={goToGuidedCapture} onNext={goToReport} capturedImages={capturedImages} />; |
| | case 'capture': |
| | return <GuidedCapturePage onNext={goToBiopsyMarking} onGoToPatientRecords={goToPatientRegistry} initialMode="capture" onCapturedImagesChange={setCapturedImages} onModeChange={setGuidanceMode} />; |
| | case 'annotation': |
| | return <GuidedCapturePage onNext={goToBiopsyMarking} onGoToPatientRecords={goToPatientRegistry} initialMode="annotation" onCapturedImagesChange={setCapturedImages} onModeChange={setGuidanceMode} />; |
| | case 'compare': |
| | return <GuidedCapturePage onNext={goToBiopsyMarking} onGoToPatientRecords={goToPatientRegistry} initialMode="compare" onCapturedImagesChange={setCapturedImages} onModeChange={setGuidanceMode} />; |
| | case 'report': |
| | return <ReportPage onBack={goToCompare} onNext={goToHome} onGoToPatientRecords={goToPatientRegistry} capturedImages={capturedImages} />; |
| | default: |
| | return <div className="p-8">Page "{currentPage}" not implemented yet.</div>; |
| | } |
| | }; |
| |
|
| | |
| | const showSidebar = currentPage !== 'home'; |
| | const sidebarKey = currentPage === 'patienthistory' ? 'patientinfo' : (currentPage === 'guidedcapture' && guidanceMode === 'report') ? 'report' : ['capture', 'annotation', 'compare', 'guidedcapture'].includes(currentPage) ? guidanceMode : currentPage; |
| |
|
| | return ( |
| | <div className="flex flex-col min-h-screen"> |
| | <Header compact={currentPage === 'guidedcapture'} /> |
| | |
| | <div className="flex-1 flex min-h-0"> |
| | {showSidebar && <Sidebar current={sidebarKey as 'home' | 'patientinfo' | 'capture' | 'annotation' | 'compare' | 'report' | 'settings'} onNavigate={k => { |
| | if (k === 'home') goToHome(); |
| | else if (k === 'patientinfo') goToPatientRegistry(); |
| | else if (k === 'capture') goToCapture(); |
| | else if (k === 'annotation') goToAnnotation(); |
| | else if (k === 'compare') goToCompare(); |
| | else if (k === 'report') goToReport(); |
| | else setCurrentPage(k as any); |
| | }} />} |
| | <main className="flex-1 bg-white overflow-auto"> |
| | {renderMain()} |
| | </main> |
| | </div> |
| | |
| | <Footer compact={currentPage === 'guidedcapture'} /> |
| | <ChatBot /> |
| | </div> |
| | ); |
| | } |