import clsx from 'clsx'; import isElectron from 'is-electron'; import { useCallback, useState } from 'react'; import { RiCheckboxBlankLine, RiCloseLine, RiSubtractLine } from 'react-icons/ri'; import appIcon from '../../../assets/icons/32x32.png'; import macCloseHover from './assets/close-mac-hover.png'; import macClose from './assets/close-mac.png'; import macMaxHover from './assets/max-mac-hover.png'; import macMax from './assets/max-mac.png'; import macMinHover from './assets/min-mac-hover.png'; import macMin from './assets/min-mac.png'; import styles from './window-bar.module.css'; import { useCurrentStatus, useQueueStatus } from '/@/renderer/store'; import { useWindowSettings } from '/@/renderer/store/settings.store'; import { Text } from '/@/shared/components/text/text'; import { Platform, PlayerStatus } from '/@/shared/types/types'; const localSettings = isElectron() ? window.api.localSettings : null; const browser = isElectron() ? window.api.browser : null; const close = () => browser?.exit(); const minimize = () => browser?.minimize(); const maximize = () => browser?.maximize(); const unmaximize = () => browser?.unmaximize(); interface WindowBarControlsProps { controls: { handleClose: () => void; handleMaximize: () => void; handleMinimize: () => void; }; title: string; } const WindowsControls = ({ controls, title }: WindowBarControlsProps) => { const { handleClose, handleMaximize, handleMinimize } = controls; return (
{title}
); }; const MacOsControls = ({ controls, title }: WindowBarControlsProps) => { const { handleClose, handleMaximize, handleMinimize } = controls; const [hoverMin, setHoverMin] = useState(false); const [hoverMax, setHoverMax] = useState(false); const [hoverClose, setHoverClose] = useState(false); return (
setHoverMin(false)} onMouseOver={() => setHoverMin(true)} >
setHoverMax(false)} onMouseOver={() => setHoverMax(true)} >
setHoverClose(false)} onMouseOver={() => setHoverClose(true)} >
{title}
); }; export const WindowBar = () => { const playerStatus = useCurrentStatus(); const { currentSong, index, length } = useQueueStatus(); const { windowBarStyle } = useWindowSettings(); const statusString = playerStatus === PlayerStatus.PAUSED ? '(Paused) ' : ''; const queueString = length ? `(${index + 1} / ${length}) ` : ''; const title = length ? currentSong?.artistName ? `${statusString}${queueString}${currentSong?.name} — ${currentSong?.artistName}` : `${statusString}${queueString}${currentSong?.name}` : 'Feishin'; document.title = title; const [max, setMax] = useState(localSettings?.env.START_MAXIMIZED || false); const handleMinimize = () => minimize(); const handleMaximize = useCallback(() => { if (max) { unmaximize(); } else { maximize(); } setMax(!max); }, [max]); const handleClose = useCallback(() => close(), []); return ( <> {windowBarStyle === Platform.WINDOWS && ( )} {windowBarStyle === Platform.MACOS && ( )} ); };