diff --git a/app/dashboard/dashboard-client.tsx b/app/dashboard/dashboard-client.tsx index 71e2c8d..41e5672 100644 --- a/app/dashboard/dashboard-client.tsx +++ b/app/dashboard/dashboard-client.tsx @@ -34,7 +34,7 @@ const toActiveConnection = (session: ApiSession): ActiveConnection => { status: session.active ? "connected" : "error", protocol: (session.forwarding_type || "http").toLowerCase(), serverLabel: session.node || "Unknown node", - remote: session.slug ? `${session.slug}.tunnl.live` : session.node || "—", + remote: session.slug ? `${session.slug}.${session.node}` : session.node || "—", startedAgo, latencyMs: null, dataInOut: undefined, @@ -86,26 +86,18 @@ export default function DashboardClient({ initialActiveConnections }: DashboardC const [activeConnections, setActiveConnections] = useState( initialActiveConnections.map(toActiveConnection), ) - const [session, setSession] = useState(null) + const { data: cachedSession } = authClient.useSession() + const [session, setSession] = useState(cachedSession ?? null) useEffect(() => { setActiveConnections(initialActiveConnections.map(toActiveConnection)) }, [initialActiveConnections]) useEffect(() => { - const fetchSession = async () => { - try { - const result = await authClient.getSession() - if (result.data) { - setSession(result.data) - } - } catch (error) { - console.error("Error fetching session", error) - } + if (!session && cachedSession) { + setSession(cachedSession) } - - fetchSession() - }, []) + }, [cachedSession, session]) const stopConnection = (id: string) => { setActiveConnections((prev) => prev.filter((conn) => conn.id !== id)) diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 8569883..6fe6131 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -3,10 +3,20 @@ import SiteFooter from "@/components/site-footer" import { auth } from "@/lib/auth" import { headers } from "next/headers" import DashboardClient from "./dashboard-client" +import { redirect } from "next/navigation"; export default async function DashboardPage() { + const requestHeaders = await headers() + const session = await auth.api.getSession({ + headers: requestHeaders, + }).catch(() => { + redirect('/') + }) + const { token } = await auth.api.getToken({ - headers: await headers(), + headers: requestHeaders, + }).catch(() => { + redirect('/') }) const data = await fetch(`${process.env.API_URL}/api/sessions`, { @@ -20,8 +30,10 @@ export default async function DashboardPage() { return (
- - + +
) diff --git a/app/page.tsx b/app/page.tsx index ebb29bd..e379eb8 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -5,7 +5,6 @@ import TunnelConfig, { type TunnelConfig as TunnelConfigType, type Server } from import SiteHeader from "@/components/site-header" import SiteFooter from "@/components/site-footer" import { authClient } from "@/lib/auth-client" -import { useEffect } from "react" const defaultConfig: TunnelConfigType = { type: "http", @@ -16,26 +15,10 @@ const defaultConfig: TunnelConfigType = { export default function Home() { const [selectedServer, setSelectedServer] = useState(null) const [tunnelConfig, setTunnelConfig] = useState(defaultConfig) - type SessionData = Awaited>; - const [logedin, setLogedin] = useState(null) - - useEffect(() => { - const fetchData = async () => { - try { - const result = await authClient.getSession() - if (result.data != null) { - setLogedin(result.data.user); - } - } catch (error) { - console.error('Error fetching data:', error); - } - }; - - fetchData(); - }, []); + const { data: session } = authClient.useSession() return (
- +
@@ -52,8 +35,8 @@ export default function Home() { onConfigChange={setTunnelConfig} selectedServer={selectedServer} onServerSelect={setSelectedServer} - isAuthenticated={logedin != null ? true : false} - userId={logedin?.sshIdentifier} + isAuthenticated={Boolean(session)} + userId={session?.user?.sshIdentifier} />
diff --git a/app/settings/page.tsx b/app/settings/page.tsx index 98c2754..2f12016 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -1,40 +1,36 @@ "use client" -import { useEffect, useState } from "react" +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; import { authClient } from "@/lib/auth-client" import SiteHeader from "@/components/site-header" import SiteFooter from "@/components/site-footer" export default function SettingsPage() { - type SessionResponse = Awaited> - const [session, setSession] = useState(null) const [requireAuth, setRequireAuth] = useState(true) const [message, setMessage] = useState(null) + const { data: session, isPending } = authClient.useSession(); + const router = useRouter(); useEffect(() => { - const loadSession = async () => { - try { - const result = await authClient.getSession() - if (result.data) { - setSession(result.data) - } - } catch (error) { - console.error("Failed to load session", error) - } + if (!isPending && !session) { + router.push('/login'); } + }, [session, isPending, router]); - loadSession() - }, []) - + if (isPending) { + return
Loading...
; + } + const handleToggle = (value: boolean) => { setRequireAuth(value) setMessage(value ? "Authentication required for tunnel requests" : "Authentication not required for tunnel requests") setTimeout(() => setMessage(null), 2500) } - return ( + return session ? (
- +
@@ -80,5 +76,5 @@ export default function SettingsPage() {
- ) + ) : null; } diff --git a/components/site-header.tsx b/components/site-header.tsx index b7dd32b..c212167 100644 --- a/components/site-header.tsx +++ b/components/site-header.tsx @@ -3,29 +3,16 @@ import Link from "next/link" import TunnlLogo from "./tunnl-logo" import UserMenu from "./user-menu" -import { useEffect, useState } from "react" import { authClient } from "@/lib/auth-client"; import { redirect, RedirectType } from 'next/navigation' -export default function SiteHeader() { - type SessionData = Awaited>; - const [logedin, setLogedin] = useState(null) - - useEffect(() => { - const fetchData = async () => { - try { - const result = await authClient.getSession() - if (result.data != null) { - setLogedin(result.data.user); - } - } catch (error) { - console.error('Error fetching data:', error); - } - }; - - fetchData(); - }, []); +type UseSessionReturn = ReturnType; +type SessionType = UseSessionReturn extends { data: infer D } ? D : never; +type SiteHeaderProps = { + session?: SessionType; +}; +export default function SiteHeader({ session }: SiteHeaderProps) { const logout = async () => { await authClient.signOut({ fetchOptions: { @@ -47,12 +34,12 @@ export default function SiteHeader() {
- {logedin ? ( + {session ? (