2025-09-06 01:39:02 -04:00
|
|
|
/**
|
|
|
|
|
* @license
|
|
|
|
|
* Copyright 2025 Google LLC
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { Box } from 'ink';
|
|
|
|
|
import { Header } from './Header.js';
|
|
|
|
|
import { Tips } from './Tips.js';
|
|
|
|
|
import { useSettings } from '../contexts/SettingsContext.js';
|
|
|
|
|
import { useConfig } from '../contexts/ConfigContext.js';
|
|
|
|
|
import { useUIState } from '../contexts/UIStateContext.js';
|
2025-11-18 12:01:16 -05:00
|
|
|
import { Banner } from './Banner.js';
|
|
|
|
|
import { theme } from '../semantic-colors.js';
|
|
|
|
|
import { Colors } from '../colors.js';
|
|
|
|
|
import { persistentState } from '../../utils/persistentState.js';
|
|
|
|
|
import { useState, useEffect, useRef } from 'react';
|
2025-09-06 01:39:02 -04:00
|
|
|
|
|
|
|
|
interface AppHeaderProps {
|
|
|
|
|
version: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const AppHeader = ({ version }: AppHeaderProps) => {
|
|
|
|
|
const settings = useSettings();
|
|
|
|
|
const config = useConfig();
|
2025-11-18 12:01:16 -05:00
|
|
|
const { nightly, mainAreaWidth, bannerData, bannerVisible } = useUIState();
|
|
|
|
|
|
|
|
|
|
const [defaultBannerShownCount] = useState(
|
|
|
|
|
() => persistentState.get('defaultBannerShownCount') || 0,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const { defaultText, warningText } = bannerData;
|
|
|
|
|
|
|
|
|
|
const showDefaultBanner =
|
|
|
|
|
warningText === '' &&
|
|
|
|
|
!config.getPreviewFeatures() &&
|
|
|
|
|
defaultBannerShownCount < 5;
|
|
|
|
|
const bannerText = showDefaultBanner ? defaultText : warningText;
|
|
|
|
|
const unescapedBannerText = bannerText.replace(/\\n/g, '\n');
|
|
|
|
|
|
|
|
|
|
const defaultColor = Colors.AccentBlue;
|
|
|
|
|
const fontColor = warningText === '' ? defaultColor : theme.status.warning;
|
|
|
|
|
|
|
|
|
|
const hasIncrementedRef = useRef(false);
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (showDefaultBanner && defaultText && !hasIncrementedRef.current) {
|
|
|
|
|
hasIncrementedRef.current = true;
|
|
|
|
|
const current = persistentState.get('defaultBannerShownCount') || 0;
|
|
|
|
|
persistentState.set('defaultBannerShownCount', current + 1);
|
|
|
|
|
}
|
|
|
|
|
}, [showDefaultBanner, defaultText]);
|
2025-09-08 16:41:39 +00:00
|
|
|
|
2025-09-06 01:39:02 -04:00
|
|
|
return (
|
|
|
|
|
<Box flexDirection="column">
|
|
|
|
|
{!(settings.merged.ui?.hideBanner || config.getScreenReader()) && (
|
2025-11-18 12:01:16 -05:00
|
|
|
<>
|
|
|
|
|
<Header version={version} nightly={nightly} />
|
|
|
|
|
{bannerVisible && unescapedBannerText && (
|
|
|
|
|
<Banner
|
|
|
|
|
width={mainAreaWidth}
|
|
|
|
|
bannerText={unescapedBannerText}
|
|
|
|
|
color={fontColor}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
2025-09-06 01:39:02 -04:00
|
|
|
)}
|
2025-09-19 15:22:39 -07:00
|
|
|
{!(settings.merged.ui?.hideTips || config.getScreenReader()) && (
|
|
|
|
|
<Tips config={config} />
|
|
|
|
|
)}
|
2025-09-06 01:39:02 -04:00
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
};
|