import React, { MouseEvent } from 'react'; import { Center, Group } from '@mantine/core'; import { useHotkeys } from '@mantine/hooks'; import { motion, AnimatePresence, LayoutGroup } from 'framer-motion'; import { RiArrowUpSLine, RiDiscLine, RiMore2Fill } from 'react-icons/ri'; import { generatePath, Link } from 'react-router-dom'; import styled from 'styled-components'; import { Button, Text, Tooltip } from '/@/renderer/components'; import { AppRoute } from '/@/renderer/router/routes'; import { useAppStoreActions, useCurrentSong, useSetFullScreenPlayerStore, useFullScreenPlayerStore, useSidebarStore, useHotkeySettings, } from '/@/renderer/store'; import { fadeIn } from '/@/renderer/styles'; import { LibraryItem } from '/@/renderer/api/types'; import { SONG_CONTEXT_MENU_ITEMS } from '/@/renderer/features/context-menu/context-menu-items'; import { useHandleGeneralContextMenu } from '/@/renderer/features/context-menu/hooks/use-handle-context-menu'; const ImageWrapper = styled.div` position: relative; display: flex; align-items: center; justify-content: center; padding: 1rem 1rem 1rem 0; `; const MetadataStack = styled(motion.div)` display: flex; flex-direction: column; gap: 0; justify-content: center; width: 100%; overflow: hidden; `; const Image = styled(motion.div)` position: relative; width: 60px; height: 60px; background-color: var(--placeholder-bg); cursor: pointer; filter: drop-shadow(0 5px 6px rgb(0, 0, 0, 50%)); ${fadeIn}; animation: fadein 0.2s ease-in-out; button { display: none; } &:hover button { display: block; } `; const PlayerbarImage = styled.img` width: 100%; height: 100%; object-fit: cover; `; const LineItem = styled.div<{ $secondary?: boolean }>` display: inline-block; width: 95%; max-width: 20vw; overflow: hidden; color: ${(props) => props.$secondary && 'var(--main-fg-secondary)'}; line-height: 1.3; white-space: nowrap; text-overflow: ellipsis; a { color: ${(props) => props.$secondary && 'var(--text-secondary)'}; } `; const LeftControlsContainer = styled.div` display: flex; width: 100%; height: 100%; padding-left: 1rem; @media (max-width: 640px) { ${ImageWrapper} { display: none; } } `; export const LeftControls = () => { const { setSideBar } = useAppStoreActions(); const { expanded: isFullScreenPlayerExpanded } = useFullScreenPlayerStore(); const setFullScreenPlayerStore = useSetFullScreenPlayerStore(); const { image, collapsed } = useSidebarStore(); const hideImage = image && !collapsed; const currentSong = useCurrentSong(); const title = currentSong?.name; const artists = currentSong?.artists; const { bindings } = useHotkeySettings(); const isSongDefined = Boolean(currentSong?.id); const handleGeneralContextMenu = useHandleGeneralContextMenu( LibraryItem.SONG, SONG_CONTEXT_MENU_ITEMS, ); const handleToggleFullScreenPlayer = (e?: MouseEvent | KeyboardEvent) => { e?.stopPropagation(); setFullScreenPlayerStore({ expanded: !isFullScreenPlayerExpanded }); }; const handleToggleSidebarImage = (e?: MouseEvent) => { e?.stopPropagation(); setSideBar({ image: true }); }; useHotkeys([ [ bindings.toggleFullscreenPlayer.allowGlobal ? '' : bindings.toggleFullscreenPlayer.hotkey, handleToggleFullScreenPlayer, ], ]); return ( {!hideImage && ( {currentSong?.imageUrl ? ( ) : (
)}
{!collapsed && ( )}
)}
{title || '—'} {isSongDefined && ( )} {artists?.map((artist, index) => ( {index > 0 && ( , )}{' '} {artist.name || '—'} ))} {currentSong?.album || '—'}
); };