diff --git a/packages/frontend/src/components/auth-provider.tsx b/packages/frontend/src/components/auth-provider.tsx index df3c55f..f6804ac 100644 --- a/packages/frontend/src/components/auth-provider.tsx +++ b/packages/frontend/src/components/auth-provider.tsx @@ -1,16 +1,10 @@ import type { UserRecord } from "@issue/shared"; -import { AlertTriangle } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import Loading from "@/components/loading"; import LogInForm from "@/components/login-form"; import { getServerURL } from "@/lib/utils"; -type AuthProviderProps = { - children: React.ReactNode; - loggedInDefault?: boolean; -}; - -export function Auth({ children }: AuthProviderProps) { +export function Auth({ children }: { children: React.ReactNode; loggedInDefault?: boolean }) { const [loggedIn, setLoggedIn] = useState(); const fetched = useRef(false); @@ -49,19 +43,6 @@ export function Auth({ children }: AuthProviderProps) { if (loggedIn === false) return (
- {/* under construction warning */} -
- -

- This application is currently under construction. Your data is very likely to be lost - at some point. -

 
-

- It is not recommended for production use. -

- But you're more than welcome to have a look around! -

-
); diff --git a/packages/frontend/src/components/login-form.tsx b/packages/frontend/src/components/login-form.tsx index e3d09f5..893753d 100644 --- a/packages/frontend/src/components/login-form.tsx +++ b/packages/frontend/src/components/login-form.tsx @@ -1,13 +1,27 @@ /** biome-ignore-all lint/correctness/useExhaustiveDependencies: <> */ + +import { AlertTriangle, X } from "lucide-react"; import { useEffect, useState } from "react"; +import Avatar from "@/components/avatar"; import { ServerConfigurationDialog } from "@/components/server-configuration-dialog"; import { Button } from "@/components/ui/button"; +import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; import { Field } from "@/components/ui/field"; import { Label } from "@/components/ui/label"; import { UploadAvatar } from "@/components/upload-avatar"; import { capitalise, cn, getServerURL } from "@/lib/utils"; +const DEMO_USERS = [ + { name: "User 1", username: "u1", password: "a" }, + { name: "User 2", username: "u2", password: "a" }, +]; + export default function LogInForm() { + const [loginDetailsOpen, setLoginDetailsOpen] = useState(false); + const [showWarning, setShowWarning] = useState(() => { + return localStorage.getItem("hide-under-construction") !== "true"; + }); + const [mode, setMode] = useState<"login" | "register">("login"); const [name, setName] = useState(""); @@ -114,100 +128,170 @@ export default function LogInForm() { }; return ( -
-
-
- - {capitalise(mode)} + <> + {/* under construction warning */} + {showWarning && ( +
+ + +

+ This application is currently under construction. Your data is very likely to be lost + at some point. +

 
+

+ It is not recommended for production use. +

+ But you're more than welcome to have a look around! + + + Login Details + + +
+ {DEMO_USERS.map((user) => ( + + ))} +
+
+
+

+
+ )} +
+ +
+ + {capitalise(mode)} -
- {mode === "register" && ( +
+ {mode === "register" && ( + <> + + setName(e.target.value)} + validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} + submitAttempted={submitAttempted} + spellcheck={false} + /> + + )} + setUsername(e.target.value)} + validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} + submitAttempted={submitAttempted} + spellcheck={false} + /> + setPassword(e.target.value)} + validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} + hidden={true} + submitAttempted={submitAttempted} + spellcheck={false} + /> +
+ + {mode === "login" ? ( <> - - setName(e.target.value)} - validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} - submitAttempted={submitAttempted} - spellcheck={false} - /> + + + + ) : ( + <> + + )} - setUsername(e.target.value)} - validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} - submitAttempted={submitAttempted} - spellcheck={false} - /> - setPassword(e.target.value)} - validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} - hidden={true} - submitAttempted={submitAttempted} - spellcheck={false} - />
- - {mode === "login" ? ( - <> - - - + +
+ {error !== "" ? ( + ) : ( - <> - - - + )}
- -
- {error !== "" ? ( - - ) : ( - - )}
-
+ ); }