import { useCallback, useMemo } from "react"; import { Pressable, View } from "react-native"; import Svg, { Line, Rect } from "react-native-svg"; import { useTranslation } from "react-i18next"; import { StyleSheet, withUnistyles } from "react-native-unistyles"; import { closeDesktopWindow, minimizeDesktopWindow, toggleDesktopMaximize, } from "@/desktop/electron/window"; import { getDesktopWindowControlsPresentation, type DesktopWindowControlsPresentation, } from "@/desktop/window-chrome-presentation"; import { useCustomDesktopWindowControls } from "@/utils/desktop-window"; import type { Theme } from "@/styles/theme"; type WindowControlKind = "minimize" | "maximize" | "restore" | "close"; function WindowControlGlyph({ kind, color, size, strokeWidth, }: { kind: WindowControlKind; color: string; size: number; strokeWidth: number; }) { if (kind === "minimize") { return ( ); } if (kind === "restore") { return ( ); } if (kind === "close") { return ( ); } return ( ); } const ThemedWindowControlGlyph = withUnistyles(WindowControlGlyph); const mutedGlyphMapping = (theme: Theme) => ({ color: theme.colors.foregroundMuted }); const whiteGlyphMapping = () => ({ color: "#ffffff" }); function WindowControl({ kind, label, onPress, presentation, }: { kind: WindowControlKind; label: string; onPress: () => void; presentation: DesktopWindowControlsPresentation; }) { const glyph = useCallback( ({ hovered, pressed }: { hovered?: boolean; pressed: boolean }) => { const highlighted = hovered || pressed; const closeHighlighted = kind === "close" && highlighted; return ( ); }, [kind, presentation], ); const controlStyle = useMemo( () => [styles.control, { width: presentation.controlWidth }], [presentation.controlWidth], ); return ( {glyph} ); } export function DesktopWindowControls() { const { t } = useTranslation(); const { visible, mode, isMaximized } = useCustomDesktopWindowControls(); const minimize = useCallback(() => void minimizeDesktopWindow(), []); const toggleMaximize = useCallback(() => void toggleDesktopMaximize(), []); const close = useCallback(() => void closeDesktopWindow(), []); if (!visible || !mode) return null; const presentation = getDesktopWindowControlsPresentation(mode); return ( ); } const styles = StyleSheet.create((theme) => ({ controls: { position: "absolute", top: 0, right: 0, zIndex: 3000, flexDirection: "row", }, control: { height: "100%", alignItems: "center", justifyContent: "center", }, controlSurface: { alignItems: "center", justifyContent: "center", }, fullControlSurface: { width: "100%", height: "100%", }, circularControlSurface: { width: 24, height: 24, borderRadius: 12, }, glyph: { flexShrink: 0, }, controlHovered: { backgroundColor: theme.colors.interactionHighlight, }, closeHovered: { backgroundColor: "rgba(232, 17, 35, 0.9)", }, }));