import clsx from 'clsx'; import React, { useEffect, useRef } from 'react'; import { tauriHandleMinimize, tauriHandleToggleMaximize, tauriHandleClose } from '@/utils/window'; import { isTauriAppPlatform } from '@/services/environment'; interface WindowButtonsProps { className?: string; headerRef?: React.RefObject; showMinimize?: boolean; showMaximize?: boolean; showClose?: boolean; onMinimize?: () => void; onToggleMaximize?: () => void; onClose?: () => void; } interface WindowButtonProps { id: string; onClick: () => void; ariaLabel: string; children: React.ReactNode; } const WindowButton: React.FC = ({ onClick, ariaLabel, id, children }) => ( ); const WindowButtons: React.FC = ({ className, headerRef, showMinimize = true, showMaximize = true, showClose = true, onMinimize, onToggleMaximize, onClose, }) => { const parentRef = useRef(null); const handleMouseDown = async (e: MouseEvent) => { const target = e.target as HTMLElement; if ( target.closest('.btn') || target.closest('.window-button') || target.closest('.exclude-title-bar-mousedown') ) { return; } const { getCurrentWindow } = await import('@tauri-apps/api/window'); if (e.buttons === 1) { if (e.detail === 2) { getCurrentWindow().toggleMaximize(); } else { getCurrentWindow().startDragging(); } } }; useEffect(() => { if (!isTauriAppPlatform()) return; const headerElement = headerRef?.current; headerElement?.addEventListener('mousedown', handleMouseDown); return () => { headerElement?.removeEventListener('mousedown', handleMouseDown); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleMinimize = async () => { if (onMinimize) { onMinimize(); } else { tauriHandleMinimize(); } }; const handleMaximize = async () => { if (onToggleMaximize) { onToggleMaximize(); } else { tauriHandleToggleMaximize(); } }; const handleClose = async () => { if (onClose) { onClose(); } else { tauriHandleClose(); } }; return (
{showMinimize && ( )} {showMaximize && ( )} {showClose && ( )}
); }; export default WindowButtons;