import { useEffect, useState } from 'react' import { createFileRoute, useNavigate } from '@tanstack/react-router' import { Alert, Button, Center, Paper, Stack, Text, Title } from '@pikku/mantine/core' import { m } from '@/i18n/messages' import { useLocale } from '@/i18n/config' import { asI18n } from '@pikku/react' import { useQueryClient } from '@tanstack/react-query' function LogoutPage() { useLocale() const navigate = useNavigate() const queryClient = useQueryClient() const [error, setError] = useState(null) const [done, setDone] = useState(false) useEffect(() => { let cancelled = false const run = async () => { try { const csrfRes = await fetch('/auth/csrf', { credentials: 'include' }) const { csrfToken } = (await csrfRes.json()) as { csrfToken: string } const body = new URLSearchParams({ csrfToken, callbackUrl: '/login' }) await fetch('/auth/signout', { method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded' }, body, credentials: 'include', redirect: 'manual', }) if (cancelled) return queryClient.clear() setDone(true) } catch (err) { if (!cancelled) setError(String((err as Error).message)) } } run() return () => { cancelled = true } }, [queryClient]) return (
{m.auth_logout_title({ defaultValue: 'Signed out' })} {error && {asI18n(error)}} {!done && !error && ( {m.auth_logout_signing_out({ defaultValue: 'Signing you out…' })} )} {done && ( <> {m.auth_logout_cleared({ defaultValue: 'Your session has been cleared.' })} )}
) } export const Route = createFileRoute('/logout')({ component: LogoutPage, })