import clsx from 'clsx'; import isElectron from 'is-electron'; import { useCallback, useMemo, 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 { useAppStore, usePlayerData, usePlayerStatus, useWindowSettings } from '/@/renderer/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 { windowBarStyle } = useWindowSettings(); const playerStatus = usePlayerStatus(); const { privateMode } = useAppStore(); const handleMinimize = () => minimize(); const { currentSong, index, queueLength } = usePlayerData(); const [max, setMax] = useState(localSettings?.env.START_MAXIMIZED || false); const handleMaximize = useCallback(() => { if (max) { unmaximize(); } else { maximize(); } setMax(!max); }, [max]); const handleClose = useCallback(() => close(), []); const title = useMemo(() => { const statusString = playerStatus === PlayerStatus.PAUSED ? '(Paused) ' : ''; const queueString = queueLength ? `(${index + 1} / ${queueLength}) ` : ''; const privateModeString = privateMode ? '(Private mode)' : ''; const title = `${ queueLength ? `${statusString}${queueString}${currentSong?.name}${currentSong?.artistName ? ` — ${currentSong?.artistName} — Feishin` : ''}` : 'Feishin' }${privateMode ? ` ${privateModeString}` : ''}`; document.title = title; return title; }, [currentSong?.artistName, currentSong?.name, index, playerStatus, privateMode, queueLength]); if (windowBarStyle === Platform.WEB) { return null; } return ( <> {windowBarStyle === Platform.WINDOWS && ( )} {windowBarStyle === Platform.MACOS && ( )} ); };