refactor(settings): split SettingsPage into components, restructure tabs

- Extract 7 sub-components into settings/components/ (AnilistTab,
  KomgaSyncCard, MetadataProvidersCard, StatusMappingsCard, ProwlarrCard,
  QBittorrentCard, TelegramCard) — SettingsPage.tsx: 2100 → 551 lines
- Add "Metadata" tab (MetadataProviders + StatusMappings)
- Rename "Integrations" → "Download Tools" (Prowlarr + qBittorrent)
- Rename "AniList" → "Reading Status" tab; Komga sync as standalone card
- Rename cards: "AniList Config" + "AniList Sync"
- Persist active tab in URL searchParams (?tab=...)
- Fix hydration mismatch on AniList redirect URL (window.location via useEffect)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-25 13:15:43 +01:00
parent 5ba4315e98
commit e5e4993e7b
10 changed files with 1675 additions and 1687 deletions

View File

@@ -474,6 +474,9 @@ const en: Record<TranslationKey, string> = {
"settings.title": "Settings",
"settings.general": "General",
"settings.integrations": "Integrations",
"settings.downloadTools": "Download Tools",
"settings.metadata": "Metadata",
"settings.readingStatus": "Reading Status",
"settings.savedSuccess": "Settings saved successfully",
"settings.savedError": "Failed to save settings",
"settings.saveError": "Error saving settings",
@@ -651,7 +654,7 @@ const en: Record<TranslationKey, string> = {
// Settings - AniList
"settings.anilist": "Reading status",
"settings.anilistTitle": "AniList Sync",
"settings.anilistTitle": "AniList Config",
"settings.anilistDesc": "Sync your reading progress with AniList. Get a personal access token at anilist.co/settings/developer.",
"settings.anilistToken": "Personal Access Token",
"settings.anilistTokenPlaceholder": "AniList token...",
@@ -666,7 +669,7 @@ const en: Record<TranslationKey, string> = {
"settings.anilistLocalUserTitle": "Local user",
"settings.anilistLocalUserDesc": "Select the local user whose reading progress is synced with this AniList account",
"settings.anilistLocalUserNone": "— Select a user —",
"settings.anilistSyncTitle": "Sync",
"settings.anilistSyncTitle": "AniList Sync",
"settings.anilistSyncDesc": "Push local reading progress to AniList. Rules: none read → PLANNING · at least 1 read → CURRENT (progress = volumes read) · all published volumes read (total_volumes known) → COMPLETED.",
"settings.anilistSyncButton": "Sync to AniList",
"settings.anilistPullButton": "Pull from AniList",

View File

@@ -472,6 +472,9 @@ const fr = {
"settings.title": "Paramètres",
"settings.general": "Général",
"settings.integrations": "Intégrations",
"settings.downloadTools": "Outils de téléchargement",
"settings.metadata": "Métadonnées",
"settings.readingStatus": "Statut de lecture",
"settings.savedSuccess": "Paramètres enregistrés avec succès",
"settings.savedError": "Échec de l'enregistrement des paramètres",
"settings.saveError": "Erreur lors de l'enregistrement des paramètres",
@@ -649,7 +652,7 @@ const fr = {
// Settings - AniList
"settings.anilist": "État de lecture",
"settings.anilistTitle": "Synchronisation AniList",
"settings.anilistTitle": "AniList Config",
"settings.anilistDesc": "Synchronisez votre progression de lecture avec AniList. Obtenez un token d'accès personnel sur anilist.co/settings/developer.",
"settings.anilistToken": "Token d'accès personnel",
"settings.anilistTokenPlaceholder": "Token AniList...",
@@ -664,7 +667,7 @@ const fr = {
"settings.anilistLocalUserTitle": "Utilisateur local",
"settings.anilistLocalUserDesc": "Choisir l'utilisateur local dont la progression est synchronisée avec ce compte AniList",
"settings.anilistLocalUserNone": "— Sélectionner un utilisateur —",
"settings.anilistSyncTitle": "Synchronisation",
"settings.anilistSyncTitle": "AniList Sync",
"settings.anilistSyncDesc": "Envoyer la progression locale vers AniList. Règles : aucun lu → PLANNING · au moins 1 lu → CURRENT (progression = nbre de tomes lus) · tous les tomes publiés lus (total_volumes connu) → COMPLETED.",
"settings.anilistSyncButton": "Synchroniser vers AniList",
"settings.anilistPullButton": "Importer depuis AniList",