feat: add about section in user setting with trek version + discord link

This commit is contained in:
jubnl
2026-04-03 15:30:10 +02:00
parent cb124ba3ec
commit 6b94c0632c
14 changed files with 58 additions and 23 deletions

View File

@@ -247,6 +247,7 @@ const ar: Record<string, string | { name: string; category: string }[]> = {
'settings.mcp.toast.deleted': 'تم حذف الرمز',
'settings.mcp.toast.deleteError': 'فشل حذف الرمز',
'settings.account': 'الحساب',
'settings.about': 'حول',
'settings.username': 'اسم المستخدم',
'settings.email': 'البريد الإلكتروني',
'settings.role': 'الدور',
@@ -1542,6 +1543,6 @@ const ar: Record<string, string | { name: string; category: string }[]> = {
'notifications.test.adminText': 'أرسل {actor} إشعاراً تجريبياً لجميع المسؤولين.',
'notifications.test.tripTitle': 'نشر {actor} في رحلتك',
'notifications.test.tripText': 'إشعار تجريبي للرحلة "{trip}".',
}
}
export default ar

View File

@@ -217,6 +217,7 @@ const br: Record<string, string | { name: string; category: string }[]> = {
'settings.on': 'Ligado',
'settings.off': 'Desligado',
'settings.account': 'Conta',
'settings.about': 'Sobre',
'settings.username': 'Nome de usuário',
'settings.email': 'E-mail',
'settings.role': 'Função',
@@ -1537,6 +1538,6 @@ const br: Record<string, string | { name: string; category: string }[]> = {
'notifications.test.adminText': '{actor} enviou uma notificação de teste para todos os admins.',
'notifications.test.tripTitle': '{actor} postou na sua viagem',
'notifications.test.tripText': 'Notificação de teste para a viagem "{trip}".',
}
}
export default br

View File

@@ -195,6 +195,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'settings.mcp.toast.deleted': 'Token smazán',
'settings.mcp.toast.deleteError': 'Nepodařilo se smazat token',
'settings.account': 'Účet',
'settings.about': 'O aplikaci',
'settings.username': 'Uživatelské jméno',
'settings.email': 'E-mail',
'settings.role': 'Role',
@@ -1542,6 +1543,6 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
'notifications.test.adminText': '{actor} odeslal testovací oznámení všem správcům.',
'notifications.test.tripTitle': '{actor} přispěl do vašeho výletu',
'notifications.test.tripText': 'Testovací oznámení pro výlet "{trip}".',
}
}
export default cs

View File

@@ -242,6 +242,7 @@ const de: Record<string, string | { name: string; category: string }[]> = {
'settings.mcp.toast.deleted': 'Token gelöscht',
'settings.mcp.toast.deleteError': 'Token konnte nicht gelöscht werden',
'settings.account': 'Konto',
'settings.about': 'Über',
'settings.username': 'Benutzername',
'settings.email': 'E-Mail',
'settings.role': 'Rolle',
@@ -1539,6 +1540,6 @@ const de: Record<string, string | { name: string; category: string }[]> = {
'notifications.test.adminText': '{actor} hat eine Testbenachrichtigung an alle Admins gesendet.',
'notifications.test.tripTitle': '{actor} hat in Ihrer Reise gepostet',
'notifications.test.tripText': 'Testbenachrichtigung für Reise "{trip}".',
}
}
export default de

View File

