chore(orbit): toggle to hide the Psy Orbit topbar trigger in Settings

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-24 19:53:59 +02:00
parent abbf6fc345
commit 7378bdf820
11 changed files with 36 additions and 0 deletions
+3
View File
@@ -3,6 +3,7 @@ import { createPortal } from 'react-dom';
import { Orbit as OrbitIcon, Plus, LogIn, HelpCircle } from 'lucide-react'; import { Orbit as OrbitIcon, Plus, LogIn, HelpCircle } from 'lucide-react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useOrbitStore } from '../store/orbitStore'; import { useOrbitStore } from '../store/orbitStore';
import { useAuthStore } from '../store/authStore';
import { useHelpModalStore } from '../store/helpModalStore'; import { useHelpModalStore } from '../store/helpModalStore';
import OrbitStartModal from './OrbitStartModal'; import OrbitStartModal from './OrbitStartModal';
import OrbitJoinModal from './OrbitJoinModal'; import OrbitJoinModal from './OrbitJoinModal';
@@ -16,6 +17,7 @@ import OrbitJoinModal from './OrbitJoinModal';
export default function OrbitStartTrigger() { export default function OrbitStartTrigger() {
const { t } = useTranslation(); const { t } = useTranslation();
const role = useOrbitStore(s => s.role); const role = useOrbitStore(s => s.role);
const visible = useAuthStore(s => s.showOrbitTrigger);
const [popoverOpen, setPopoverOpen] = useState(false); const [popoverOpen, setPopoverOpen] = useState(false);
const [startOpen, setStartOpen] = useState(false); const [startOpen, setStartOpen] = useState(false);
@@ -42,6 +44,7 @@ export default function OrbitStartTrigger() {
}, [popoverOpen]); }, [popoverOpen]);
if (role !== null) return null; if (role !== null) return null;
if (!visible) return null;
const anchor = btnRef.current?.getBoundingClientRect(); const anchor = btnRef.current?.getBoundingClientRect();
const popoverStyle: React.CSSProperties = anchor const popoverStyle: React.CSSProperties = anchor
+2
View File
@@ -670,6 +670,8 @@ export const deTranslation = {
hiResDesc: "Standardmäßig wird auf 44,1 kHz begrenzt (maximale Stabilität). Nur aktivieren, wenn Hardware und Netzwerk zuverlässig hohe Abtastraten (88,2 kHz+) unterstützen.", hiResDesc: "Standardmäßig wird auf 44,1 kHz begrenzt (maximale Stabilität). Nur aktivieren, wenn Hardware und Netzwerk zuverlässig hohe Abtastraten (88,2 kHz+) unterstützen.",
showArtistImages: 'Künstlerbilder anzeigen', showArtistImages: 'Künstlerbilder anzeigen',
showArtistImagesDesc: 'Lädt und zeigt Künstlerbilder in der Künstlerübersicht. Standardmäßig deaktiviert, um Server-I/O und Netzwerklast bei großen Bibliotheken zu reduzieren.', showArtistImagesDesc: 'Lädt und zeigt Künstlerbilder in der Künstlerübersicht. Standardmäßig deaktiviert, um Server-I/O und Netzwerklast bei großen Bibliotheken zu reduzieren.',
showOrbitTrigger: '„Psy Orbit" im Header zeigen',
showOrbitTriggerDesc: 'Der Kopfzeilen-Button zum Starten oder Beitreten einer gemeinsamen Hör-Session. Ausblenden, wenn du Orbit nicht nutzt — hier lässt er sich jederzeit wieder einschalten.',
showTrayIcon: 'Tray-Icon anzeigen', showTrayIcon: 'Tray-Icon anzeigen',
showTrayIconDesc: 'Psysonic-Icon im System-Tray / in der Menüleiste anzeigen.', showTrayIconDesc: 'Psysonic-Icon im System-Tray / in der Menüleiste anzeigen.',
minimizeToTray: 'Im Tray minimieren', minimizeToTray: 'Im Tray minimieren',
+2
View File
@@ -672,6 +672,8 @@ export const enTranslation = {
hiResDesc: "Forces 44.1 kHz output by default for maximum stability. Enable only if your hardware and network reliably support high sample rates (88.2 kHz+).", hiResDesc: "Forces 44.1 kHz output by default for maximum stability. Enable only if your hardware and network reliably support high sample rates (88.2 kHz+).",
showArtistImages: 'Show Artist Images', showArtistImages: 'Show Artist Images',
showArtistImagesDesc: 'Load and display artist images in the Artists overview. Disabled by default to reduce server disk I/O and network load on large libraries.', showArtistImagesDesc: 'Load and display artist images in the Artists overview. Disabled by default to reduce server disk I/O and network load on large libraries.',
showOrbitTrigger: 'Show "Psy Orbit" in the header',
showOrbitTriggerDesc: 'The top-bar trigger for starting or joining a shared listening session. Hide it if you don\'t use Orbit — you can turn it back on here.',
showTrayIcon: 'Show Tray Icon', showTrayIcon: 'Show Tray Icon',
showTrayIconDesc: 'Display the Psysonic icon in the system notification area / menu bar.', showTrayIconDesc: 'Display the Psysonic icon in the system notification area / menu bar.',
minimizeToTray: 'Minimize to Tray', minimizeToTray: 'Minimize to Tray',
+2
View File
@@ -663,6 +663,8 @@ export const esTranslation = {
hiResDesc: "Fuerza 44.1 kHz de salida por defecto para máxima estabilidad. Habilita solo si tu hardware y red soportan confiablemente altas tasas de muestreo (88.2 kHz+).", hiResDesc: "Fuerza 44.1 kHz de salida por defecto para máxima estabilidad. Habilita solo si tu hardware y red soportan confiablemente altas tasas de muestreo (88.2 kHz+).",
showArtistImages: 'Mostrar Imágenes de Artistas', showArtistImages: 'Mostrar Imágenes de Artistas',
showArtistImagesDesc: 'Carga y muestra imágenes de artistas en el resumen de Artistas. Desactivado por defecto para reducir I/O de disco del servidor y carga de red en bibliotecas grandes.', showArtistImagesDesc: 'Carga y muestra imágenes de artistas en el resumen de Artistas. Desactivado por defecto para reducir I/O de disco del servidor y carga de red en bibliotecas grandes.',
showOrbitTrigger: 'Mostrar "Psy Orbit" en la cabecera',
showOrbitTriggerDesc: 'El botón en la cabecera para iniciar o unirse a una sesión de escucha compartida. Ocúltalo si no usas Orbit — puedes volver a activarlo aquí.',
showTrayIcon: 'Mostrar Icono en Bandeja', showTrayIcon: 'Mostrar Icono en Bandeja',
showTrayIconDesc: 'Muestra el icono de Psysonic en el área de notificación / barra de menú.', showTrayIconDesc: 'Muestra el icono de Psysonic en el área de notificación / barra de menú.',
minimizeToTray: 'Minimizar a Bandeja', minimizeToTray: 'Minimizar a Bandeja',
+2
View File
@@ -660,6 +660,8 @@ export const frTranslation = {
hiResDesc: "Force une sortie à 44,1 kHz par défaut pour une stabilité maximale. N'activer que si le matériel et le réseau prennent en charge les hautes fréquences d'échantillonnage (88,2 kHz+).", hiResDesc: "Force une sortie à 44,1 kHz par défaut pour une stabilité maximale. N'activer que si le matériel et le réseau prennent en charge les hautes fréquences d'échantillonnage (88,2 kHz+).",
showArtistImages: 'Afficher les images d\'artistes', showArtistImages: 'Afficher les images d\'artistes',
showArtistImagesDesc: 'Charge et affiche les images d\'artistes dans la vue d\'ensemble. Désactivé par défaut pour réduire les E/S disque serveur et la charge réseau sur les grandes bibliothèques.', showArtistImagesDesc: 'Charge et affiche les images d\'artistes dans la vue d\'ensemble. Désactivé par défaut pour réduire les E/S disque serveur et la charge réseau sur les grandes bibliothèques.',
showOrbitTrigger: 'Afficher « Psy Orbit » dans l\'en-tête',
showOrbitTriggerDesc: 'Le bouton d\'en-tête pour démarrer ou rejoindre une session d\'écoute partagée. Masque-le si tu n\'utilises pas Orbit — tu peux le réactiver ici.',
showTrayIcon: 'Afficher l\'icône dans la barre système', showTrayIcon: 'Afficher l\'icône dans la barre système',
showTrayIconDesc: 'Affiche l\'icône Psysonic dans la zone de notification / barre des menus.', showTrayIconDesc: 'Affiche l\'icône Psysonic dans la zone de notification / barre des menus.',
minimizeToTray: 'Réduire dans la barre système', minimizeToTray: 'Réduire dans la barre système',
+2
View File
@@ -661,6 +661,8 @@ export const nbTranslation = {
hiResDesc: "Begrenser utdata til 44,1 kHz som standard for maksimal stabilitet. Aktiver kun hvis maskinvare og nettverk støtter høye samplingsrater (88,2 kHz+) pålitelig.", hiResDesc: "Begrenser utdata til 44,1 kHz som standard for maksimal stabilitet. Aktiver kun hvis maskinvare og nettverk støtter høye samplingsrater (88,2 kHz+) pålitelig.",
showArtistImages: 'Vis artistbilder', showArtistImages: 'Vis artistbilder',
showArtistImagesDesc: 'Last inn og vis artistbilder i artistoversikten. Denne er deaktivert som standard, for å redusere disk-I/O og nettverksbelastningen på store biblioteker.', showArtistImagesDesc: 'Last inn og vis artistbilder i artistoversikten. Denne er deaktivert som standard, for å redusere disk-I/O og nettverksbelastningen på store biblioteker.',
showOrbitTrigger: 'Vis «Psy Orbit» i toppen',
showOrbitTriggerDesc: 'Knappen i toppen for å starte eller bli med i en delt lytteøkt. Skjul den hvis du ikke bruker Orbit — du kan slå den på igjen her.',
minimizeToTray: 'Minimer til oppgavelinjen', minimizeToTray: 'Minimer til oppgavelinjen',
minimizeToTrayDesc: 'Når vinduet lukkes, vil Psysonic bli kjørende i oppgavelinjen fremfor å bli avsluttet.', minimizeToTrayDesc: 'Når vinduet lukkes, vil Psysonic bli kjørende i oppgavelinjen fremfor å bli avsluttet.',
preloadMiniPlayer: 'Forhåndslast miniavspiller', preloadMiniPlayer: 'Forhåndslast miniavspiller',
+2
View File
@@ -659,6 +659,8 @@ export const nlTranslation = {
hiResDesc: "Beperkt de uitvoer standaard tot 44,1 kHz voor maximale stabiliteit. Alleen inschakelen als hardware en netwerk hoge samplerates (88,2 kHz+) ondersteunen.", hiResDesc: "Beperkt de uitvoer standaard tot 44,1 kHz voor maximale stabiliteit. Alleen inschakelen als hardware en netwerk hoge samplerates (88,2 kHz+) ondersteunen.",
showArtistImages: 'Artiestafbeeldingen weergeven', showArtistImages: 'Artiestafbeeldingen weergeven',
showArtistImagesDesc: 'Laadt en toont artiestafbeeldingen in het artiestenoverzicht. Standaard uitgeschakeld om server-I/O en netwerkbelasting bij grote bibliotheken te beperken.', showArtistImagesDesc: 'Laadt en toont artiestafbeeldingen in het artiestenoverzicht. Standaard uitgeschakeld om server-I/O en netwerkbelasting bij grote bibliotheken te beperken.',
showOrbitTrigger: '"Psy Orbit" in de kop tonen',
showOrbitTriggerDesc: 'De knop in de kop voor starten of deelnemen aan een gedeelde luistersessie. Verberg hem als je Orbit niet gebruikt — je kunt hem hier weer aanzetten.',
showTrayIcon: 'Tray-pictogram weergeven', showTrayIcon: 'Tray-pictogram weergeven',
showTrayIconDesc: 'Toont het Psysonic-pictogram in het systeemvak / de menubalk.', showTrayIconDesc: 'Toont het Psysonic-pictogram in het systeemvak / de menubalk.',
minimizeToTray: 'Minimaliseren naar systeemvak', minimizeToTray: 'Minimaliseren naar systeemvak',
+2
View File
@@ -692,6 +692,8 @@ export const ruTranslation = {
showArtistImages: 'Фото исполнителей', showArtistImages: 'Фото исполнителей',
showArtistImagesDesc: showArtistImagesDesc:
'Показывать обложки в разделе «Исполнители». По умолчанию выключено — меньше нагрузки на диск и сеть.', 'Показывать обложки в разделе «Исполнители». По умолчанию выключено — меньше нагрузки на диск и сеть.',
showOrbitTrigger: 'Показывать «Psy Orbit» в шапке',
showOrbitTriggerDesc: 'Кнопка в шапке для запуска или присоединения к совместной сессии. Скрой, если не используешь Orbit — здесь же можно включить обратно.',
showTrayIcon: 'Иконка в трее', showTrayIcon: 'Иконка в трее',
showTrayIconDesc: 'Показывать Psysonic в области уведомлений / строке меню.', showTrayIconDesc: 'Показывать Psysonic в области уведомлений / строке меню.',
minimizeToTray: 'Сворачивать в трей', minimizeToTray: 'Сворачивать в трей',
+2
View File
@@ -654,6 +654,8 @@ export const zhTranslation = {
hiResDesc: "默认强制 44.1 kHz 输出以获得最大稳定性。仅在硬件和网络可靠支持高采样率(88.2 kHz+)时启用。", hiResDesc: "默认强制 44.1 kHz 输出以获得最大稳定性。仅在硬件和网络可靠支持高采样率(88.2 kHz+)时启用。",
showArtistImages: '显示艺术家图片', showArtistImages: '显示艺术家图片',
showArtistImagesDesc: '在艺术家概览中加载并显示艺术家图片。默认关闭以减少大型音乐库的服务器磁盘I/O和网络负载。', showArtistImagesDesc: '在艺术家概览中加载并显示艺术家图片。默认关闭以减少大型音乐库的服务器磁盘I/O和网络负载。',
showOrbitTrigger: '在顶栏显示"Psy Orbit"',
showOrbitTriggerDesc: '用于启动或加入共享收听会话的顶栏按钮。如果不使用 Orbit,可以隐藏 — 随时可在此重新开启。',
showTrayIcon: '显示托盘图标', showTrayIcon: '显示托盘图标',
showTrayIconDesc: '在系统通知区域 / 菜单栏显示 Psysonic 图标。', showTrayIconDesc: '在系统通知区域 / 菜单栏显示 Psysonic 图标。',
minimizeToTray: '最小化到托盘', minimizeToTray: '最小化到托盘',
+11
View File
@@ -3326,6 +3326,17 @@ export default function Settings() {
<span className="toggle-track" /> <span className="toggle-track" />
</label> </label>
</div> </div>
<div className="settings-section-divider" />
<div className="settings-toggle-row">
<div>
<div style={{ fontWeight: 500 }}>{t('settings.showOrbitTrigger')}</div>
<div style={{ fontSize: 12, color: 'var(--text-muted)' }}>{t('settings.showOrbitTriggerDesc')}</div>
</div>
<label className="toggle-switch" aria-label={t('settings.showOrbitTrigger')}>
<input type="checkbox" checked={auth.showOrbitTrigger} onChange={e => auth.setShowOrbitTrigger(e.target.checked)} />
<span className="toggle-track" />
</label>
</div>
{!IS_WINDOWS && ( {!IS_WINDOWS && (
<> <>
<div className="settings-section-divider" /> <div className="settings-section-divider" />
+6
View File
@@ -61,6 +61,9 @@ interface AuthState {
showArtistImages: boolean; showArtistImages: boolean;
showTrayIcon: boolean; showTrayIcon: boolean;
minimizeToTray: boolean; minimizeToTray: boolean;
/** Whether the "Psy Orbit" topbar trigger is rendered. Users who never
* touch Orbit can hide it so the header stays uncluttered. */
showOrbitTrigger: boolean;
discordRichPresence: boolean; discordRichPresence: boolean;
enableAppleMusicCoversDiscord: boolean; enableAppleMusicCoversDiscord: boolean;
/** Opt-in: fetch upcoming tour dates from Bandsintown for the Now-Playing info panel. */ /** Opt-in: fetch upcoming tour dates from Bandsintown for the Now-Playing info panel. */
@@ -217,6 +220,7 @@ interface AuthState {
setShowArtistImages: (v: boolean) => void; setShowArtistImages: (v: boolean) => void;
setShowTrayIcon: (v: boolean) => void; setShowTrayIcon: (v: boolean) => void;
setMinimizeToTray: (v: boolean) => void; setMinimizeToTray: (v: boolean) => void;
setShowOrbitTrigger: (v: boolean) => void;
setDiscordRichPresence: (v: boolean) => void; setDiscordRichPresence: (v: boolean) => void;
setEnableAppleMusicCoversDiscord: (v: boolean) => void; setEnableAppleMusicCoversDiscord: (v: boolean) => void;
setEnableBandsintown: (v: boolean) => void; setEnableBandsintown: (v: boolean) => void;
@@ -327,6 +331,7 @@ export const useAuthStore = create<AuthState>()(
showArtistImages: false, showArtistImages: false,
showTrayIcon: true, showTrayIcon: true,
minimizeToTray: false, minimizeToTray: false,
showOrbitTrigger: true,
discordRichPresence: false, discordRichPresence: false,
enableAppleMusicCoversDiscord: false, enableAppleMusicCoversDiscord: false,
enableBandsintown: false, enableBandsintown: false,
@@ -463,6 +468,7 @@ export const useAuthStore = create<AuthState>()(
setShowArtistImages: (v) => set({ showArtistImages: v }), setShowArtistImages: (v) => set({ showArtistImages: v }),
setShowTrayIcon: (v) => set({ showTrayIcon: v }), setShowTrayIcon: (v) => set({ showTrayIcon: v }),
setMinimizeToTray: (v) => set({ minimizeToTray: v }), setMinimizeToTray: (v) => set({ minimizeToTray: v }),
setShowOrbitTrigger: (v) => set({ showOrbitTrigger: v }),
setDiscordRichPresence: (v) => set({ discordRichPresence: v }), setDiscordRichPresence: (v) => set({ discordRichPresence: v }),
setEnableAppleMusicCoversDiscord: (v) => set({ enableAppleMusicCoversDiscord: v }), setEnableAppleMusicCoversDiscord: (v) => set({ enableAppleMusicCoversDiscord: v }),
setEnableBandsintown: (v) => set({ enableBandsintown: v }), setEnableBandsintown: (v) => set({ enableBandsintown: v }),