import clsx from 'clsx'; import { AnimatePresence, LayoutGroup, motion } from 'motion/react'; import React, { MouseEvent } from 'react'; import { useTranslation } from 'react-i18next'; import { generatePath, Link } from 'react-router'; import { shallow } from 'zustand/shallow'; import styles from './left-controls.module.css'; import { ItemImage } from '/@/renderer/components/item-image/item-image'; import { ContextMenuController } from '/@/renderer/features/context-menu/context-menu-controller'; import { RadioMetadataDisplay } from '/@/renderer/features/player/components/radio-metadata-display'; import { useIsRadioActive } from '/@/renderer/features/radio/hooks/use-radio-player'; import { AppRoute } from '/@/renderer/router/routes'; import { useAppStore, useAppStoreActions, useFullScreenPlayerStore, useHotkeySettings, usePlayerSong, useSetFullScreenPlayerStore, } from '/@/renderer/store'; import { ActionIcon } from '/@/shared/components/action-icon/action-icon'; import { Group } from '/@/shared/components/group/group'; import { Separator } from '/@/shared/components/separator/separator'; import { Text } from '/@/shared/components/text/text'; import { Tooltip } from '/@/shared/components/tooltip/tooltip'; import { PlaybackSelectors } from '/@/shared/constants/playback-selectors'; import { useHotkeys } from '/@/shared/hooks/use-hotkeys'; import { LibraryItem } from '/@/shared/types/domain-types'; export const LeftControls = () => { const { t } = useTranslation(); const { setSideBar } = useAppStoreActions(); const { expanded: isFullScreenPlayerExpanded } = useFullScreenPlayerStore(); const setFullScreenPlayerStore = useSetFullScreenPlayerStore(); const { collapsed, image } = useAppStore( (state) => ({ collapsed: state.sidebar.collapsed, image: state.sidebar.image, }), shallow, ); const currentSong = usePlayerSong(); const isRadioActive = useIsRadioActive(); const { bindings } = useHotkeySettings(); const isRadioMode = isRadioActive; const hideImage = (image && !collapsed) || isRadioMode; const isSongDefined = Boolean(currentSong?.id) && !isRadioMode; const title = currentSong?.name; const artists = currentSong?.artists; const handleToggleFullScreenPlayer = (e?: KeyboardEvent | MouseEvent) => { // don't toggle if right click if (e && 'button' in e && e.button === 2) { return; } e?.stopPropagation(); setFullScreenPlayerStore({ expanded: !isFullScreenPlayerExpanded }); }; const handleToggleSidebarImage = (e?: MouseEvent) => { e?.stopPropagation(); setSideBar({ image: true }); }; const handleToggleContextMenu = (e: MouseEvent) => { e.preventDefault(); e.stopPropagation(); if (!currentSong) { return; } ContextMenuController.call({ cmd: { items: [currentSong], type: LibraryItem.SONG }, event: e, }); }; const stopPropagation = (e?: MouseEvent) => e?.stopPropagation(); useHotkeys([ [ bindings.toggleFullscreenPlayer.allowGlobal ? '' : bindings.toggleFullscreenPlayer.hotkey, handleToggleFullScreenPlayer, ], ]); return (
{!hideImage && (
{!collapsed && ( )}
)}
{isRadioMode ? ( ) : ( <>
{title || '—'} {currentSong?.trackSubtitle && ( {' ('} {currentSong.trackSubtitle} {')'} )} {isSongDefined && ( { e.preventDefault(); e.stopPropagation(); if (currentSong) { ContextMenuController.call({ cmd: { items: [currentSong], type: LibraryItem.SONG, }, event: e, }); } }} size="xs" styles={{ root: { '--ai-size-xs': '1.15rem', }, }} variant="subtle" /> )}
{artists?.map((artist, index) => ( {index > 0 && } {artist.name || '—'} ))}
{currentSong?.album || '—'}
)}
); };