Add /portal/debug page and navigate there after session; shows auth + machine context

This commit is contained in:
Esdras Renan 2025-10-14 20:47:46 -03:00
parent 6754af769b
commit 1e850ed11e
2 changed files with 68 additions and 3 deletions

View file

@ -444,20 +444,20 @@ function App() {
if (!res.ok) {
// Fallback para o handshake por redirecionamento
const persona = (config?.accessRole ?? accessRole) === "manager" ? "manager" : "collaborator"
const redirectTarget = persona === "manager" ? "/dashboard" : "/portal"
const redirectTarget = persona === "manager" ? "/dashboard" : "/portal/debug"
const url = `${resolvedAppUrl}/machines/handshake?token=${encodeURIComponent(token)}&redirect=${encodeURIComponent(redirectTarget)}`
window.location.href = url
return
}
} catch {
const persona = (config?.accessRole ?? accessRole) === "manager" ? "manager" : "collaborator"
const redirectTarget = persona === "manager" ? "/dashboard" : "/portal"
const redirectTarget = persona === "manager" ? "/dashboard" : "/portal/debug"
const url = `${resolvedAppUrl}/machines/handshake?token=${encodeURIComponent(token)}&redirect=${encodeURIComponent(redirectTarget)}`
window.location.href = url
return
}
const persona = (config?.accessRole ?? accessRole) === "manager" ? "manager" : "collaborator"
const redirectTarget = persona === "manager" ? "/dashboard" : "/portal"
const redirectTarget = persona === "manager" ? "/dashboard" : "/portal/debug"
window.location.href = `${resolvedAppUrl}${redirectTarget}`
}, [token, config?.accessRole, accessRole, resolvedAppUrl, apiBaseUrl])

View file

@ -0,0 +1,65 @@
"use client"
import { useEffect, useState } from "react"
type Json = Record<string, unknown> | null
export default function PortalDebugPage() {
const [authSession, setAuthSession] = useState<Json>(null)
const [authStatus, setAuthStatus] = useState<number | null>(null)
const [machine, setMachine] = useState<Json>(null)
const [machineStatus, setMachineStatus] = useState<number | null>(null)
const [error, setError] = useState<string | null>(null)
useEffect(() => {
let cancelled = false
;(async () => {
try {
const a = await fetch("/api/auth/get-session", { credentials: "include" })
const aBody = await a.json().catch(() => null)
if (!cancelled) {
setAuthStatus(a.status)
setAuthSession(aBody as Json)
}
const m = await fetch("/api/machines/session", { credentials: "include" })
const mBody = await m.json().catch(() => null)
if (!cancelled) {
setMachineStatus(m.status)
setMachine(mBody as Json)
}
} catch (err) {
if (!cancelled) setError(err instanceof Error ? err.message : String(err))
}
})()
return () => { cancelled = true }
}, [])
return (
<div className="mx-auto max-w-3xl space-y-4 p-6">
<h1 className="text-lg font-semibold">Diagnóstico de sessão</h1>
<p className="text-sm text-neutral-600">Esta página consulta a API com os mesmos cookies desta aba.</p>
{error ? (
<div className="rounded-md border border-rose-200 bg-rose-50 p-3 text-sm text-rose-700">{error}</div>
) : null}
<section className="rounded-md border border-slate-200 bg-white p-4">
<h2 className="mb-2 text-sm font-semibold">/api/auth/get-session</h2>
<div className="mb-2 text-xs text-neutral-500">status: {authStatus ?? "—"}</div>
<pre className="overflow-x-auto rounded-md bg-slate-50 p-3 text-xs leading-tight">{JSON.stringify(authSession, null, 2)}</pre>
</section>
<section className="rounded-md border border-slate-200 bg-white p-4">
<h2 className="mb-2 text-sm font-semibold">/api/machines/session</h2>
<div className="mb-2 text-xs text-neutral-500">status: {machineStatus ?? "—"}</div>
<pre className="overflow-x-auto rounded-md bg-slate-50 p-3 text-xs leading-tight">{JSON.stringify(machine, null, 2)}</pre>
</section>
<div className="text-xs text-neutral-500">
Se algum status for 401/403, os cookies de sessão não estão válidos. Reabra o agente e tente novamente.
</div>
</div>
)
}