@@ -242,6 +242,7 @@ const en: Record<string, string | { name: string; category: string }[]> = {
'settings.mcp.toast.deleted': 'Token deleted',
'settings.mcp.toast.deleteError': 'Failed to delete token',
'settings.account': 'Account',
'settings.about': 'About',
'settings.username': 'Username',
'settings.email': 'Email',
'settings.role': 'Role',

View File

@@ -243,6 +243,7 @@ const es: Record<string, string> = {
'settings.mcp.toast.deleted': 'Token eliminado',
'settings.mcp.toast.deleteError': 'Error al eliminar el token',
'settings.account': 'Cuenta',
'settings.about': 'Acerca de',
'settings.username': 'Usuario',
'settings.email': 'Correo',
'settings.role': 'Rol',
@@ -1544,6 +1545,6 @@ const es: Record<string, string> = {
'notifications.test.adminText': '{actor} envió una notificación de prueba a todos los administradores.',
'notifications.test.tripTitle': '{actor} publicó en tu viaje',
'notifications.test.tripText': 'Notificación de prueba para el viaje "{trip}".',
}
}
export default es

View File

@@ -242,6 +242,7 @@ const fr: Record<string, string> = {
'settings.mcp.toast.deleted': 'Token supprimé',
'settings.mcp.toast.deleteError': 'Impossible de supprimer le token',
'settings.account': 'Compte',
'settings.about': 'À propos',
'settings.username': 'Nom d\'utilisateur',
'settings.email': 'E-mail',
'settings.role': 'Rôle',
@@ -1538,6 +1539,6 @@ const fr: Record<string, string> = {
'notifications.test.adminText': '{actor} a envoyé une notification de test à tous les admins.',
'notifications.test.tripTitle': '{actor} a publié dans votre voyage',
'notifications.test.tripText': 'Notification de test pour le voyage "{trip}".',
}
}
export default fr

View File

@@ -194,6 +194,7 @@ const hu: Record<string, string | { name: string; category: string }[]> = {
'settings.mcp.toast.deleted': 'Token törölve',
'settings.mcp.toast.deleteError': 'Nem sikerült törölni a tokent',
'settings.account': 'Fiók',
'settings.about': 'Névjegy',
'settings.username': 'Felhasználónév',
'settings.email': 'E-mail',
'settings.role': 'Szerepkör',
@@ -1539,6 +1540,6 @@ const hu: Record<string, string | { name: string; category: string }[]> = {
'notifications.test.adminText': '{actor} teszt értesítést küldött az összes adminisztrátornak.',
'notifications.test.tripTitle': '{actor} üzenetet küldött az utazásodba',
'notifications.test.tripText': 'Teszt értesítés a(z) "{trip}" utazáshoz.',
}
}
export default hu

View File

@@ -194,6 +194,7 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'settings.mcp.toast.deleted': 'Token eliminato',
'settings.mcp.toast.deleteError': 'Impossibile eliminare il token',
'settings.account': 'Account',
'settings.about': 'Informazioni',
'settings.username': 'Username',
'settings.email': 'Email',
'settings.role': 'Ruolo',
@@ -1539,6 +1540,6 @@ const it: Record<string, string | { name: string; category: string }[]> = {
'notifications.test.adminText': '{actor} ha inviato una notifica di test a tutti gli amministratori.',
'notifications.test.tripTitle': '{actor} ha pubblicato nel tuo viaggio',
'notifications.test.tripText': 'Notifica di test per il viaggio "{trip}".',
}
}
export default it

View File

@@ -242,6 +242,7 @@ const nl: Record<string, string> = {
'settings.mcp.toast.deleted': 'Token verwijderd',
'settings.mcp.toast.deleteError': 'Token verwijderen mislukt',
'settings.account': 'Account',
'settings.about': 'Over',
'settings.username': 'Gebruikersnaam',
'settings.email': 'E-mail',
'settings.role': 'Rol',
@@ -1538,6 +1539,6 @@ const nl: Record<string, string> = {
'notifications.test.adminText': '{actor} heeft een testmelding naar alle admins gestuurd.',
'notifications.test.tripTitle': '{actor} heeft gepost in uw reis',
'notifications.test.tripText': 'Testmelding voor reis "{trip}".',
}
}
export default nl

View File

