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:
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);
}