import clsx from 'clsx'; import { motion } from 'motion/react'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Link, NavLink, useNavigate } from 'react-router'; import styles from './collapsed-sidebar.module.css'; import JellyfinLogo from '/@/renderer/features/servers/assets/jellyfin.png'; import NavidromeLogo from '/@/renderer/features/servers/assets/navidrome.png'; import OpenSubsonicLogo from '/@/renderer/features/servers/assets/opensubsonic.png'; import { CollapsedSidebarButton } from '/@/renderer/features/sidebar/components/collapsed-sidebar-button'; import { CollapsedSidebarItem } from '/@/renderer/features/sidebar/components/collapsed-sidebar-item'; import { ServerSelectorItems } from '/@/renderer/features/sidebar/components/server-selector-items'; import { getCollectionTo } from '/@/renderer/features/sidebar/components/sidebar-collection-list'; import { SidebarIcon } from '/@/renderer/features/sidebar/components/sidebar-icon'; import { AppMenu } from '/@/renderer/features/titlebar/components/app-menu'; import { AppRoute } from '/@/renderer/router/routes'; import { SidebarItemType, useCollections, useCurrentServer, useSidebarCollapsedNavigation, useSidebarItems, useWindowSettings, } from '/@/renderer/store'; import { DropdownMenu } from '/@/shared/components/dropdown-menu/dropdown-menu'; import { Flex } from '/@/shared/components/flex/flex'; import { Group } from '/@/shared/components/group/group'; import { Icon } from '/@/shared/components/icon/icon'; import { ScrollArea } from '/@/shared/components/scroll-area/scroll-area'; import { Stack } from '/@/shared/components/stack/stack'; import { LibraryItem, ServerType } from '/@/shared/types/domain-types'; import { Platform } from '/@/shared/types/types'; export const CollapsedSidebar = () => { const { t } = useTranslation(); const navigate = useNavigate(); const collections = useCollections(); const { windowBarStyle } = useWindowSettings(); const sidebarCollapsedNavigation = useSidebarCollapsedNavigation(); const sidebarItems = useSidebarItems(); const currentServer = useCurrentServer(); const translatedSidebarItemMap = useMemo( () => ({ Albums: t('page.sidebar.albums', { postProcess: 'titleCase' }), Artists: t('page.sidebar.albumArtists', { postProcess: 'titleCase' }).replace( ' ', '\n', ), 'Artists-all': t('page.sidebar.artists', { postProcess: 'titleCase' }), Collections: t('page.sidebar.collections', { postProcess: 'titleCase' }), Favorites: t('page.sidebar.favorites', { postProcess: 'titleCase' }), Folders: t('page.sidebar.folders', { postProcess: 'titleCase' }), Genres: t('page.sidebar.genres', { postProcess: 'titleCase' }), Home: t('page.sidebar.home', { postProcess: 'titleCase' }), 'Now Playing': t('page.sidebar.nowPlaying', { postProcess: 'titleCase' }), Playlists: t('page.sidebar.playlists', { postProcess: 'titleCase' }), Radio: t('page.sidebar.radio', { postProcess: 'titleCase' }), Search: t('page.sidebar.search', { postProcess: 'titleCase' }), Settings: t('page.sidebar.settings', { postProcess: 'titleCase' }), Tracks: t('page.sidebar.tracks', { postProcess: 'titleCase' }), }), [t], ); const sidebarItemsWithRoute: SidebarItemType[] = useMemo(() => { if (!sidebarItems) return []; const items = sidebarItems .filter((item) => !item.disabled) .map((item) => ({ ...item, label: translatedSidebarItemMap[item.id as keyof typeof translatedSidebarItemMap] ?? item.label, })); return items; }, [sidebarItems, translatedSidebarItemMap]); return ( {sidebarCollapsedNavigation && ( navigate(-1)}> navigate(1)}> )} } label={t('common.menu', { postProcess: 'titleCase' })} style={{ cursor: 'pointer', padding: 'var(--theme-spacing-md) 0', }} /> {sidebarItemsWithRoute.map((item) => item.id === 'Collections' ? ( collections && collections.length > 0 ? ( } label={item.label} style={{ cursor: 'pointer', padding: 'var(--theme-spacing-md) 0', }} /> {collections.map((collection) => { const to = getCollectionTo(collection); return ( } to={to} > {collection.name} ); })} ) : null ) : ( } component={NavLink} icon={} key={item.id} label={item.label} route={item.route} to={item.route} /> ), )} {currentServer && ( } label={''} py="md" style={{ cursor: 'pointer', }} /> )} ); };