import { useMemo, type ReactNode } from "react"; import type { LayoutChangeEvent } from "react-native"; import { View, type StyleProp, type ViewStyle } from "react-native"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { HEADER_INNER_HEIGHT, HEADER_INNER_HEIGHT_MOBILE, HEADER_TOP_PADDING_MOBILE, useIsCompactFormFactor, } from "@/constants/layout"; import { useWindowControlsPadding } from "@/utils/desktop-window"; import { TitlebarDragRegion } from "@/components/desktop/titlebar-drag-region"; interface ScreenHeaderProps { left?: ReactNode; right?: ReactNode; leftStyle?: StyleProp; rightStyle?: StyleProp; borderless?: boolean; windowControlsPaddingRole?: "header" | "detailHeader"; onRowLayout?: (event: LayoutChangeEvent) => void; } /** * Shared frame for the home/back headers so we only maintain padding, border, * and safe-area logic in one place. */ export function ScreenHeader({ left, right, leftStyle, rightStyle, borderless, windowControlsPaddingRole = "header", onRowLayout, }: ScreenHeaderProps) { const { theme } = useUnistyles(); const insets = useSafeAreaInsets(); const isMobile = useIsCompactFormFactor(); const padding = useWindowControlsPadding(windowControlsPaddingRole); // Only add extra padding on mobile for better touch targets; on desktop, only use safe area insets const topPadding = isMobile ? HEADER_TOP_PADDING_MOBILE : 0; const baseHorizontalPadding = theme.spacing[2]; const innerStyle = useMemo( () => [styles.inner, { paddingTop: insets.top + topPadding }], [insets.top, topPadding], ); const rowStyle = useMemo( () => [ styles.row, { paddingLeft: baseHorizontalPadding + padding.left, paddingRight: baseHorizontalPadding + padding.right, }, borderless && styles.borderless, ], [baseHorizontalPadding, padding.left, padding.right, borderless], ); const leftCombinedStyle = useMemo(() => [styles.left, leftStyle], [leftStyle]); const rightCombinedStyle = useMemo(() => [styles.right, rightStyle], [rightStyle]); return ( {left} {right} ); } const styles = StyleSheet.create((theme) => ({ header: { backgroundColor: theme.colors.surface0, }, inner: {}, row: { position: "relative", height: { xs: HEADER_INNER_HEIGHT_MOBILE, md: HEADER_INNER_HEIGHT, }, flexDirection: "row", alignItems: "center", justifyContent: "space-between", paddingHorizontal: theme.spacing[2], borderBottomWidth: theme.borderWidth[1], borderBottomColor: theme.colors.border, userSelect: "none", }, left: { flex: 1, flexDirection: "row", alignItems: "center", gap: theme.spacing[2], minWidth: 0, }, right: { flexDirection: "row", alignItems: "center", gap: theme.spacing[2], flexShrink: 0, }, borderless: { borderBottomColor: "transparent", }, }));