diff --git a/src/renderer/features/sidebar/components/collapsed-sidebar.tsx b/src/renderer/features/sidebar/components/collapsed-sidebar.tsx
index 45371547..b39f195e 100644
--- a/src/renderer/features/sidebar/components/collapsed-sidebar.tsx
+++ b/src/renderer/features/sidebar/components/collapsed-sidebar.tsx
@@ -1,42 +1,16 @@
import { Group, UnstyledButton } from '@mantine/core';
import { motion } from 'framer-motion';
import { useMemo } from 'react';
-import { IconType } from 'react-icons';
-import {
- RiUserVoiceLine,
- RiMenuFill,
- RiFolder3Line,
- RiPlayListLine,
- RiAlbumLine,
- RiHome6Line,
- RiMusic2Line,
- RiHome6Fill,
- RiAlbumFill,
- RiMusic2Fill,
- RiUserVoiceFill,
- RiFlag2Fill,
- RiFolder3Fill,
- RiPlayListFill,
- RiSearchLine,
- RiSearchFill,
- RiPlayFill,
- RiPlayLine,
- RiSettings2Fill,
- RiSettings2Line,
- RiFlag2Line,
- RiArrowLeftSLine,
- RiArrowRightSLine,
-} from 'react-icons/ri';
-import { generatePath, NavLink, useNavigate } from 'react-router-dom';
+import { RiArrowLeftSLine, RiArrowRightSLine, RiMenuFill } from 'react-icons/ri';
+import { NavLink, useNavigate } from 'react-router-dom';
import styled from 'styled-components';
-import { LibraryItem } from '/@/renderer/api/types';
import { DropdownMenu, ScrollArea } from '/@/renderer/components';
+import { CollapsedSidebarButton } from '/@/renderer/features/sidebar/components/collapsed-sidebar-button';
import { CollapsedSidebarItem } from '/@/renderer/features/sidebar/components/collapsed-sidebar-item';
+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, useGeneralSettings, useWindowSettings } from '/@/renderer/store';
import { Platform } from '/@/renderer/types';
-import { CollapsedSidebarButton } from '/@/renderer/features/sidebar/components/collapsed-sidebar-button';
const SidebarContainer = styled(motion.div)<{ $windowBarStyle: Platform }>`
display: flex;
@@ -49,65 +23,18 @@ const SidebarContainer = styled(motion.div)<{ $windowBarStyle: Platform }>`
user-select: none;
`;
-const sidebarItemMap = {
- [AppRoute.HOME]: {
- activeIcon: RiHome6Fill,
- icon: RiHome6Line,
- },
- [AppRoute.LIBRARY_ALBUMS]: {
- activeIcon: RiAlbumFill,
- icon: RiAlbumLine,
- },
- [AppRoute.LIBRARY_ALBUM_ARTISTS]: {
- activeIcon: RiUserVoiceFill,
- icon: RiUserVoiceLine,
- },
- [AppRoute.PLAYLISTS]: {
- activeIcon: RiPlayListFill,
- icon: RiPlayListLine,
- },
- [AppRoute.LIBRARY_SONGS]: {
- activeIcon: RiMusic2Fill,
- icon: RiMusic2Line,
- },
- [AppRoute.LIBRARY_FOLDERS]: {
- activeIcon: RiFolder3Fill,
- icon: RiFolder3Line,
- },
- [AppRoute.LIBRARY_GENRES]: {
- activeIcon: RiFlag2Fill,
- icon: RiFlag2Line,
- },
- [generatePath(AppRoute.SEARCH, { itemType: LibraryItem.SONG })]: {
- activeIcon: RiSearchFill,
- icon: RiSearchLine,
- },
- [AppRoute.SETTINGS]: {
- activeIcon: RiSettings2Fill,
- icon: RiSettings2Line,
- },
- [AppRoute.NOW_PLAYING]: {
- activeIcon: RiPlayFill,
- icon: RiPlayLine,
- },
-};
-
export const CollapsedSidebar = () => {
const navigate = useNavigate();
const { windowBarStyle } = useWindowSettings();
const { sidebarItems, sidebarCollapsedNavigation } = useGeneralSettings();
- const sidebarItemsWithRoute: (SidebarItemType & {
- activeIcon: IconType;
- icon: IconType;
- })[] = useMemo(() => {
+ const sidebarItemsWithRoute: SidebarItemType[] = useMemo(() => {
if (!sidebarItems) return [];
const items = sidebarItems
.filter((item) => !item.disabled)
.map((item) => ({
...item,
- ...sidebarItemMap[item.route as keyof typeof sidebarItemMap],
}));
return items;
@@ -157,9 +84,20 @@ export const CollapsedSidebar = () => {
{sidebarItemsWithRoute.map((item) => (
}
+ activeIcon={
+
+ }
component={NavLink}
- icon={}
+ icon={
+
+ }
label={item.label}
route={item.route}
to={item.route}
diff --git a/src/renderer/features/sidebar/components/sidebar-icon.tsx b/src/renderer/features/sidebar/components/sidebar-icon.tsx
new file mode 100644
index 00000000..7d48e723
--- /dev/null
+++ b/src/renderer/features/sidebar/components/sidebar-icon.tsx
@@ -0,0 +1,68 @@
+import {
+ RiAlbumFill,
+ RiAlbumLine,
+ RiFlag2Fill,
+ RiFlag2Line,
+ RiFolder3Fill,
+ RiFolder3Line,
+ RiHome6Fill,
+ RiHome6Line,
+ RiMusic2Fill,
+ RiMusic2Line,
+ RiPlayFill,
+ RiPlayLine,
+ RiPlayListFill,
+ RiPlayListLine,
+ RiSearchFill,
+ RiSearchLine,
+ RiSettings2Fill,
+ RiSettings2Line,
+ RiUserVoiceFill,
+ RiUserVoiceLine,
+} from 'react-icons/ri';
+import { AppRoute } from '/@/renderer/router/routes';
+import { generatePath } from 'react-router';
+import { LibraryItem } from '/@/renderer/api/types';
+
+interface SidebarIconProps {
+ active?: boolean;
+ route: string;
+ size?: string;
+}
+
+export const SidebarIcon = ({ active, route, size }: SidebarIconProps) => {
+ switch (route) {
+ case AppRoute.HOME:
+ if (active) return ;
+ return ;
+ case AppRoute.LIBRARY_ALBUMS:
+ if (active) return ;
+ return ;
+ case AppRoute.LIBRARY_ARTISTS:
+ if (active) return ;
+ return ;
+ case AppRoute.PLAYLISTS:
+ if (active) return ;
+ return ;
+ case AppRoute.LIBRARY_SONGS:
+ if (active) return ;
+ return ;
+ case AppRoute.LIBRARY_FOLDERS:
+ if (active) return ;
+ return ;
+ case AppRoute.LIBRARY_GENRES:
+ if (active) return ;
+ return ;
+ case generatePath(AppRoute.SEARCH, { itemType: LibraryItem.SONG }):
+ if (active) return ;
+ return ;
+ case AppRoute.SETTINGS:
+ if (active) return ;
+ return ;
+ case AppRoute.NOW_PLAYING:
+ if (active) return ;
+ return ;
+ default:
+ return ;
+ }
+};
diff --git a/src/renderer/features/sidebar/components/sidebar.tsx b/src/renderer/features/sidebar/components/sidebar.tsx
index c3784db6..810e4c07 100644
--- a/src/renderer/features/sidebar/components/sidebar.tsx
+++ b/src/renderer/features/sidebar/components/sidebar.tsx
@@ -1,45 +1,20 @@
-import { MouseEvent, useMemo } from 'react';
import { Box, Center, Divider, Group, Stack } from '@mantine/core';
import { closeAllModals, openModal } from '@mantine/modals';
import { AnimatePresence, motion } from 'framer-motion';
-import { IconType } from 'react-icons';
-import {
- RiAddFill,
- RiAlbumFill,
- RiAlbumLine,
- RiArrowDownSLine,
- RiDiscLine,
- RiFlag2Fill,
- RiFlagLine,
- RiFolder3Fill,
- RiFolder3Line,
- RiHome6Fill,
- RiHome6Line,
- RiListUnordered,
- RiMusic2Fill,
- RiMusic2Line,
- RiPlayLine,
- RiSearchFill,
- RiUserVoiceFill,
- RiUserVoiceLine,
- RiSearchLine,
- RiPlayFill,
- RiSettings2Line,
- RiSettings2Fill,
- RiPlayListLine,
- RiPlayListFill,
-} from 'react-icons/ri';
-import { generatePath, Link, useLocation } from 'react-router-dom';
+import { MouseEvent, useMemo } from 'react';
+import { RiAddFill, RiArrowDownSLine, RiDiscLine, RiListUnordered } from 'react-icons/ri';
+import { Link, useLocation } from 'react-router-dom';
import styled from 'styled-components';
import {
SidebarItemType,
useGeneralSettings,
useWindowSettings,
} from '../../../store/settings.store';
-import { LibraryItem, PlaylistListSort, ServerType, SortOrder } from '/@/renderer/api/types';
+import { PlaylistListSort, ServerType, SortOrder } from '/@/renderer/api/types';
import { Button, MotionStack, Spinner, Tooltip } from '/@/renderer/components';
import { CreatePlaylistForm, usePlaylistList } from '/@/renderer/features/playlists';
import { ActionBar } from '/@/renderer/features/sidebar/components/action-bar';
+import { SidebarIcon } from '/@/renderer/features/sidebar/components/sidebar-icon';
import { SidebarItem } from '/@/renderer/features/sidebar/components/sidebar-item';
import { SidebarPlaylistList } from '/@/renderer/features/sidebar/components/sidebar-playlist-list';
import { useContainerQuery } from '/@/renderer/hooks';
@@ -92,49 +67,6 @@ const SidebarImage = styled.img`
background: var(--placeholder-bg);
`;
-const sidebarItemMap = {
- [AppRoute.HOME]: {
- activeIcon: RiHome6Fill,
- icon: RiHome6Line,
- },
- [AppRoute.LIBRARY_ALBUMS]: {
- activeIcon: RiAlbumFill,
- icon: RiAlbumLine,
- },
- [AppRoute.LIBRARY_ALBUM_ARTISTS]: {
- activeIcon: RiUserVoiceFill,
- icon: RiUserVoiceLine,
- },
- [AppRoute.PLAYLISTS]: {
- activeIcon: RiPlayListFill,
- icon: RiPlayListLine,
- },
- [AppRoute.LIBRARY_SONGS]: {
- activeIcon: RiMusic2Fill,
- icon: RiMusic2Line,
- },
- [AppRoute.LIBRARY_FOLDERS]: {
- activeIcon: RiFolder3Fill,
- icon: RiFolder3Line,
- },
- [AppRoute.LIBRARY_GENRES]: {
- activeIcon: RiFlag2Fill,
- icon: RiFlagLine,
- },
- [generatePath(AppRoute.SEARCH, { itemType: LibraryItem.SONG })]: {
- activeIcon: RiSearchFill,
- icon: RiSearchLine,
- },
- [AppRoute.SETTINGS]: {
- activeIcon: RiSettings2Fill,
- icon: RiSettings2Line,
- },
- [AppRoute.NOW_PLAYING]: {
- activeIcon: RiPlayFill,
- icon: RiPlayLine,
- },
-};
-
export const Sidebar = () => {
const location = useLocation();
const sidebar = useSidebarStore();
@@ -180,17 +112,13 @@ export const Sidebar = () => {
const { sidebarItems } = useGeneralSettings();
- const sidebarItemsWithRoute: (SidebarItemType & {
- activeIcon: IconType;
- icon: IconType;
- })[] = useMemo(() => {
+ const sidebarItemsWithRoute: SidebarItemType[] = useMemo(() => {
if (!sidebarItems) return [];
const items = sidebarItems
.filter((item) => !item.disabled)
.map((item) => ({
...item,
- ...sidebarItemMap[item.route as keyof typeof sidebarItemMap],
}));
return items;
@@ -214,21 +142,23 @@ export const Sidebar = () => {
sx={{ maxHeight: showImage ? `calc(100% - ${sidebar.leftWidth})` : '100%' }}
>
- {sidebarItemsWithRoute.map((item) => (
-
-
- {location.pathname === item.route ? (
-
- ) : (
-
- )}
- {item.label}
-
-
- ))}
+ {sidebarItemsWithRoute.map((item) => {
+ return (
+
+
+
+ {item.label}
+
+
+ );
+ })}