From 3b3838fc4f38017ff60a57e8f8b565ccf78b4fc0 Mon Sep 17 00:00:00 2001 From: ghaddaditw <40211818-ghaddaditw@users.noreply.replit.com> Date: Fri, 30 May 2025 17:32:21 +0000 Subject: [PATCH] Allow users to create accounts and securely access the application Adds user registration functionality and updates login logic in LoginPage.tsx. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 556aa286-edd2-4cea-8583-f4fc3cfd119b Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/81470e0d-8ae8-4335-9301-cd9a69e670fa/96467e4f-00f2-4d88-82b1-142a9b24784c.jpg --- .replit | 4 ++ .../Screenshot 2025-05-30 at 8.31.30 PM.png | Bin 0 -> 22991 bytes client/src/App.tsx | 2 +- client/src/pages/LoginPage.tsx | 55 ++++++++++++++---- 4 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 attached_assets/Screenshot 2025-05-30 at 8.31.30 PM.png diff --git a/.replit b/.replit index b5f2185..d8bdbf8 100644 --- a/.replit +++ b/.replit @@ -30,3 +30,7 @@ author = "agent" task = "shell.exec" args = "npm run dev" waitForPort = 5000 + +[[ports]] +localPort = 5000 +externalPort = 80 diff --git a/attached_assets/Screenshot 2025-05-30 at 8.31.30 PM.png b/attached_assets/Screenshot 2025-05-30 at 8.31.30 PM.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fa32243242396ade442753e3a96b864d346005 GIT binary patch literal 22991 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 literal 0 HcmV?d00001 diff --git a/client/src/App.tsx b/client/src/App.tsx index f600756..c767143 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -16,7 +16,7 @@ function Router() { - {/* */} + diff --git a/client/src/pages/LoginPage.tsx b/client/src/pages/LoginPage.tsx index 455a810..e23dcd1 100644 --- a/client/src/pages/LoginPage.tsx +++ b/client/src/pages/LoginPage.tsx @@ -14,14 +14,21 @@ import { Mic, Moon, Sun, Loader2, AlertCircle, CheckCircle2 } from "lucide-react import { cn } from "@/lib/utils"; export default function LoginPage() { - const [, setLocation] = useLocation(); - const { login, user } = useAuth(); + const [location, setLocation] = useLocation(); + const { login, register, user } = useAuth(); const { theme, toggleTheme } = useTheme(); const { toast } = useToast(); + const isRegisterMode = location === "/register"; + const [formData, setFormData] = useState({ email: "", password: "", + confirmPassword: "", + username: "", + firstName: "", + lastName: "", + role: "standard", rememberMe: false, }); const [isSubmitting, setIsSubmitting] = useState(false); @@ -39,17 +46,41 @@ export default function LoginPage() { setIsSubmitting(true); try { - await login(formData.email, formData.password); - - toast({ - title: "Welcome back!", - description: "You have successfully signed in.", - }); - - setLocation("/dashboard"); + if (isRegisterMode) { + if (formData.password !== formData.confirmPassword) { + setError("Passwords do not match"); + return; + } + + await register({ + username: formData.username, + email: formData.email, + password: formData.password, + confirmPassword: formData.confirmPassword, + firstName: formData.firstName, + lastName: formData.lastName, + role: formData.role, + }); + + toast({ + title: "Account created!", + description: "You have successfully registered. Please sign in.", + }); + + setLocation("/login"); + } else { + await login(formData.email, formData.password); + + toast({ + title: "Welcome back!", + description: "You have successfully signed in.", + }); + + setLocation("/dashboard"); + } } catch (error: any) { - console.error("Login error:", error); - setError(error.message || "Failed to sign in. Please check your credentials."); + console.error("Auth error:", error); + setError(error.message || `Failed to ${isRegisterMode ? 'register' : 'sign in'}. Please try again.`); } finally { setIsSubmitting(false); }