import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Wifi, WifiOff, Globe, Music2, Sliders, LogOut, CheckCircle2, FolderOpen, Palette, Server, Plus, Trash2, Eye, EyeOff } from 'lucide-react'; import { useAuthStore, ServerProfile } from '../store/authStore'; import { useThemeStore } from '../store/themeStore'; import { pingWithCredentials } from '../api/subsonic'; import { open as openDialog } from '@tauri-apps/plugin-dialog'; import { useTranslation } from 'react-i18next'; function AddServerForm({ onSave, onCancel }: { onSave: (data: Omit) => void; onCancel: () => void }) { const { t } = useTranslation(); const [form, setForm] = useState({ name: '', url: '', username: '', password: '' }); const [showPass, setShowPass] = useState(false); const update = (k: keyof typeof form) => (e: React.ChangeEvent) => setForm(f => ({ ...f, [k]: e.target.value })); return (

{t('settings.addServerTitle')}

); } export default function Settings() { const auth = useAuthStore(); const theme = useThemeStore(); const navigate = useNavigate(); const { t, i18n } = useTranslation(); const [connStatus, setConnStatus] = useState>({}); const [showAddForm, setShowAddForm] = useState(false); const testConnection = async (server: ServerProfile) => { setConnStatus(s => ({ ...s, [server.id]: 'testing' })); try { const ok = await pingWithCredentials(server.url, server.username, server.password); setConnStatus(s => ({ ...s, [server.id]: ok ? 'ok' : 'error' })); } catch { setConnStatus(s => ({ ...s, [server.id]: 'error' })); } }; const switchToServer = async (server: ServerProfile) => { setConnStatus(s => ({ ...s, [server.id]: 'testing' })); try { const ok = await pingWithCredentials(server.url, server.username, server.password); if (ok) { auth.setActiveServer(server.id); auth.setLoggedIn(true); navigate('/'); } else { setConnStatus(s => ({ ...s, [server.id]: 'error' })); } } catch { setConnStatus(s => ({ ...s, [server.id]: 'error' })); } }; const deleteServer = (server: ServerProfile) => { if (confirm(t('settings.confirmDeleteServer', { name: server.name || server.url }))) { auth.removeServer(server.id); } }; const handleAddServer = async (data: Omit) => { setShowAddForm(false); const tempId = '_new'; setConnStatus(s => ({ ...s, [tempId]: 'testing' })); try { const ok = await pingWithCredentials(data.url, data.username, data.password); if (ok) { const id = auth.addServer(data); auth.setActiveServer(id); auth.setLoggedIn(true); setConnStatus(s => ({ ...s, [id]: 'ok' })); } else { setConnStatus(s => ({ ...s, [tempId]: 'error' })); } } catch { setConnStatus(s => ({ ...s, [tempId]: 'error' })); } }; const handleLogout = () => { auth.logout(); navigate('/login'); }; const pickDownloadFolder = async () => { const selected = await openDialog({ directory: true, multiple: false, title: t('settings.pickFolderTitle') }); if (selected && typeof selected === 'string') { auth.setDownloadFolder(selected); } }; return (

{t('settings.title')}

{/* Language */}

{t('settings.language')}

{/* Theme */}

{t('settings.theme')}

{/* Servers */}

{t('settings.servers')}

{auth.servers.length === 0 && !showAddForm ? (
{t('settings.noServers')}
) : (
{auth.servers.map(srv => { const isActive = srv.id === auth.activeServerId; const status = connStatus[srv.id]; return (
{srv.name || srv.url} {isActive && ( {t('settings.serverActive')} )}
{srv.username}@{srv.url}
{status === 'ok' && } {status === 'error' && } {status === 'testing' &&
} {!isActive && ( )}
); })}
)} {showAddForm ? ( setShowAddForm(false)} /> ) : ( )}
{/* Last.fm */}

{t('settings.lfmTitle')}

{t('settings.lfmDesc1')}{' '} {t('settings.lfmDesc1NavidromeWebplayer')} {' '}{t('settings.lfmDesc1b')}

{t('settings.lfmDesc2')}

{t('settings.scrobbleEnabled')}
{t('settings.scrobbleDesc')}
{/* App Behavior */}

{t('settings.behavior')}

{t('settings.trayTitle')}
{t('settings.trayDesc')}
{t('settings.cacheTitle')}
{t('settings.cacheDesc')} ({auth.maxCacheMb} MB)
auth.setMaxCacheMb(Number(e.target.value))} style={{ width: 120 }} id="cache-size-slider" />
{t('settings.downloadsTitle')}
{auth.downloadFolder || t('settings.downloadsDefault')}
{/* Logout */}
); }