import { MouseEvent } from 'react'; import { Stack, Grid, Accordion, Center, Group } from '@mantine/core'; import { closeAllModals, openModal } from '@mantine/modals'; import { AnimatePresence, motion } from 'framer-motion'; import { BsCollection } from 'react-icons/bs'; import { Button, MotionStack, ScrollArea, TextInput } from '/@/renderer/components'; import { MdOutlineFeaturedPlayList, MdFeaturedPlayList } from 'react-icons/md'; import { RiAddFill, RiAlbumFill, RiAlbumLine, RiArrowDownSLine, RiArrowLeftSLine, RiArrowRightSLine, RiDatabaseFill, RiDatabaseLine, RiDiscLine, RiFlag2Line, RiFolder3Line, RiHome4Fill, RiHome4Line, RiListUnordered, RiMusic2Fill, RiMusic2Line, RiSearchLine, RiUserVoiceFill, RiUserVoiceLine, } from 'react-icons/ri'; import { useNavigate, Link, useLocation, generatePath } from 'react-router-dom'; import styled from 'styled-components'; import { PlaylistSidebarItem, SidebarItem, } from '/@/renderer/features/sidebar/components/sidebar-item'; import { AppRoute } from '/@/renderer/router/routes'; import { useSidebarStore, useAppStoreActions, useCurrentSong, useCurrentServer, } from '/@/renderer/store'; import { fadeIn } from '/@/renderer/styles'; import { CreatePlaylistForm, usePlaylistList } from '/@/renderer/features/playlists'; import { LibraryItem, PlaylistListSort, ServerType, SortOrder } from '/@/renderer/api/types'; import { usePlayQueueAdd } from '/@/renderer/features/player'; import { usePlayButtonBehavior } from '/@/renderer/store/settings.store'; const SidebarContainer = styled.div` height: 100%; max-height: calc(100vh - 85px); // Account for playerbar user-select: none; `; const ImageContainer = styled(motion(Link))<{ height: string }>` position: relative; height: ${(props) => props.height}; ${fadeIn}; animation: fadein 0.2s ease-in-out; button { display: none; } &:hover button { display: block; } `; const SidebarImage = styled.img` width: 100%; height: 100%; object-fit: cover; background: var(--placeholder-bg); `; const ActionsContainer = styled(Grid)` -webkit-app-region: drag; `; export const Sidebar = () => { const navigate = useNavigate(); const location = useLocation(); const sidebar = useSidebarStore(); const { setSidebar } = useAppStoreActions(); const imageUrl = useCurrentSong()?.imageUrl; const server = useCurrentServer(); const upsizedImageUrl = imageUrl ?.replace(/size=\d+/, 'size=300') .replace(/width=\d+/, 'width=300') .replace(/height=\d+/, 'height=300'); const showImage = sidebar.image; const handlePlayQueueAdd = usePlayQueueAdd(); const playButtonBehavior = usePlayButtonBehavior(); const handlePlayPlaylist = (id: string) => { handlePlayQueueAdd?.({ byItemType: { id: [id], type: LibraryItem.PLAYLIST, }, play: playButtonBehavior, }); }; const playlistsQuery = usePlaylistList({ limit: 100, sortBy: PlaylistListSort.NAME, sortOrder: SortOrder.ASC, startIndex: 0, }); const handleCreatePlaylistModal = (e: MouseEvent) => { e.stopPropagation(); openModal({ children: closeAllModals()} />, size: server?.type === ServerType?.NAVIDROME ? 'lg' : 'sm', title: 'Create Playlist', }); }; return ( } placeholder="Search" rightSectionWidth={90} size="md" /> {location.pathname === AppRoute.HOME ? ( ) : ( )} Home setSidebar({ expanded: e })} > {location.pathname.includes('/library/') ? ( ) : ( )} Library {location.pathname === AppRoute.LIBRARY_ALBUMS ? ( ) : ( )} Albums {location.pathname === AppRoute.LIBRARY_SONGS ? ( ) : ( )} Tracks {location.pathname === AppRoute.LIBRARY_ALBUM_ARTISTS ? ( ) : ( )} Album Artists Genres Folders Collections {location.pathname.includes('/playlists/') ? ( ) : ( )} Playlists {playlistsQuery?.data?.items?.map((playlist) => ( handlePlayPlaylist(playlist.id)} to={generatePath(AppRoute.PLAYLISTS_DETAIL, { playlistId: playlist.id })} > {playlist.name} ))} {showImage && ( {upsizedImageUrl ? ( ) : (
)}
)}
); };