Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| /* | |
| # Copyright 2025 Google LLC | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| */ | |
| import React from 'react'; | |
| import styles from './SummaryScreen.module.css'; | |
| import IconBackArrow from '../icons/IconBackArrow'; | |
| import IconCodeBlocks from '../icons/IconCodeBlocks'; | |
| import IconWarning from '../icons/IconWarning'; | |
| import TextWithTooltips from '../components/TextWithTooltips'; | |
| const SummaryScreen = ({journey, onNavigate, onShowDetails, cachedImage, summaryData}) => { | |
| // Display a loading state if summary data hasn't been passed yet | |
| if (!summaryData) { | |
| return ( | |
| <div className={styles.pageContainer}> | |
| <div className={styles.contentBox}> | |
| <div className={styles.loadingContainer}> | |
| <h2>Generating Your Case Summary...</h2> | |
| <p>This may take a moment.</p> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |
| return ( | |
| <div className={styles.pageContainer}> | |
| <div className={styles.topNav}> | |
| <button className={styles.backButton} onClick={() => onNavigate('landing')}> | |
| <IconBackArrow/> Exit | |
| </button> | |
| <button className={styles.detailsButton} onClick={onShowDetails}> | |
| <IconCodeBlocks className={styles.detailsIcon}/> | |
| Details about this Demo | |
| </button> | |
| </div> | |
| <div className={styles.contentBox}> | |
| <main className={styles.mainLayout}> | |
| <div className={styles.leftPanel}> | |
| {cachedImage ? ( | |
| <img src={cachedImage} alt={journey?.label} className={styles.caseImage}/> | |
| ) : <p>Loading image...</p>} | |
| </div> | |
| <div className={styles.rightPanel}> | |
| <div className={styles.summaryContentWrapper}> | |
| <h1 className={styles.mainTitle}>Case {journey?.id} Review and Summary</h1> | |
| <div className={styles.summarySection}> | |
| <p className={styles.sectionText}>Thanks for taking this learning journey! </p> | |
| </div> | |
| <div className={styles.summarySection}> | |
| <h2 className={styles.sectionTitle}>Potential Findings</h2> | |
| <p className={styles.sectionText}>{summaryData.potential_findings}</p> | |
| </div> | |
| <div className={styles.summarySection}> | |
| <p className={styles.sectionText}>Here is a breakdown from your session:</p> | |
| </div> | |
| <div className={styles.summarySection}> | |
| <h2 className={styles.sectionTitle}>Response Review</h2> | |
| <div className={styles.rationaleContainer}> | |
| {summaryData.rationale.map((log, index) => { | |
| // Determine the overall status for this question's block | |
| let overallQuestionStatusClass = ''; | |
| const hasIncorrectOutcome = log.outcomes.some( | |
| (outcomeItem) => outcomeItem.type === 'Incorrect' | |
| ); | |
| if (hasIncorrectOutcome) { | |
| overallQuestionStatusClass = styles.incorrect; // Overall question is incorrect | |
| } else { | |
| overallQuestionStatusClass = styles.correct; // Overall question is correct | |
| } | |
| return ( | |
| // Apply the overall status class to the main item container | |
| <div | |
| key={index} | |
| className={`${styles.rationaleItem} ${overallQuestionStatusClass}`} | |
| > | |
| <p className={styles.rationaleQuestion}> | |
| <b>Q{index + 1}:</b> <TextWithTooltips text={log.question}/> | |
| </p> | |
| <p className={styles.rationaleOutcome}> | |
| <ul> | |
| {/* Iterate over the 'outcomes' array for each AnswerLog */} | |
| {log.outcomes.map((outcomeItem, lineIndex) => { | |
| // Applying the overall question status class directly to each list item | |
| return ( | |
| <li key={lineIndex} className={overallQuestionStatusClass}> | |
| <b>{outcomeItem.type}</b> -{' '} | |
| <TextWithTooltips text={outcomeItem.text}/> | |
| </li> | |
| ); | |
| })} | |
| </ul> | |
| </p> | |
| </div> | |
| ); | |
| })} | |
| </div> | |
| </div> | |
| {summaryData.guideline_specific_resource && ( | |
| <div className={styles.summarySection}> | |
| <p className={styles.sectionText}> | |
| {`You can always reference the condition: "${summaryData.condition}" from pages ${summaryData.guideline_specific_resource} from `} | |
| <a href="https://www.who.int/publications/i/item/9241546778" target="_blank" | |
| rel="noopener noreferrer" className={styles.guidelineLink}> | |
| The WHO manual of diagnostic imaging | |
| </a> | |
| </p> | |
| </div> | |
| )} | |
| </div> | |
| <div className={styles.disclaimerBox}> | |
| <IconWarning className={styles.disclaimerIcon}/> | |
| <p className={styles.disclaimerText}>This demonstration is for illustrative purposes of MedGemma’s | |
| baseline capabilities only. It does not represent a finished or approved product, is not intended to | |
| diagnose or suggest treatment of any disease or condition, and should not be used for medical | |
| advice.</p> | |
| </div> | |
| </div> | |
| </main> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default SummaryScreen; |