diff --git a/src/renderer/features/settings/components/general/general-tab.tsx b/src/renderer/features/settings/components/general/general-tab.tsx
index b178067b..48968289 100644
--- a/src/renderer/features/settings/components/general/general-tab.tsx
+++ b/src/renderer/features/settings/components/general/general-tab.tsx
@@ -1,6 +1,7 @@
import { Divider, Stack } from '@mantine/core';
import { ApplicationSettings } from '/@/renderer/features/settings/components/general/application-settings';
import { ControlSettings } from '/@/renderer/features/settings/components/general/control-settings';
+import { SidebarSettings } from '/@/renderer/features/settings/components/general/sidebar-settings';
import { ThemeSettings } from '/@/renderer/features/settings/components/general/theme-settings';
export const GeneralTab = () => {
@@ -11,6 +12,8 @@ export const GeneralTab = () => {
+
+
);
};
diff --git a/src/renderer/features/settings/components/general/sidebar-settings.tsx b/src/renderer/features/settings/components/general/sidebar-settings.tsx
new file mode 100644
index 00000000..e7b965e8
--- /dev/null
+++ b/src/renderer/features/settings/components/general/sidebar-settings.tsx
@@ -0,0 +1,119 @@
+import { useCallback, useState } from 'react';
+import { Group } from '@mantine/core';
+import { Reorder, useDragControls } from 'framer-motion';
+import isEqual from 'lodash/isEqual';
+import { MdDragIndicator } from 'react-icons/md';
+import { Button, Checkbox, Switch } from '/@/renderer/components';
+import { useSettingsStoreActions, useGeneralSettings } from '../../../../store/settings.store';
+import { SettingsOptions } from '/@/renderer/features/settings/components/settings-option';
+
+const DragHandle = ({ dragControls }: any) => {
+ return (
+ dragControls.start(event)}
+ />
+ );
+};
+
+interface SidebarItem {
+ disabled: boolean;
+ id: string;
+}
+
+interface DraggableSidebarItemProps {
+ handleChangeDisabled: (id: string, e: boolean) => void;
+ item: SidebarItem;
+}
+
+const DraggableSidebarItem = ({ item, handleChangeDisabled }: DraggableSidebarItemProps) => {
+ const dragControls = useDragControls();
+
+ return (
+
+
+ handleChangeDisabled(item.id, e.target.checked)}
+ />
+
+ {item.id}
+
+
+ );
+};
+
+export const SidebarSettings = () => {
+ const { sidebarItems } = useGeneralSettings();
+ const { setSidebarItems } = useSettingsStoreActions();
+
+ const [localSidebarItems, setLocalSidebarItems] = useState(sidebarItems);
+
+ const handleSave = () => {
+ setSidebarItems(localSidebarItems);
+ };
+
+ const handleChangeDisabled = useCallback((id: string, e: boolean) => {
+ setLocalSidebarItems((items) =>
+ items.map((item) => {
+ if (item.id === id) {
+ return {
+ ...item,
+ disabled: !e,
+ };
+ }
+
+ return item;
+ }),
+ );
+ }, []);
+
+ const isSaveButtonDisabled = isEqual(sidebarItems, localSidebarItems);
+
+ return (
+ <>
+ }
+ description="Show playlist list in sidebar"
+ title="Sidebar playlist list"
+ />
+
+ Save sidebar configuration
+
+ }
+ description="Select the items and order in which they appear in the sidebar"
+ title="Sidebar configuration"
+ />
+
+ {localSidebarItems.map((item) => (
+
+ ))}
+
+ >
+ );
+};
diff --git a/src/renderer/store/settings.store.ts b/src/renderer/store/settings.store.ts
index 1cfff905..9af08e63 100644
--- a/src/renderer/store/settings.store.ts
+++ b/src/renderer/store/settings.store.ts
@@ -7,6 +7,7 @@ import { create } from 'zustand';
import { devtools, persist } from 'zustand/middleware';
import { immer } from 'zustand/middleware/immer';
import { shallow } from 'zustand/shallow';
+import { AppRoute } from '/@/renderer/router/routes';
import { AppTheme } from '/@/renderer/themes/types';
import {
TableColumn,
@@ -18,6 +19,28 @@ import {
Platform,
} from '/@/renderer/types';
+export type SidebarItemType = {
+ disabled: boolean;
+ id: string;
+ label: string;
+ route: AppRoute;
+};
+
+export const sidebarItems = [
+ { disabled: false, id: 'Home', label: 'Home', route: AppRoute.HOME },
+ { disabled: false, id: 'Albums', label: 'Albums', route: AppRoute.LIBRARY_ALBUMS },
+ { disabled: false, id: 'Tracks', label: 'Tracks', route: AppRoute.LIBRARY_SONGS },
+ {
+ disabled: false,
+ id: 'Album Artists',
+ label: 'Album Artists',
+ route: AppRoute.LIBRARY_ALBUM_ARTISTS,
+ },
+ { disabled: false, id: 'Genres', label: 'Genres', route: AppRoute.LIBRARY_GENRES },
+ { disabled: false, id: 'Folders', label: 'Folders', route: AppRoute.LIBRARY_FOLDERS },
+ { disabled: false, id: 'Playlists', label: 'Playlists', route: AppRoute.PLAYLISTS },
+];
+
export type PersistedTableColumn = {
column: TableColumn;
extraProps?: Partial;
@@ -72,6 +95,8 @@ export interface SettingsState {
resume: boolean;
showQueueDrawerButton: boolean;
sideQueueType: SideQueueType;
+ sidebarItems: SidebarItemType[];
+ sidebarPlaylistList: boolean;
skipButtons: {
enabled: boolean;
skipBackwardSeconds: number;
@@ -121,6 +146,7 @@ export interface SettingsSlice extends SettingsState {
actions: {
reset: () => void;
setSettings: (data: Partial) => void;
+ setSidebarItems: (items: SidebarItemType[]) => void;
};
}
@@ -132,6 +158,8 @@ const initialState: SettingsState = {
resume: false,
showQueueDrawerButton: false,
sideQueueType: 'sideQueue',
+ sidebarItems,
+ sidebarPlaylistList: true,
skipButtons: {
enabled: false,
skipBackwardSeconds: 5,
@@ -338,6 +366,11 @@ export const useSettingsStore = create()(
setSettings: (data) => {
set({ ...get(), ...data });
},
+ setSidebarItems: (items: SidebarItemType[]) => {
+ set((state) => {
+ state.general.sidebarItems = items;
+ });
+ },
},
...initialState,
})),
@@ -373,3 +406,12 @@ export const useHotkeySettings = () => useSettingsStore((state) => state.hotkeys
export const useMpvSettings = () =>
useSettingsStore((state) => state.playback.mpvProperties, shallow);
+
+export const useMainSettings = () =>
+ useSettingsStore(
+ (state) => ({
+ showQueueDrawerButton: state.general.showQueueDrawerButton,
+ sideQueueType: state.general.sideQueueType,
+ }),
+ shallow,
+ );