add private mode toggle to app menu

This commit is contained in:
Lyall 2025-07-31 16:12:03 +01:00
parent 5ab0eba23e
commit a44ad66d46
6 changed files with 51 additions and 13 deletions

View file

@ -5,6 +5,7 @@ import { useCallback, useEffect, useState } from 'react';
import { controller } from '/@/renderer/api/controller';
import {
getServerById,
useAppStore,
useDiscordSetttings,
useGeneralSettings,
usePlayerStore,
@ -17,6 +18,7 @@ const discordRpc = isElectron() ? window.api.discordRpc : null;
export const useDiscordRpc = () => {
const discordSettings = useDiscordSetttings();
const generalSettings = useGeneralSettings();
const { privateMode } = useAppStore();
const [lastUniqueId, setlastUniqueId] = useState('');
const setActivity = useCallback(
@ -139,15 +141,15 @@ export const useDiscordRpc = () => {
);
useEffect(() => {
if (!discordSettings.enabled) return discordRpc?.quit();
if (!discordSettings.enabled || privateMode) return discordRpc?.quit();
return () => {
discordRpc?.quit();
};
}, [discordSettings.clientId, discordSettings.enabled]);
}, [discordSettings.clientId, privateMode, discordSettings.enabled]);
useEffect(() => {
if (!discordSettings.enabled) return;
if (!discordSettings.enabled || privateMode) return;
const unsubSongChange = usePlayerStore.subscribe(
(state) => [state.current.song, state.current.time, state.current.status],
setActivity,
@ -155,5 +157,5 @@ export const useDiscordRpc = () => {
return () => {
unsubSongChange();
};
}, [discordSettings.enabled, setActivity]);
}, [discordSettings.enabled, privateMode, setActivity]);
};

View file

@ -1,8 +1,7 @@
import { useCallback, useEffect, useRef, useState } from 'react';
import { useSendScrobble } from '/@/renderer/features/player/mutations/scrobble-mutation';
import { usePlayerStore } from '/@/renderer/store';
import { usePlaybackSettings } from '/@/renderer/store/settings.store';
import { useAppStore, usePlaybackSettings, usePlayerStore } from '/@/renderer/store';
import { QueueSong, ServerType } from '/@/shared/types/domain-types';
import { PlayerStatus } from '/@/shared/types/types';
@ -59,13 +58,14 @@ const checkScrobbleConditions = (args: {
export const useScrobble = () => {
const scrobbleSettings = usePlaybackSettings().scrobble;
const isScrobbleEnabled = scrobbleSettings?.enabled;
const isPrivateModeEnabled = useAppStore().privateMode;
const sendScrobble = useSendScrobble();
const [isCurrentSongScrobbled, setIsCurrentSongScrobbled] = useState(false);
const handleScrobbleFromSeek = useCallback(
(currentTime: number) => {
if (!isScrobbleEnabled) return;
if (!isScrobbleEnabled || isPrivateModeEnabled) return;
const currentSong = usePlayerStore.getState().current.song;
@ -84,7 +84,7 @@ export const useScrobble = () => {
serverId: currentSong?.serverId,
});
},
[isScrobbleEnabled, sendScrobble],
[isScrobbleEnabled, isPrivateModeEnabled, sendScrobble],
);
const progressIntervalId = useRef<null | ReturnType<typeof setInterval>>(null);
@ -119,7 +119,7 @@ export const useScrobble = () => {
}, 1000);
}
if (!isScrobbleEnabled) return;
if (!isScrobbleEnabled || isPrivateModeEnabled) return;
if (progressIntervalId.current) {
clearInterval(progressIntervalId.current);
@ -201,6 +201,7 @@ export const useScrobble = () => {
scrobbleSettings?.scrobbleAtDuration,
scrobbleSettings?.scrobbleAtPercentage,
isScrobbleEnabled,
isPrivateModeEnabled,
isCurrentSongScrobbled,
sendScrobble,
handleScrobbleFromSeek,
@ -209,7 +210,7 @@ export const useScrobble = () => {
const handleScrobbleFromStatusChange = useCallback(
(current: PlayerEvent, previous: PlayerEvent) => {
if (!isScrobbleEnabled) return;
if (!isScrobbleEnabled || isPrivateModeEnabled) return;
const currentSong = usePlayerStore.getState().current.song;
@ -293,6 +294,7 @@ export const useScrobble = () => {
},
[
isScrobbleEnabled,
isPrivateModeEnabled,
sendScrobble,
handleScrobbleFromSeek,
scrobbleSettings?.scrobbleAtDuration,
@ -306,7 +308,7 @@ export const useScrobble = () => {
// need to perform another check to see if the scrobble conditions are met
const handleScrobbleFromSongRestart = useCallback(
(currentTime: number) => {
if (!isScrobbleEnabled) return;
if (!isScrobbleEnabled || isPrivateModeEnabled) return;
const currentSong = usePlayerStore.getState().current.song;
@ -349,6 +351,7 @@ export const useScrobble = () => {
},
[
isScrobbleEnabled,
isPrivateModeEnabled,
scrobbleSettings?.scrobbleAtDuration,
scrobbleSettings?.scrobbleAtPercentage,
isCurrentSongScrobbled,

View file

@ -10,6 +10,7 @@ import { ServerList } from '/@/renderer/features/servers';
import { EditServerForm } from '/@/renderer/features/servers/components/edit-server-form';
import { AppRoute } from '/@/renderer/router/routes';
import {
useAppStore,
useAppStoreActions,
useAuthStoreActions,
useCurrentServer,
@ -30,7 +31,8 @@ export const AppMenu = () => {
const serverList = useServerList();
const { setCurrentServer } = useAuthStoreActions();
const { collapsed } = useSidebarStore();
const { setSideBar } = useAppStoreActions();
const { privateMode } = useAppStore();
const { setPrivateMode, setSideBar } = useAppStoreActions();
const handleSetCurrentServer = (server: ServerListItem) => {
navigate(AppRoute.HOME);
@ -80,6 +82,14 @@ export const AppMenu = () => {
setSideBar({ collapsed: false });
};
const handlePrivateModeOff = () => {
setPrivateMode(false);
};
const handlePrivateModeOn = () => {
setPrivateMode(true);
};
const handleQuit = () => {
browser?.quit();
};
@ -127,7 +137,18 @@ export const AppMenu = () => {
>
{t('page.appMenu.manageServers', { postProcess: 'sentenceCase' })}
</DropdownMenu.Item>
{privateMode ? (
<DropdownMenu.Item
leftSection={<Icon icon="lockOpen" />}
onClick={handlePrivateModeOff}
>
{t('page.appMenu.privateModeOff', { postProcess: 'sentenceCase' })}
</DropdownMenu.Item>
) : (
<DropdownMenu.Item leftSection={<Icon icon="lock" />} onClick={handlePrivateModeOn}>
{t('page.appMenu.privateModeOn', { postProcess: 'sentenceCase' })}
</DropdownMenu.Item>
)}
<DropdownMenu.Divider />
<DropdownMenu.Label>
{t('page.appMenu.selectServer', { postProcess: 'sentenceCase' })}