diff --git a/src/App.tsx b/src/App.tsx index 98cc0df..3ffc14d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -13,6 +13,7 @@ function MainContent(): React.JSX.Element { const location = useLocation() const { currentTheme } = useTheme() const [messageApi, contextHolder] = message.useMessage() + const { isIosDevice, isIosPhone } = useMemo(getIosDeviceInfo, []) useEffect(() => { const api = (window as any).api @@ -51,8 +52,8 @@ function MainContent(): React.JSX.Element { const [authVisible, setAuthVisible] = useState(false) const [authPassword, setAuthPassword] = useState("") const [authLoading, setAuthLoading] = useState(false) - const [isPortraitMode, setIsPortraitMode] = useState(false) - const [sidebarCollapsed, setSidebarCollapsed] = useState(false) + const [isPortraitMode, setIsPortraitMode] = useState(isIosPhone) + const [sidebarCollapsed, setSidebarCollapsed] = useState(isIosPhone) const [floatingSidebarExpanded, setFloatingSidebarExpanded] = useState(false) const [syncConflictVisible, setSyncConflictVisible] = useState(false) const [syncConflicts, setSyncConflicts] = useState< @@ -311,6 +312,7 @@ function MainContent(): React.JSX.Element { hasAnyPassword={hasAnyPassword} onAuthClick={() => setAuthVisible(true)} onLogout={logout} + showWindowControls={!isIosDevice} isPortraitMode={isPortraitMode} sidebarCollapsed={sidebarCollapsed} floatingExpand={isPortraitMode} @@ -453,6 +455,13 @@ function getArchitecture(): string { function getPlatform(): string { const userAgent = navigator.userAgent.toLowerCase() + const isAppleTouchDevice = userAgent.includes("macintosh") && navigator.maxTouchPoints > 1 + + if (userAgent.includes("iphone") || userAgent.includes("ipad") || userAgent.includes("ipod") || isAppleTouchDevice) { + return "iOS" + } else if (userAgent.includes("android")) { + return "Android" + } if (userAgent.includes("windows")) { return "Windows" @@ -464,6 +473,17 @@ function getPlatform(): string { return "Unknown" } + +function getIosDeviceInfo(): { isIosDevice: boolean; isIosPhone: boolean } { + const userAgent = navigator.userAgent.toLowerCase() + const isAppleTouchDevice = userAgent.includes("macintosh") && navigator.maxTouchPoints > 1 + const isIosDevice = /iphone|ipad|ipod/.test(userAgent) || isAppleTouchDevice + const isIosTablet = userAgent.includes("ipad") || isAppleTouchDevice + return { + isIosDevice, + isIosPhone: isIosDevice && !isIosTablet, + } +} function App(): React.JSX.Element { return ( diff --git a/src/components/ContentArea.tsx b/src/components/ContentArea.tsx index 5766068..b09f5f0 100644 --- a/src/components/ContentArea.tsx +++ b/src/components/ContentArea.tsx @@ -46,6 +46,7 @@ interface ContentAreaProps { hasAnyPassword: boolean onAuthClick: () => void onLogout: () => void + showWindowControls: boolean isPortraitMode: boolean sidebarCollapsed: boolean floatingExpand: boolean @@ -59,6 +60,7 @@ export function ContentArea({ hasAnyPassword, onAuthClick, onLogout, + showWindowControls, isPortraitMode, sidebarCollapsed, floatingExpand, @@ -189,10 +191,12 @@ export function ContentArea({ )} - + {showWindowControls && ( + + )} diff --git a/src/main.tsx b/src/main.tsx index b4d9de2..b7d4ac5 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -127,7 +127,8 @@ const disableTouchZoom = () => { disableTouchZoom() const platform = navigator.userAgent.toLowerCase() -const isIos = /iphone|ipad|ipod/.test(platform) +const isAppleTouchDevice = platform.includes("macintosh") && navigator.maxTouchPoints > 1 +const isIos = /iphone|ipad|ipod/.test(platform) || isAppleTouchDevice const isMacDesktop = platform.includes("mac") && !isIos if (isMacDesktop) {