draupnir4all-web

git clone git://archive.git.mtrnord.blog/MTRNord/draupnir4all-web.git
Log | Files | Refs | README | LICENSE

commit 05e75688e33d14a4639413565bea9946bcc19f1e
parent aaae763d59bb8d8db41ab096e878290074106af1
Author: MTRNord <mtrnord1@gmail.com>
Date:   Tue, 29 Apr 2025 20:51:03 +0200

Fix redirect bugs

Signed-off-by: MTRNord <mtrnord1@gmail.com>

Diffstat:
Msrc/app/login/page.tsx | 5+++++
Msrc/app/page.tsx | 37+++++++++++++++++++++++++------------
Msrc/app/register/page.tsx | 5+++++
Asrc/components/redirect-workaround.tsx | 33+++++++++++++++++++++++++++++++++
Msrc/contexts/session-context.tsx | 10----------
5 files changed, 68 insertions(+), 22 deletions(-)

diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx @@ -10,6 +10,7 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { useSession } from "@/contexts/session-context" import { redirect } from "next/navigation" +import RedirectionPageClient from "@/components/redirect-workaround" export default function LoginPage() { const [matrixId, setMatrixId] = useState("") @@ -62,6 +63,10 @@ export default function LoginPage() { } }, [login, matrixId, password]) + if (user) { + return <RedirectionPageClient redirectUrl="/dashboard" replace /> + } + return ( <div className="flex min-h-screen flex-col bg-black text-white"> <header className="border-b border-gray-800 bg-black py-4"> diff --git a/src/app/page.tsx b/src/app/page.tsx @@ -1,3 +1,4 @@ +"use client"; import Link from "next/link" import { Shield, Users, BarChart, Settings, AlertTriangle, CheckCircle, Ban, Eye, LogIn, Menu } from "lucide-react" import { Sheet, SheetContent, SheetTitle, SheetTrigger } from "@/components/ui/sheet" @@ -5,11 +6,14 @@ import { Sheet, SheetContent, SheetTitle, SheetTrigger } from "@/components/ui/s import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { VisuallyHidden } from "@radix-ui/react-visually-hidden"; +import { useSession } from "@/contexts/session-context" export const experimental_ppr = true const d4all_support_url = process.env.NEXT_PUBLIC_D4ALL_SUPPORT_URL || "#" export default function Home() { + const { user } = useSession() + return ( <div className="flex min-h-screen flex-col bg-black text-white"> <header className="sticky top-0 z-10 border-b border-gray-800 bg-black/80 backdrop-blur-sm"> @@ -37,18 +41,27 @@ export default function Home() { </nav> <div className="flex items-center gap-4"> <div className="hidden md:flex items-center gap-4"> - <Link href="/login"> - <Button - variant="outline" - className="border-purple-500 text-purple-400 hover:bg-purple-950 hover:text-purple-300" - > - <LogIn className="mr-2 h-4 w-4" /> - Log In - </Button> - </Link> - <Link href="/register"> - <Button className="bg-purple-600 text-white hover:bg-purple-700">Register</Button> - </Link> + {user ? ( + <Link href="/dashboard"> + <Button className="bg-purple-600 text-white hover:bg-purple-700">Dashboard</Button> + </Link> + ) : + ( + <> + <Link href="/login"> + <Button + variant="outline" + className="border-purple-500 text-purple-400 hover:bg-purple-950 hover:text-purple-300" + > + <LogIn className="mr-2 h-4 w-4" /> + Log In + </Button> + </Link> + <Link href="/register"> + <Button className="bg-purple-600 text-white hover:bg-purple-700">Register</Button> + </Link> + </> + )} </div> <Sheet> <SheetTrigger asChild> diff --git a/src/app/register/page.tsx b/src/app/register/page.tsx @@ -9,6 +9,7 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { useSession } from "@/contexts/session-context" import { redirect } from "next/navigation" +import RedirectionPageClient from "@/components/redirect-workaround" export default function RegisterPage() { const { isLoading, register, discoveryStatus, homeserverUrl, discoverHomeserver, user } = useSession(); @@ -60,6 +61,10 @@ export default function RegisterPage() { } }, [register, matrixId, password]) + if (user) { + return <RedirectionPageClient redirectUrl="/dashboard" replace /> + } + return ( <div className="flex min-h-screen flex-col bg-black text-white"> <header className="border-b border-gray-800 bg-black py-4"> diff --git a/src/components/redirect-workaround.tsx b/src/components/redirect-workaround.tsx @@ -0,0 +1,32 @@ +"use client"; +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +export default function RedirectionPageClient({ redirectUrl, replace }: { redirectUrl: string; replace?: boolean }) { + const router = useRouter(); + useEffect(() => { + if (replace) { + router.replace(redirectUrl); + } else { + router.push(redirectUrl); + } + }, [redirectUrl, replace, router]); + return ( + <div className="flex h-full w-full min-h-screen min-w-screen flex-col bg-black text-white items-center justify-center"> + <h1 className="text-2xl font-bold">Redirecting...</h1> + <p className="mt-4">If you are not redirected automatically, please click the button below.</p> + <button + className="mt-4 px-4 py-2 bg-purple-500 text-white rounded hover:bg-purple-600" + onClick={() => { + if (replace) { + router.replace(redirectUrl); + } + else { + router.push(redirectUrl); + } + }} + > + Go to {redirectUrl} + </button> + </div> + ) +} +\ No newline at end of file diff --git a/src/contexts/session-context.tsx b/src/contexts/session-context.tsx @@ -1,7 +1,6 @@ "use client"; import { createContext, useCallback, useContext, useEffect, useState, type ReactNode } from "react"; -import { useRouter } from "next/navigation"; import { generateOpenIDToken, login as realLogin, logout as realLogout } from "@/lib/clientSideAuth"; import { User } from "@/lib/auth"; @@ -27,7 +26,6 @@ export function SessionProvider({ children }: { children: ReactNode }) { const [discoveryStatus, setDiscoveryStatus] = useState<"idle" | "loading" | "success" | "error">("idle"); const [accessToken, setAccessToken] = useState<string | undefined>(); const [openidExpiration, setOpenIDExpiration] = useState<number | undefined>(); - const router = useRouter(); // Restore session from cookies on initial load useEffect(() => { @@ -170,9 +168,6 @@ export function SessionProvider({ children }: { children: ReactNode }) { // Persist access token and expiration in sessionStorage sessionStorage.setItem("accessToken", accessToken); sessionStorage.setItem("openidExpiration", expires_in.toString()); - - - router.replace("/dashboard"); } catch (error) { console.error("Login failed:", error); throw error; @@ -213,9 +208,6 @@ export function SessionProvider({ children }: { children: ReactNode }) { // Persist access token and expiration in sessionStorage sessionStorage.setItem("accessToken", accessToken); sessionStorage.setItem("openidExpiration", expires_in.toString()); - - - router.replace("/dashboard"); } catch (error) { console.error("Login failed:", error); throw error; @@ -239,8 +231,6 @@ export function SessionProvider({ children }: { children: ReactNode }) { // Clear sessionStorage sessionStorage.removeItem("accessToken"); sessionStorage.removeItem("openidExpiration"); - - router.push("/"); } catch (error) { console.error("Logout failed:", error); }