From 21b112f460e4b7e015fcb2b56e9e6fc562307e0b Mon Sep 17 00:00:00 2001 From: codey Date: Wed, 26 Nov 2025 10:08:24 -0500 Subject: [PATCH] login page / auth flow changes --- public/images/favicon.png | Bin 0 -> 6472 bytes src/assets/styles/global.css | 3 +++ src/components/AppLayout.jsx | 3 ++- src/components/Login.jsx | 30 +++++++++++++++++++++++++++--- src/pages/TRip/index.astro | 2 -- src/pages/TRip/requests.astro | 2 -- src/pages/lighting.astro | 2 -- src/pages/login.astro | 6 +++++- 8 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 public/images/favicon.png diff --git a/public/images/favicon.png b/public/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2907614b8514daa80662a3970216e90b467fc3 GIT binary patch literal 6472 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 literal 0 HcmV?d00001 diff --git a/src/assets/styles/global.css b/src/assets/styles/global.css index 814df3c..c23e3ef 100644 --- a/src/assets/styles/global.css +++ b/src/assets/styles/global.css @@ -216,6 +216,9 @@ Custom .btn { margin-top: 1.5% !important; + font-weight: 600; + font-size: 15px; + letter-spacing: 0.01em; } .hr { diff --git a/src/components/AppLayout.jsx b/src/components/AppLayout.jsx index ad95a3c..9f0dbcc 100644 --- a/src/components/AppLayout.jsx +++ b/src/components/AppLayout.jsx @@ -19,6 +19,7 @@ const Player = lazy(() => import('./AudioPlayer.jsx')); export default function Root({ child, user = undefined, ...props }) { window.toast = toast; const theme = document.documentElement.getAttribute("data-theme") + const loggedIn = props.loggedIn ?? Boolean(user); usePrimeReactThemeSwitcher(theme); return ( @@ -34,7 +35,7 @@ export default function Root({ child, user = undefined, ...props }) { color="danger"> Work in progress... bugs are to be expected. */} - {child == "LoginPage" && ()} + {child == "LoginPage" && ()} {child == "LyricSearch" && ()} {child == "Player" && ()} {child == "Memes" && } diff --git a/src/components/Login.jsx b/src/components/Login.jsx index 0a1022e..93e97db 100644 --- a/src/components/Login.jsx +++ b/src/components/Login.jsx @@ -1,4 +1,5 @@ import React, { useState, useRef, useEffect } from "react"; +import Button from "@mui/joy/Button"; import { toast } from "react-toastify"; import { API_URL } from "@/config"; @@ -13,7 +14,7 @@ function clearCookie(name) { document.cookie = `${name}=; Max-Age=0; path=/;`; } -export default function LoginPage() { +export default function LoginPage({ loggedIn = false }) { const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); @@ -79,8 +80,7 @@ export default function LoginPage() { toast.success("Login successful!", { toastId: "login-success-toast", }); - const returnTo = getCookie("returnTo") || "/TRip"; - clearCookie("returnTo"); + const returnTo = "/"; window.location.href = returnTo; } else { toast.error("Login failed: no access token received", { @@ -97,6 +97,30 @@ export default function LoginPage() { } } + if (loggedIn) { + return ( +
+
+ Logo +

You're already logged in

+

You do not have permission to access this resource. +

+

+ If you feel you have received this message in error, scream at codey. +

+ +
+
+ ); + } + return (
diff --git a/src/pages/TRip/index.astro b/src/pages/TRip/index.astro index d175729..5004cf4 100644 --- a/src/pages/TRip/index.astro +++ b/src/pages/TRip/index.astro @@ -6,8 +6,6 @@ import { requireAuthHook } from "@/hooks/requireAuthHook"; const user = await requireAuthHook(Astro); if (!user) { - const decodedUrl = decodeURIComponent(Astro.url.pathname + Astro.url.search); - Astro.cookies.set('returnTo', decodedUrl, { path: '/' }); return Astro.redirect('/login'); } diff --git a/src/pages/TRip/requests.astro b/src/pages/TRip/requests.astro index 8a8ae1a..d3dc836 100644 --- a/src/pages/TRip/requests.astro +++ b/src/pages/TRip/requests.astro @@ -6,8 +6,6 @@ import { requireAuthHook } from "@/hooks/requireAuthHook"; const user = await requireAuthHook(Astro); if (!user) { - const decodedUrl = decodeURIComponent(Astro.url.pathname + Astro.url.search); - Astro.cookies.set('returnTo', decodedUrl, { path: '/' }); return Astro.redirect('/login'); } diff --git a/src/pages/lighting.astro b/src/pages/lighting.astro index 3fc3228..6012c3f 100644 --- a/src/pages/lighting.astro +++ b/src/pages/lighting.astro @@ -6,8 +6,6 @@ import { requireAuthHook } from "@/hooks/requireAuthHook"; const user = await requireAuthHook(Astro); if (!user || !user.roles.includes('lighting')) { - const decodedUrl = decodeURIComponent(Astro.url.pathname + Astro.url.search); - Astro.cookies.set('returnTo', decodedUrl, { path: '/' }); return Astro.redirect('/login'); } --- diff --git a/src/pages/login.astro b/src/pages/login.astro index edab326..ecf7133 100644 --- a/src/pages/login.astro +++ b/src/pages/login.astro @@ -2,11 +2,15 @@ import LoginPage from '@/components/Login.jsx'; import Base from "@/layouts/Base.astro"; import Root from "@/components/AppLayout.jsx"; +import { requireAuthHook } from '@/hooks/requireAuthHook'; +const user = await requireAuthHook(Astro); +const isLoggedIn = Boolean(user); + ---
- +
\ No newline at end of file