'use client'
import { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation'
import AdminShell from '../../ui/AdminShell'
import { authFetch, clearToken, getApiBase, getToken } from '../../lib/auth'
type FlowStage = {
title: string
input: string
action: string
output: string
}
const REQUEST_FLOW: FlowStage[] = [
{
title: 'Identity + access',
input: 'Jellyfin/local login',
action: 'Magent validates credentials and role',
output: 'JWT token + user scope',
},
{
title: 'Request intake',
input: 'Seerr request ID',
action: 'Magent snapshots request + media metadata',
output: 'Unified request state',
},
{
title: 'Queue orchestration',
input: 'Approved request',
action: 'Sonarr/Radarr add/search operations',
output: 'Grab decision',
},
{
title: 'Download execution',
input: 'Selected release',
action: 'qBittorrent downloads + reports progress',
output: 'Import-ready payload',
},
{
title: 'Library import',
input: 'Completed download',
action: 'Sonarr/Radarr import and finalize',
output: 'Available media object',
},
{
title: 'Playback availability',
input: 'Imported media',
action: 'Jellyfin refresh + link resolution',
output: 'Ready-to-watch state',
},
]
export default function AdminSystemGuidePage() {
const router = useRouter()
const [loading, setLoading] = useState(true)
const [authorized, setAuthorized] = useState(false)
useEffect(() => {
let active = true
const load = async () => {
if (!getToken()) {
router.push('/login')
return
}
try {
const baseUrl = getApiBase()
const response = await authFetch(`${baseUrl}/auth/me`)
if (!response.ok) {
if (response.status === 401) {
clearToken()
router.push('/login')
return
}
router.push('/')
return
}
const me = await response.json()
if (!active) return
if (me?.role !== 'admin') {
router.push('/')
return
}
setAuthorized(true)
} catch (error) {
console.error(error)
router.push('/')
} finally {
if (active) setLoading(false)
}
}
void load()
return () => {
active = false
}
}, [router])
if (loading) {
return
Identity → Request intake → Queue orchestration → Download → Import → Playback.
Admin onlyThis is the runtime path the platform follows from authentication through to playback availability.
Handles authentication, request pages, live event updates, invite workflows, diagnostics, notifications, and admin operations.
Stores the request itself and remains the request-state source for approval and media request metadata.
Provides user sign-in identity and the final playback destination once content is available.
Control queue placement, quality-profile decisions, import handling, and release monitoring.
Provides search/indexer coverage for Arr-side release searches.
Executes the download and exposes live progress, paused states, and queue visibility.
Application URL, API URL, ports, bind host, proxy base URL, and manual SSL settings.
Email, Discord, Telegram, push/mobile, and generic webhook delivery channels.
Role/profile/expiry, auto-search access, invite access, and cross-system ban/remove actions.
Master template, profile assignment, invite access policy, invite emails, and trace map lineage.
All-requests view, sync controls, cached request records, and maintenance operations.
Connectivity checks, live diagnostics, database repair, cleanup, log review, and nuclear flush/resync operations.
Recent requests and service summaries refresh live for signed-in users.
Timeline state, queue activity, and torrent progress are pushed live without refresh.
Diagnostics, logs, sync state, and maintenance surfaces stream live operational data.