@@ -211,6 +211,7 @@ const pl: Record<string, string | { name: string; category: string }[]> = {
'settings.mcp.toast.deleted': 'Token został usunięty',
'settings.mcp.toast.deleteError': 'Nie udało się usunąć tokenu',
'settings.account': 'Konto',
'settings.about': 'O aplikacji',
'settings.username': 'Nazwa użytkownika',
'settings.email': 'E-mail',
'settings.role': 'Rola',

View File

@@ -242,6 +242,7 @@ const ru: Record<string, string> = {
'settings.mcp.toast.deleted': 'Токен удалён',
'settings.mcp.toast.deleteError': 'Не удалось удалить токен',
'settings.account': 'Аккаунт',
'settings.about': 'О приложении',
'settings.username': 'Имя пользователя',
'settings.email': 'Эл. почта',
'settings.role': 'Роль',
@@ -1538,6 +1539,6 @@ const ru: Record<string, string> = {
'notifications.test.adminText': '{actor} отправил тестовое уведомление всем администраторам.',
'notifications.test.tripTitle': '{actor} написал в вашей поездке',
'notifications.test.tripText': 'Тестовое уведомление для поездки "{trip}".',
}
}
export default ru

View File

@@ -242,6 +242,7 @@ const zh: Record<string, string> = {
'settings.mcp.toast.deleted': '令牌已删除',
'settings.mcp.toast.deleteError': '删除令牌失败',
'settings.account': '账户',
'settings.about': '关于',
'settings.username': '用户名',
'settings.email': '邮箱',
'settings.role': '角色',
@@ -1538,6 +1539,6 @@ const zh: Record<string, string> = {
'notifications.test.adminText': '{actor} 向所有管理员发送了测试通知。',
'notifications.test.tripTitle': '{actor} 在您的行程中发帖',
'notifications.test.tripText': '行程"{trip}"的测试通知。',
}
}
export default zh

View File

@@ -6,7 +6,7 @@ import { SUPPORTED_LANGUAGES, useTranslation } from '../i18n'
import Navbar from '../components/Layout/Navbar'
import CustomSelect from '../components/shared/CustomSelect'
import { useToast } from '../components/shared/Toast'
import { Save, Map, Palette, User, Moon, Sun, Monitor, Shield, Camera, Trash2, Lock, KeyRound, AlertTriangle, Copy, Download, Printer, Terminal, Plus, Check } from 'lucide-react'
import { Save, Map, Palette, User, Moon, Sun, Monitor, Shield, Camera, Trash2, Lock, KeyRound, AlertTriangle, Copy, Download, Printer, Terminal, Plus, Check, Info } from 'lucide-react'
import { authApi, adminApi } from '../api/client'
import apiClient from '../api/client'
import { useAddonStore } from '../store/addonStore'
@@ -126,6 +126,10 @@ export default function SettingsPage(): React.ReactElement {
// Addon gating (derived from store)
const memoriesEnabled = addonEnabled('memories')
const mcpEnabled = addonEnabled('mcp')
const [appVersion, setAppVersion] = useState<string | null>(null)
useEffect(() => {
authApi.getAppConfig?.().then(c => setAppVersion(c?.version)).catch(() => {})
}, [])
const [immichUrl, setImmichUrl] = useState('')
const [immichApiKey, setImmichApiKey] = useState('')
const [immichConnected, setImmichConnected] = useState(false)
@@ -1291,6 +1295,24 @@ export default function SettingsPage(): React.ReactElement {
</div>
</Section>
{appVersion && (
<Section title={t('settings.about')} icon={Info}>
<div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
<div style={{ display: 'inline-flex', alignItems: 'center', gap: 6, background: 'var(--bg-tertiary)', borderRadius: 99, padding: '6px 14px' }}>
<span style={{ fontSize: 13, fontWeight: 600, color: 'var(--text-secondary)' }}>TREK</span>
<span style={{ fontSize: 13, color: 'var(--text-faint)' }}>v{appVersion}</span>
</div>
<a href="https://discord.gg/nSdKaXgN" target="_blank" rel="noopener noreferrer"
style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, borderRadius: 99, background: 'var(--bg-tertiary)', transition: 'background 0.15s' }}
onMouseEnter={e => e.currentTarget.style.background = '#5865F220'}
onMouseLeave={e => e.currentTarget.style.background = 'var(--bg-tertiary)'}
title="Discord">
<svg width="14" height="14" viewBox="0 0 24 24" fill="var(--text-faint)"><path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.095 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/></svg>
</a>
</div>
</Section>
)}
{/* Delete Account Confirmation */}
{showDeleteConfirm === 'blocked' && (
<div style={{