Improve request handling and qBittorrent categories

This commit is contained in:
2026-01-24 21:48:55 +13:00
parent 030480410b
commit cf4277d10c
13 changed files with 398 additions and 70 deletions

View File

@@ -1,6 +1,6 @@
'use client'
import { useEffect, useMemo, useState } from 'react'
import { useCallback, useEffect, useMemo, useState } from 'react'
import { useRouter } from 'next/navigation'
import { authFetch, clearToken, getApiBase, getToken } from '../lib/auth'
import AdminShell from '../ui/AdminShell'
@@ -107,7 +107,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
const [maintenanceStatus, setMaintenanceStatus] = useState<string | null>(null)
const [maintenanceBusy, setMaintenanceBusy] = useState(false)
const loadSettings = async () => {
const loadSettings = useCallback(async () => {
const baseUrl = getApiBase()
const response = await authFetch(`${baseUrl}/admin/settings`)
if (!response.ok) {
@@ -139,9 +139,9 @@ export default function SettingsPage({ section }: SettingsPageProps) {
}
setFormValues(initialValues)
setStatus(null)
}
}, [router])
const loadArtworkPrefetchStatus = async () => {
const loadArtworkPrefetchStatus = useCallback(async () => {
try {
const baseUrl = getApiBase()
const response = await authFetch(`${baseUrl}/admin/requests/artwork/status`)
@@ -153,10 +153,9 @@ export default function SettingsPage({ section }: SettingsPageProps) {
} catch (err) {
console.error(err)
}
}
}, [])
const loadOptions = async (service: 'sonarr' | 'radarr') => {
const loadOptions = useCallback(async (service: 'sonarr' | 'radarr') => {
try {
const baseUrl = getApiBase()
const response = await authFetch(`${baseUrl}/admin/${service}/options`)
@@ -185,7 +184,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
setRadarrError('Could not load Radarr options.')
}
}
}
}, [])
useEffect(() => {
const load = async () => {
@@ -213,7 +212,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
if (section === 'radarr') {
void loadOptions('radarr')
}
}, [router, section])
}, [loadArtworkPrefetchStatus, loadOptions, loadSettings, router, section])
const groupedSettings = useMemo(() => {
const groups: Record<string, AdminSetting[]> = {}
@@ -271,10 +270,12 @@ export default function SettingsPage({ section }: SettingsPageProps) {
sonarr_api_key: 'API key for Sonarr.',
sonarr_quality_profile_id: 'Quality profile used when adding TV shows.',
sonarr_root_folder: 'Root folder where Sonarr stores TV shows.',
sonarr_qbittorrent_category: 'qBittorrent category for manual Sonarr downloads.',
radarr_base_url: 'Radarr server URL for movies.',
radarr_api_key: 'API key for Radarr.',
radarr_quality_profile_id: 'Quality profile used when adding movies.',
radarr_root_folder: 'Root folder where Radarr stores movies.',
radarr_qbittorrent_category: 'qBittorrent category for manual Radarr downloads.',
prowlarr_base_url: 'Prowlarr server URL for indexer searches.',
prowlarr_api_key: 'API key for Prowlarr.',
qbittorrent_base_url: 'qBittorrent server URL for download status.',
@@ -472,7 +473,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
active = false
clearInterval(timer)
}
}, [artworkPrefetch?.status])
}, [artworkPrefetch])
useEffect(() => {
if (!artworkPrefetch || artworkPrefetch.status === 'running') {
@@ -482,7 +483,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
setArtworkPrefetch(null)
}, 5000)
return () => clearTimeout(timer)
}, [artworkPrefetch?.status])
}, [artworkPrefetch])
useEffect(() => {
if (!requestsSync || requestsSync.status !== 'running') {
@@ -510,7 +511,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
active = false
clearInterval(timer)
}
}, [requestsSync?.status])
}, [requestsSync])
useEffect(() => {
if (!requestsSync || requestsSync.status === 'running') {
@@ -520,9 +521,9 @@ export default function SettingsPage({ section }: SettingsPageProps) {
setRequestsSync(null)
}, 5000)
return () => clearTimeout(timer)
}, [requestsSync?.status])
}, [requestsSync])
const loadLogs = async () => {
const loadLogs = useCallback(async () => {
setLogsStatus(null)
try {
const baseUrl = getApiBase()
@@ -547,7 +548,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
: 'Could not load logs.'
setLogsStatus(message)
}
}
}, [logsCount])
useEffect(() => {
if (!showLogs) {
@@ -558,7 +559,7 @@ export default function SettingsPage({ section }: SettingsPageProps) {
void loadLogs()
}, 5000)
return () => clearInterval(timer)
}, [logsCount, showLogs])
}, [loadLogs, showLogs])
const loadCache = async () => {
setCacheStatus(null)