move settings page to modal instead of route

This commit is contained in:
jeffvli
2025-11-23 00:49:39 -08:00
parent 6d0f80f06a
commit 54a8c8c3a4
6 changed files with 85 additions and 55 deletions
@@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next';
import { useNavigate } from 'react-router'; import { useNavigate } from 'react-router';
import { Command, CommandPalettePages } from '/@/renderer/features/search/components/command'; import { Command, CommandPalettePages } from '/@/renderer/features/search/components/command';
import { openSettingsModal } from '/@/renderer/features/settings/utils/open-settings-modal';
import { AppRoute } from '/@/renderer/router/routes'; import { AppRoute } from '/@/renderer/router/routes';
interface GoToCommandsProps { interface GoToCommandsProps {
@@ -34,7 +35,14 @@ export const GoToCommands = ({ handleClose, setPages, setQuery }: GoToCommandsPr
<Command.Item onSelect={() => goTo(AppRoute.SEARCH)}> <Command.Item onSelect={() => goTo(AppRoute.SEARCH)}>
{t('page.sidebar.search', { postProcess: 'titleCase' })} {t('page.sidebar.search', { postProcess: 'titleCase' })}
</Command.Item> </Command.Item>
<Command.Item onSelect={() => goTo(AppRoute.SETTINGS)}> <Command.Item
onSelect={() => {
openSettingsModal();
handleClose();
setPages([CommandPalettePages.HOME]);
setQuery('');
}}
>
{t('page.sidebar.settings', { postProcess: 'titleCase' })} {t('page.sidebar.settings', { postProcess: 'titleCase' })}
</Command.Item> </Command.Item>
</Command.Group> </Command.Group>
@@ -2,6 +2,7 @@ import isElectron from 'is-electron';
import { lazy } from 'react'; import { lazy } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { LibraryContainer } from '/@/renderer/features/shared/components/library-container';
import { useSettingsStore, useSettingsStoreActions } from '/@/renderer/store/settings.store'; import { useSettingsStore, useSettingsStoreActions } from '/@/renderer/store/settings.store';
import { Tabs } from '/@/shared/components/tabs/tabs'; import { Tabs } from '/@/shared/components/tabs/tabs';
@@ -41,51 +42,53 @@ export const SettingsContent = () => {
const { setSettings } = useSettingsStoreActions(); const { setSettings } = useSettingsStoreActions();
return ( return (
<div style={{ height: '100%', overflow: 'scroll', padding: '1rem', width: '100%' }}> <LibraryContainer>
<Tabs <div style={{ height: '100%', overflow: 'scroll', padding: '1rem', width: '100%' }}>
keepMounted={false} <Tabs
onChange={(e) => e && setSettings({ tab: e })} keepMounted={false}
orientation="horizontal" onChange={(e) => e && setSettings({ tab: e })}
value={currentTab} orientation="horizontal"
variant="default" value={currentTab}
> variant="default"
<Tabs.List> >
<Tabs.Tab value="general"> <Tabs.List>
{t('page.setting.generalTab', { postProcess: 'sentenceCase' })} <Tabs.Tab value="general">
</Tabs.Tab> {t('page.setting.generalTab', { postProcess: 'sentenceCase' })}
<Tabs.Tab value="playback">
{t('page.setting.playbackTab', { postProcess: 'sentenceCase' })}
</Tabs.Tab>
<Tabs.Tab value="hotkeys">
{t('page.setting.hotkeysTab', { postProcess: 'sentenceCase' })}
</Tabs.Tab>
{isElectron() && (
<Tabs.Tab value="window">
{t('page.setting.windowTab', { postProcess: 'sentenceCase' })}
</Tabs.Tab> </Tabs.Tab>
)} <Tabs.Tab value="playback">
<Tabs.Tab value="advanced"> {t('page.setting.playbackTab', { postProcess: 'sentenceCase' })}
{t('page.setting.advanced', { postProcess: 'sentenceCase' })} </Tabs.Tab>
</Tabs.Tab> <Tabs.Tab value="hotkeys">
</Tabs.List> {t('page.setting.hotkeysTab', { postProcess: 'sentenceCase' })}
<Tabs.Panel value="general"> </Tabs.Tab>
<GeneralTab /> {isElectron() && (
</Tabs.Panel> <Tabs.Tab value="window">
<Tabs.Panel value="playback"> {t('page.setting.windowTab', { postProcess: 'sentenceCase' })}
<PlaybackTab /> </Tabs.Tab>
</Tabs.Panel> )}
<Tabs.Panel value="hotkeys"> <Tabs.Tab value="advanced">
<HotkeysTab /> {t('page.setting.advanced', { postProcess: 'sentenceCase' })}
</Tabs.Panel> </Tabs.Tab>
{isElectron() && ( </Tabs.List>
<Tabs.Panel value="window"> <Tabs.Panel value="general">
<ApplicationTab /> <GeneralTab />
</Tabs.Panel> </Tabs.Panel>
)} <Tabs.Panel value="playback">
<Tabs.Panel value="advanced"> <PlaybackTab />
<AdvancedTab /> </Tabs.Panel>
</Tabs.Panel> <Tabs.Panel value="hotkeys">
</Tabs> <HotkeysTab />
</div> </Tabs.Panel>
{isElectron() && (
<Tabs.Panel value="window">
<ApplicationTab />
</Tabs.Panel>
)}
<Tabs.Panel value="advanced">
<AdvancedTab />
</Tabs.Panel>
</Tabs>
</div>
</LibraryContainer>
); );
}; };
@@ -0,0 +1,16 @@
import { useState } from 'react';
import { SettingsContent } from '/@/renderer/features/settings/components/settings-content';
import { SettingsHeader } from '/@/renderer/features/settings/components/settings-header';
import { SettingSearchContext } from '/@/renderer/features/settings/context/search-context';
export const SettingsModal = () => {
const [search, setSearch] = useState('');
return (
<SettingSearchContext.Provider value={search}>
<SettingsHeader setSearch={setSearch} />
<SettingsContent />
</SettingSearchContext.Provider>
);
};
@@ -0,0 +1,9 @@
import { openContextModal } from '@mantine/modals';
export const openSettingsModal = () => {
openContextModal({
fullScreen: true,
innerProps: {},
modalKey: 'settings',
});
};
@@ -5,7 +5,7 @@ import { Link, useNavigate } from 'react-router';
import packageJson from '../../../../../package.json'; import packageJson from '../../../../../package.json';
import { AppRoute } from '/@/renderer/router/routes'; import { openSettingsModal } from '/@/renderer/features/settings/utils/open-settings-modal';
import { useAppStore, useAppStoreActions, useSidebarStore } from '/@/renderer/store'; import { useAppStore, useAppStoreActions, useSidebarStore } from '/@/renderer/store';
import { DropdownMenu, MenuItemProps } from '/@/shared/components/dropdown-menu/dropdown-menu'; import { DropdownMenu, MenuItemProps } from '/@/shared/components/dropdown-menu/dropdown-menu';
import { Icon } from '/@/shared/components/icon/icon'; import { Icon } from '/@/shared/components/icon/icon';
@@ -181,11 +181,10 @@ export const AppMenu = () => {
type: 'divider', type: 'divider',
}, },
{ {
component: Link,
icon: 'settings', icon: 'settings',
id: 'settings', id: 'settings',
label: t('page.appMenu.settings', { postProcess: 'sentenceCase' }), label: t('page.appMenu.settings', { postProcess: 'sentenceCase' }),
to: AppRoute.SETTINGS, onClick: openSettingsModal,
type: 'item', type: 'item',
}, },
{ {
+2 -7
View File
@@ -3,6 +3,7 @@ import { HashRouter, Route, Routes } from 'react-router';
import { RouterErrorBoundary } from '/@/renderer/components/error-boundary/router-error-boundary'; import { RouterErrorBoundary } from '/@/renderer/components/error-boundary/router-error-boundary';
import { AddToPlaylistContextModal } from '/@/renderer/features/playlists/components/add-to-playlist-context-modal'; import { AddToPlaylistContextModal } from '/@/renderer/features/playlists/components/add-to-playlist-context-modal';
import { SettingsModal } from '/@/renderer/features/settings/components/settings-modal';
import { ShareItemContextModal } from '/@/renderer/features/sharing/components/share-item-context-modal'; import { ShareItemContextModal } from '/@/renderer/features/sharing/components/share-item-context-modal';
import { ResponsiveLayout } from '/@/renderer/layouts/responsive-layout'; import { ResponsiveLayout } from '/@/renderer/layouts/responsive-layout';
import { AppOutlet } from '/@/renderer/router/app-outlet'; import { AppOutlet } from '/@/renderer/router/app-outlet';
@@ -62,8 +63,6 @@ const DummyAlbumDetailRoute = lazy(
const GenreListRoute = lazy(() => import('/@/renderer/features/genres/routes/genre-list-route')); const GenreListRoute = lazy(() => import('/@/renderer/features/genres/routes/genre-list-route'));
const SettingsRoute = lazy(() => import('/@/renderer/features/settings/routes/settings-route'));
const SearchRoute = lazy(() => import('/@/renderer/features/search/routes/search-route')); const SearchRoute = lazy(() => import('/@/renderer/features/search/routes/search-route'));
const RouteErrorBoundary = lazy( const RouteErrorBoundary = lazy(
@@ -78,6 +77,7 @@ export const AppRouter = () => {
modals={{ modals={{
addToPlaylist: AddToPlaylistContextModal, addToPlaylist: AddToPlaylistContextModal,
base: BaseContextModal, base: BaseContextModal,
settings: SettingsModal,
shareItem: ShareItemContextModal, shareItem: ShareItemContextModal,
}} }}
> >
@@ -100,11 +100,6 @@ export const AppRouter = () => {
errorElement={<RouteErrorBoundary />} errorElement={<RouteErrorBoundary />}
path={AppRoute.SEARCH} path={AppRoute.SEARCH}
/> />
<Route
element={<SettingsRoute />}
errorElement={<RouteErrorBoundary />}
path={AppRoute.SETTINGS}
/>
<Route <Route
element={<NowPlayingRoute />} element={<NowPlayingRoute />}
errorElement={<RouteErrorBoundary />} errorElement={<RouteErrorBoundary />}