diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 43c4b57..735264a 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -8,6 +8,10 @@ async function request(path: string, opts: RequestInit = {}): Promise { headers: { 'Content-Type': 'application/json', ...opts.headers }, ...opts, }) + if (res.status === 401) { + ;(window.top ?? window).location.href = '/login' + throw new Error('Unauthenticated') + } if (!res.ok) { const err = await res.json().catch(() => ({ error: res.statusText })) throw new Error(err.error || `Request failed: ${res.status}`) diff --git a/frontend/src/components/AuthGate.tsx b/frontend/src/components/AuthGate.tsx index 54b46c8..b5483cb 100644 --- a/frontend/src/components/AuthGate.tsx +++ b/frontend/src/components/AuthGate.tsx @@ -12,30 +12,20 @@ export function useAuth() { export default function AuthGate({ children }: { children: React.ReactNode }) { const [user, setUser] = useState(null) - const [error, setError] = useState(null) useEffect(() => { fetch('/api/auth/verify?app=room-planner', { credentials: 'include' }) .then(r => { - if (r.status === 401 || r.status === 403) { - window.location.href = `/portal?redirect=${encodeURIComponent(window.location.href)}` + if (!r.ok) { + ;(window.top ?? window).location.href = '/login' return null } - if (!r.ok) throw new Error(`Auth check failed: ${r.status}`) return r.json() }) .then(data => { if (data) setUser(data) }) - .catch(err => setError(err.message)) + .catch(() => { ;(window.top ?? window).location.href = '/login' }) }, []) - if (error) { - return ( -
- Authentication error: {error} -
- ) - } - if (!user) { return (