diff --git a/packages/cli/src/ui/components/Notifications.tsx b/packages/cli/src/ui/components/Notifications.tsx index a322dab86b..64ebbc37bf 100644 --- a/packages/cli/src/ui/components/Notifications.tsx +++ b/packages/cli/src/ui/components/Notifications.tsx @@ -5,41 +5,86 @@ */ import { Box, Text, useIsScreenReaderEnabled } from 'ink'; +import { useEffect, useState } from 'react'; import { useAppContext } from '../contexts/AppContext.js'; import { useUIState } from '../contexts/UIStateContext.js'; import { theme } from '../semantic-colors.js'; import { StreamingState } from '../types.js'; import { UpdateNotification } from './UpdateNotification.js'; -import { GEMINI_DIR } from '@google/gemini-cli-core'; -import { homedir } from 'node:os'; +import { GEMINI_DIR, Storage } from '@google/gemini-cli-core'; + +import * as fs from 'node:fs/promises'; +import os from 'node:os'; import path from 'node:path'; -const settingsPath = path.join(homedir(), GEMINI_DIR, 'settings.json'); +const settingsPath = path.join(os.homedir(), GEMINI_DIR, 'settings.json'); + +const screenReaderNudgeFilePath = path.join( + Storage.getGlobalTempDir(), + 'seen_screen_reader_nudge.json', +); export const Notifications = () => { const { startupWarnings } = useAppContext(); const { initError, streamingState, updateInfo } = useUIState(); + const isScreenReaderEnabled = useIsScreenReaderEnabled(); const showStartupWarnings = startupWarnings.length > 0; const showInitError = initError && streamingState !== StreamingState.Responding; + const [hasSeenScreenReaderNudge, setHasSeenScreenReaderNudge] = useState< + boolean | undefined + >(undefined); + + useEffect(() => { + const checkScreenReaderNudge = async () => { + try { + await fs.access(screenReaderNudgeFilePath); + setHasSeenScreenReaderNudge(true); + } catch { + setHasSeenScreenReaderNudge(false); + } + }; + checkScreenReaderNudge(); + }, []); + + const showScreenReaderNudge = + isScreenReaderEnabled && !hasSeenScreenReaderNudge; + + useEffect(() => { + const writeScreenReaderNudgeFile = async () => { + if (showScreenReaderNudge) { + try { + await fs.mkdir(path.dirname(screenReaderNudgeFilePath), { + recursive: true, + }); + await fs.writeFile(screenReaderNudgeFilePath, 'true'); + } catch (error) { + console.error('Error storing screen reader nudge', error); + } + } + }; + writeScreenReaderNudgeFile(); + }, [showScreenReaderNudge]); + if ( !showStartupWarnings && !showInitError && !updateInfo && - !isScreenReaderEnabled + !showScreenReaderNudge ) { return null; } return ( <> - {isScreenReaderEnabled && ( + {showScreenReaderNudge && ( You are currently in screen reader-friendly view. To switch out, open{' '} - {settingsPath} and remove the entry for {'"screenReader"'}. + {settingsPath} and remove the entry for {'"screenReader"'}. This will + disappear on next run. )} {updateInfo && }