import { Box, Text, TextAttributes, useUiHost } from "../../ui"; import { useShortcut } from "../../react/input"; import { useCallback, type ComponentType, type ReactNode } from "react"; import { colors } from "../../theme/colors"; import { isDetailBackNavigationKey, isMouseBackNavigationEvent, } from "../../utils/back-navigation"; export interface PageStackViewProps { focused: boolean; detailOpen: boolean; onBack: () => void; rootContent: ReactNode; detailContent: ReactNode; detailTitle?: string; backLabel?: string; backHint?: string; } export function PageStackView({ focused, detailOpen, onBack, rootContent, detailContent, detailTitle, backLabel = "Back", backHint, }: PageStackViewProps) { const HostPageStackView = useUiHost().PageStackView as ComponentType | undefined; const props = { focused, detailOpen, onBack, rootContent, detailContent, detailTitle, backLabel, backHint, }; if (HostPageStackView) { return ; } return ; } function OpenTuiPageStackView({ focused, detailOpen, onBack, rootContent, detailContent, detailTitle, backLabel, backHint, }: PageStackViewProps) { const goBack = useCallback((event?: { preventDefault?: () => void; stopPropagation?: () => void; }) => { event?.stopPropagation?.(); event?.preventDefault?.(); onBack(); }, [onBack]); useShortcut((event) => { if (!focused || !detailOpen || !isDetailBackNavigationKey(event)) return; goBack(event); }); const handleMouseDown = useCallback((event: { button?: unknown; preventDefault?: () => void; stopPropagation?: () => void; }) => { if (!focused || !detailOpen || !isMouseBackNavigationEvent(event)) return; goBack(event); }, [detailOpen, focused, goBack]); if (!detailOpen) { return ( {rootContent} ); } return ( void; stopPropagation?: () => void }) => { goBack(event); }} backgroundColor={colors.selected} > {`← ${backLabel}`} {detailTitle ? ( <> {detailTitle} ) : ( )} {backHint ? {backHint} : null} {detailContent} ); }