mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 04:20:12 +02:00
move settings page to modal instead of route
This commit is contained in:
@@ -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',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 />}
|
||||||
|
|||||||
Reference in New Issue
Block a user