{isWaveform ? (
-
+
}>
+
+
) : (
)}
diff --git a/src/renderer/features/player/components/playerbar-slider.tsx b/src/renderer/features/player/components/playerbar-slider.tsx
index 8a36b84bc..0d58f8933 100644
--- a/src/renderer/features/player/components/playerbar-slider.tsx
+++ b/src/renderer/features/player/components/playerbar-slider.tsx
@@ -1,8 +1,8 @@
import formatDuration from 'format-duration';
+import { lazy, Suspense } from 'react';
import { PlayerbarSeekSlider } from './playerbar-seek-slider';
import styles from './playerbar-slider.module.css';
-import { PlayerbarWaveform } from './playerbar-waveform';
import { useRemote } from '/@/renderer/features/remote/hooks/use-remote';
import {
@@ -13,9 +13,16 @@ import {
} from '/@/renderer/store';
import { PlayerbarSliderType, usePlayerbarSlider } from '/@/renderer/store/settings.store';
import { Slider, SliderProps } from '/@/shared/components/slider/slider';
+import { Spinner } from '/@/shared/components/spinner/spinner';
import { Text } from '/@/shared/components/text/text';
import { PlaybackSelectors } from '/@/shared/constants/playback-selectors';
+const PlayerbarWaveform = lazy(() =>
+ import('./playerbar-waveform').then((module) => ({
+ default: module.PlayerbarWaveform,
+ })),
+);
+
export const PlayerbarSlider = () => {
const currentSong = usePlayerSong();
const playerbarSlider = usePlayerbarSlider();
@@ -51,7 +58,9 @@ export const PlayerbarSlider = () => {
{isWaveform ? (
-
+
}>
+
+
) : (
)}
diff --git a/src/renderer/features/player/components/playerbar.tsx b/src/renderer/features/player/components/playerbar.tsx
index 89adccbd0..cc56ffad7 100644
--- a/src/renderer/features/player/components/playerbar.tsx
+++ b/src/renderer/features/player/components/playerbar.tsx
@@ -1,13 +1,19 @@
import clsx from 'clsx';
-import { MouseEvent } from 'react';
+import { lazy, MouseEvent, Suspense } from 'react';
import styles from './playerbar.module.css';
import { CenterControls } from '/@/renderer/features/player/components/center-controls';
import { LeftControls } from '/@/renderer/features/player/components/left-controls';
-import { MobilePlayerbar } from '/@/renderer/features/player/components/mobile-playerbar';
import { RightControls } from '/@/renderer/features/player/components/right-controls';
import { useIsMobile } from '/@/renderer/hooks/use-is-mobile';
+import { Spinner } from '/@/shared/components/spinner/spinner';
+
+const MobilePlayerbar = lazy(() =>
+ import('./mobile-playerbar').then((module) => ({
+ default: module.MobilePlayerbar,
+ })),
+);
import { useFullScreenPlayerStore, useSetFullScreenPlayerStore } from '/@/renderer/store';
import { usePlayerbarOpenDrawer } from '/@/renderer/store';
import { PlaybackSelectors } from '/@/shared/constants/playback-selectors';
@@ -24,7 +30,11 @@ export const Playerbar = () => {
};
if (isMobile) {
- return
;
+ return (
+
}>
+
+
+ );
}
return (
diff --git a/src/renderer/features/playlists/components/playlist-detail-song-list-content.tsx b/src/renderer/features/playlists/components/playlist-detail-song-list-content.tsx
index a8c81da23..8243be7f6 100644
--- a/src/renderer/features/playlists/components/playlist-detail-song-list-content.tsx
+++ b/src/renderer/features/playlists/components/playlist-detail-song-list-content.tsx
@@ -2,8 +2,6 @@ import { useQueryClient, useSuspenseQuery } from '@tanstack/react-query';
import { lazy, Suspense, useEffect, useMemo, useRef, useState } from 'react';
import { useParams } from 'react-router';
-import { PlaylistDetailSongListEditTable } from './playlist-detail-song-list-table';
-
import { ItemListHandle } from '/@/renderer/components/item-list/types';
import { useListContext } from '/@/renderer/context/list-context';
import { eventEmitter } from '/@/renderer/events/event-emitter';
@@ -21,6 +19,14 @@ const PlaylistDetailSongListTable = lazy(() =>
),
);
+const PlaylistDetailSongListEditTable = lazy(() =>
+ import('/@/renderer/features/playlists/components/playlist-detail-song-list-table').then(
+ (module) => ({
+ default: module.PlaylistDetailSongListEditTable,
+ }),
+ ),
+);
+
const PlaylistDetailSongListGrid = lazy(() =>
import('/@/renderer/features/playlists/components/playlist-detail-song-list-grid').then(
(module) => ({
diff --git a/src/renderer/features/playlists/components/update-playlist-form.tsx b/src/renderer/features/playlists/components/update-playlist-form.tsx
index 0640f0c0f..dd5730505 100644
--- a/src/renderer/features/playlists/components/update-playlist-form.tsx
+++ b/src/renderer/features/playlists/components/update-playlist-form.tsx
@@ -1,9 +1,8 @@
-import { closeModal, ContextModalProps, openContextModal } from '@mantine/modals';
+import { closeModal, ContextModalProps } from '@mantine/modals';
import { useQuery } from '@tanstack/react-query';
import { t } from 'i18next';
import { useTranslation } from 'react-i18next';
-import i18n from '/@/i18n/i18n';
import { useUpdatePlaylist } from '/@/renderer/features/playlists/mutations/update-playlist-mutation';
import { sharedQueries } from '/@/renderer/features/shared/api/shared-api';
import { useCurrentServer, useCurrentServerId, usePermissions } from '/@/renderer/store';
@@ -17,7 +16,6 @@ import { TextInput } from '/@/shared/components/text-input/text-input';
import { toast } from '/@/shared/components/toast/toast';
import { useForm } from '/@/shared/hooks/use-form';
import {
- Playlist,
ServerType,
SortOrder,
UpdatePlaylistBody,
@@ -167,24 +165,3 @@ const OwnerSelect = ({ form }: { form: ReturnType
);
};
-
-export const openUpdatePlaylistModal = async (args: { playlist: Playlist }) => {
- const { playlist } = args;
-
- openContextModal({
- innerProps: {
- body: {
- comment: playlist?.description || undefined,
- genres: playlist?.genres,
- name: playlist?.name,
- ownerId: playlist?.ownerId || undefined,
- public: playlist?.public || false,
- queryBuilderRules: playlist?.rules || undefined,
- sync: playlist?.sync || undefined,
- },
- query: { id: playlist?.id },
- },
- modalKey: 'updatePlaylist',
- title: i18n.t('form.editPlaylist.title', { postProcess: 'titleCase' }) as string,
- });
-};
diff --git a/src/renderer/features/playlists/components/update-playlist-modal.ts b/src/renderer/features/playlists/components/update-playlist-modal.ts
new file mode 100644
index 000000000..fff8c95bf
--- /dev/null
+++ b/src/renderer/features/playlists/components/update-playlist-modal.ts
@@ -0,0 +1,25 @@
+import { openContextModal } from '@mantine/modals';
+
+import i18n from '/@/i18n/i18n';
+import { Playlist } from '/@/shared/types/domain-types';
+
+export const openUpdatePlaylistModal = async (args: { playlist: Playlist }) => {
+ const { playlist } = args;
+
+ openContextModal({
+ innerProps: {
+ body: {
+ comment: playlist?.description || undefined,
+ genres: playlist?.genres,
+ name: playlist?.name,
+ ownerId: playlist?.ownerId || undefined,
+ public: playlist?.public || false,
+ queryBuilderRules: playlist?.rules || undefined,
+ sync: playlist?.sync || undefined,
+ },
+ query: { id: playlist?.id },
+ },
+ modalKey: 'updatePlaylist',
+ title: i18n.t('form.editPlaylist.title', { postProcess: 'titleCase' }) as string,
+ });
+};
diff --git a/src/renderer/features/settings/components/playback/mpv-properties.ts b/src/renderer/features/settings/components/playback/mpv-properties.ts
new file mode 100644
index 000000000..af3252b46
--- /dev/null
+++ b/src/renderer/features/settings/components/playback/mpv-properties.ts
@@ -0,0 +1,44 @@
+import type { SettingsState } from '/@/renderer/store/settings.store';
+
+export const getMpvSetting = (
+ key: keyof SettingsState['playback']['mpvProperties'],
+ value: any,
+) => {
+ switch (key) {
+ case 'audioExclusiveMode':
+ return { 'audio-exclusive': value || 'no' };
+ case 'audioSampleRateHz':
+ return { 'audio-samplerate': value };
+ case 'gaplessAudio':
+ return { 'gapless-audio': value || 'weak' };
+ case 'replayGainClip':
+ return { 'replaygain-clip': value || 'no' };
+ case 'replayGainFallbackDB':
+ return { 'replaygain-fallback': value };
+ case 'replayGainMode':
+ return { replaygain: value || 'no' };
+ case 'replayGainPreampDB':
+ return { 'replaygain-preamp': value || 0 };
+ default:
+ return { 'audio-format': value };
+ }
+};
+
+export const getMpvProperties = (settings: SettingsState['playback']['mpvProperties']) => {
+ const properties: Record
= {
+ 'audio-exclusive': settings.audioExclusiveMode || 'no',
+ 'audio-samplerate':
+ settings.audioSampleRateHz === 0 ? undefined : settings.audioSampleRateHz,
+ 'gapless-audio': settings.gaplessAudio || 'weak',
+ replaygain: settings.replayGainMode || 'no',
+ 'replaygain-clip': settings.replayGainClip || 'no',
+ 'replaygain-fallback': settings.replayGainFallbackDB,
+ 'replaygain-preamp': settings.replayGainPreampDB || 0,
+ };
+
+ Object.keys(properties).forEach((key) =>
+ properties[key] === undefined ? delete properties[key] : {},
+ );
+
+ return properties;
+};
diff --git a/src/renderer/features/settings/components/playback/mpv-settings.tsx b/src/renderer/features/settings/components/playback/mpv-settings.tsx
index 6f1589255..c54e17bee 100644
--- a/src/renderer/features/settings/components/playback/mpv-settings.tsx
+++ b/src/renderer/features/settings/components/playback/mpv-settings.tsx
@@ -2,6 +2,8 @@ import isElectron from 'is-electron';
import { memo, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
+import { getMpvSetting } from './mpv-properties';
+
import { eventEmitter } from '/@/renderer/events/event-emitter';
import { usePlayer } from '/@/renderer/features/player/context/player-context';
import {
@@ -27,49 +29,6 @@ import { PlayerType } from '/@/shared/types/types';
const localSettings = isElectron() ? window.api.localSettings : null;
const mpvPlayer = isElectron() ? window.api.mpvPlayer : null;
-export const getMpvSetting = (
- key: keyof SettingsState['playback']['mpvProperties'],
- value: any,
-) => {
- switch (key) {
- case 'audioExclusiveMode':
- return { 'audio-exclusive': value || 'no' };
- case 'audioSampleRateHz':
- return { 'audio-samplerate': value };
- case 'gaplessAudio':
- return { 'gapless-audio': value || 'weak' };
- case 'replayGainClip':
- return { 'replaygain-clip': value || 'no' };
- case 'replayGainFallbackDB':
- return { 'replaygain-fallback': value };
- case 'replayGainMode':
- return { replaygain: value || 'no' };
- case 'replayGainPreampDB':
- return { 'replaygain-preamp': value || 0 };
- default:
- return { 'audio-format': value };
- }
-};
-
-export const getMpvProperties = (settings: SettingsState['playback']['mpvProperties']) => {
- const properties: Record = {
- 'audio-exclusive': settings.audioExclusiveMode || 'no',
- 'audio-samplerate':
- settings.audioSampleRateHz === 0 ? undefined : settings.audioSampleRateHz,
- 'gapless-audio': settings.gaplessAudio || 'weak',
- replaygain: settings.replayGainMode || 'no',
- 'replaygain-clip': settings.replayGainClip || 'no',
- 'replaygain-fallback': settings.replayGainFallbackDB,
- 'replaygain-preamp': settings.replayGainPreampDB || 0,
- };
-
- Object.keys(properties).forEach((key) =>
- properties[key] === undefined ? delete properties[key] : {},
- );
-
- return properties;
-};
-
export const MpvSettings = memo(() => {
const { t } = useTranslation();
const settings = usePlaybackSettings();
diff --git a/src/renderer/features/settings/components/settings-content.tsx b/src/renderer/features/settings/components/settings-content.tsx
index 74fd36079..1b39660aa 100644
--- a/src/renderer/features/settings/components/settings-content.tsx
+++ b/src/renderer/features/settings/components/settings-content.tsx
@@ -1,15 +1,41 @@
import isElectron from 'is-electron';
+import { lazy, Suspense } from 'react';
import { useTranslation } from 'react-i18next';
-import { AdvancedTab } from '/@/renderer/features/settings/components/advanced/advanced-tab';
-import { GeneralTab } from '/@/renderer/features/settings/components/general/general-tab';
-import { HotkeysTab } from '/@/renderer/features/settings/components/hotkeys/hotkeys-tab';
-import { PlaybackTab } from '/@/renderer/features/settings/components/playback/playback-tab';
-import { WindowTab } from '/@/renderer/features/settings/components/window/window-tab';
import { LibraryContainer } from '/@/renderer/features/shared/components/library-container';
import { useSettingsStore, useSettingsStoreActions } from '/@/renderer/store/settings.store';
import { Tabs } from '/@/shared/components/tabs/tabs';
+const GeneralTab = lazy(() =>
+ import('/@/renderer/features/settings/components/general/general-tab').then((module) => ({
+ default: module.GeneralTab,
+ })),
+);
+
+const PlaybackTab = lazy(() =>
+ import('/@/renderer/features/settings/components/playback/playback-tab').then((module) => ({
+ default: module.PlaybackTab,
+ })),
+);
+
+const HotkeysTab = lazy(() =>
+ import('/@/renderer/features/settings/components/hotkeys/hotkeys-tab').then((module) => ({
+ default: module.HotkeysTab,
+ })),
+);
+
+const WindowTab = lazy(() =>
+ import('/@/renderer/features/settings/components/window/window-tab').then((module) => ({
+ default: module.WindowTab,
+ })),
+);
+
+const AdvancedTab = lazy(() =>
+ import('/@/renderer/features/settings/components/advanced/advanced-tab').then((module) => ({
+ default: module.AdvancedTab,
+ })),
+);
+
export const SettingsContent = () => {
const { t } = useTranslation();
const currentTab = useSettingsStore((state) => state.tab);
@@ -45,21 +71,31 @@ export const SettingsContent = () => {
-
+
+
+
-
+
+
+
-
+
+
+
{isElectron() && (
-
+
+
+
)}
-
+
+
+
diff --git a/src/renderer/features/settings/routes/settings-route.tsx b/src/renderer/features/settings/routes/settings-route.tsx
index b3a24b708..d24743d63 100644
--- a/src/renderer/features/settings/routes/settings-route.tsx
+++ b/src/renderer/features/settings/routes/settings-route.tsx
@@ -1,12 +1,17 @@
-import { useState } from 'react';
+import { lazy, Suspense, 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';
import { AnimatedPage } from '/@/renderer/features/shared/components/animated-page';
import { LibraryContainer } from '/@/renderer/features/shared/components/library-container';
import { Flex } from '/@/shared/components/flex/flex';
+const SettingsHeader = lazy(() =>
+ import('/@/renderer/features/settings/components/settings-header').then((module) => ({
+ default: module.SettingsHeader,
+ })),
+);
+
const SettingsRoute = () => {
const [search, setSearch] = useState('');
@@ -15,7 +20,9 @@ const SettingsRoute = () => {