diff --git a/src/app/api/session/route.ts b/src/app/api/session/route.ts deleted file mode 100644 index 3b87a6a..0000000 --- a/src/app/api/session/route.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { requireAuth } from '@/lib/auth/server'; -import { NextResponse } from 'next/server'; - -export async function GET(): Promise { - const session = await requireAuth(true); - return NextResponse.json({ openToken: session.openToken }); -} -export async function DELETE(): Promise { - const session = await requireAuth(true); - session.destroy(); -} diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 673fd55..ec48a85 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -1,10 +1,10 @@ import { requireAuth } from '@/lib/auth/server'; import { getServers } from '@/lib/api/server/servers'; import { hasPermission } from '@/lib/types'; -import { logoutAction } from '@/lib/actions/auth'; import Link from 'next/link'; import { ServerListWithActions } from '@/components/server/ServerListWithActions'; import { SteamCMDNotification } from '@/components/ui/SteamCMDNotification'; +import LogoutButton from '@/components/ui/LogoutButton'; export default async function DashboardPage() { const session = await requireAuth(); @@ -38,25 +38,7 @@ export default async function DashboardPage() { Users )} -
- -
+ diff --git a/src/components/ui/LogoutButton.tsx b/src/components/ui/LogoutButton.tsx new file mode 100644 index 0000000..ba57d5a --- /dev/null +++ b/src/components/ui/LogoutButton.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { logoutAction } from '@/lib/actions/auth'; +import { useActionState } from 'react'; + +export default function LogoutButton() { + const [_, formAction] = useActionState(logoutAction, null); + return ( +
+ +
+ ); +} diff --git a/src/lib/actions/auth.ts b/src/lib/actions/auth.ts index e8f8ff8..617579d 100644 --- a/src/lib/actions/auth.ts +++ b/src/lib/actions/auth.ts @@ -43,5 +43,5 @@ export async function loginAction(prevState: LoginResult, formData: FormData) { } export async function logoutAction() { - logout(); + await logout(); } diff --git a/src/lib/api/client/base.ts b/src/lib/api/client/base.ts index ad9f6e8..2d75aaa 100644 --- a/src/lib/api/client/base.ts +++ b/src/lib/api/client/base.ts @@ -17,9 +17,6 @@ const getSession = async (): Promise => { } return null; }; -const destroySession = async (): Promise => { - await fetch('/api/session', { method: 'DELETE' }); -}; export async function fetchClientAPI( endpoint: string, @@ -52,7 +49,6 @@ export async function fetchClientAPI( if (!response.ok) { if (response.status === 401) { - await destroySession(); window.location.href = '/login'; return { error: 'unauthorized' }; } diff --git a/src/lib/api/server/base.ts b/src/lib/api/server/base.ts index fcf9997..547f4cd 100644 --- a/src/lib/api/server/base.ts +++ b/src/lib/api/server/base.ts @@ -6,8 +6,10 @@ type ApiResponse = { message?: string; }; +import { logout } from '@/lib/auth/server'; + const destroySession = async (): Promise => { - await fetch('/api/session', { method: 'DELETE' }); + await logout(); }; export async function fetchServerAPI( @@ -31,7 +33,6 @@ export async function fetchServerAPI( if (!response.ok) { if (response.status == 401) { await destroySession(); - window.location.href = '/login'; return { error: 'unauthorized' }; } throw new Error( diff --git a/src/lib/auth/server.ts b/src/lib/auth/server.ts index b4aaf39..5caa26f 100644 --- a/src/lib/auth/server.ts +++ b/src/lib/auth/server.ts @@ -12,7 +12,6 @@ export async function requireAuth(skipRedirect?: boolean) { const session = await getSession(); if (!skipRedirect && (!session.token || !session.user)) { - session.destroy(); redirect('/login'); } @@ -28,6 +27,7 @@ export async function login(token: string, user: SessionData['user'], openToken? } export async function logout() { + 'use server'; const session = await getSession(); session.destroy(); }