From 7f2624b75ab4f53a0be0d103a0130f898ae22586 Mon Sep 17 00:00:00 2001 From: MiguelMLorente Date: Sun, 23 Nov 2025 15:48:21 +0100 Subject: [PATCH] Set up login/register navigation and API integration --- src/App.tsx | 33 +++++++++++++++++++++++---- src/api/client.ts | 13 ++++++++--- src/context/logged-in-page-context.ts | 8 +++++++ src/context/pre-login-page-context.ts | 8 +++++++ src/pages/Login.tsx | 20 ++++++++++++++-- src/pages/NotFound.tsx | 10 ++++++++ src/pages/Register.tsx | 20 ++++++++++++++-- 7 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 src/context/logged-in-page-context.ts create mode 100644 src/context/pre-login-page-context.ts create mode 100644 src/pages/NotFound.tsx diff --git a/src/App.tsx b/src/App.tsx index ea019c7..7ddbee4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,21 +2,44 @@ import "./App.css"; import { Login } from "./pages/Login.tsx"; import { ContentLayout, SpaceBetween } from "@cloudscape-design/components"; import icon from "./paella-icon.png"; -import { Route, Routes } from "react-router"; +import { Outlet, Route, Routes } from "react-router"; import { SignUp } from "./pages/SignUp.tsx"; import { Register } from "./pages/Register.tsx"; import { Buy } from "./pages/Buy.tsx"; +import { useState } from "react"; +import { PreLoginPageContext } from "./context/pre-login-page-context.ts"; +import { LoggedInPageContext } from "./context/logged-in-page-context.ts"; +import { NotFound } from "./pages/NotFound.tsx"; function App() { + const [userId, setUserId] = useState(null); + return ( App logo - } /> - } /> - } /> - } /> + + + + } + > + } /> + } /> + + + + + } + > + } /> + } /> + + } /> diff --git a/src/api/client.ts b/src/api/client.ts index 15e4c51..bd91879 100644 --- a/src/api/client.ts +++ b/src/api/client.ts @@ -1,13 +1,20 @@ -import axios from "axios"; +import axios, { type AxiosResponse } from "axios"; + +interface AccessResponse { + userId: number; +} export const login = (name: string, password: string) => axios.post("/access/login", { name, password, - }); + }) as Promise>; export const registerUser = (name: string, password: string) => axios.post("/access/register", { name, password, - }); + }) as Promise>; + +export const startBuyFlow = (userId: string) => + axios.post("/buy/start", { userId }); diff --git a/src/context/logged-in-page-context.ts b/src/context/logged-in-page-context.ts new file mode 100644 index 0000000..d8d9bc8 --- /dev/null +++ b/src/context/logged-in-page-context.ts @@ -0,0 +1,8 @@ +import { createContext } from "react"; + +interface LoggedInPageContextProps { + userId: number; +} + +export const LoggedInPageContext = + createContext(null); diff --git a/src/context/pre-login-page-context.ts b/src/context/pre-login-page-context.ts new file mode 100644 index 0000000..9b1cbeb --- /dev/null +++ b/src/context/pre-login-page-context.ts @@ -0,0 +1,8 @@ +import { createContext, type Dispatch, type SetStateAction } from "react"; + +interface PreLoginPageContextProps { + setUserId: Dispatch>; +} + +export const PreLoginPageContext = + createContext(null); diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 935f3a5..d941095 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -5,14 +5,25 @@ import { Header, SpaceBetween, } from "@cloudscape-design/components"; -import { useState } from "react"; +import { useContext, useState } from "react"; import { login } from "../api/client"; +import { Link, useNavigate } from "react-router"; +import { PreLoginPageContext } from "../context/pre-login-page-context"; export const Login = () => { const [userName, setUserName] = useState(""); const [password, setPassword] = useState(""); const [rememberMe, setRememberMe] = useState(false); + const { setUserId } = useContext(PreLoginPageContext)!; + const navigate = useNavigate(); + + const handleLoginFlow = () => + login(userName, password).then((response) => { + setUserId(response.data.userId); + navigate("/signup"); + }); + return (
Login
@@ -33,7 +44,12 @@ export const Login = () => { > Remember me - + +
); }; diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx new file mode 100644 index 0000000..e3941e4 --- /dev/null +++ b/src/pages/NotFound.tsx @@ -0,0 +1,10 @@ +import { useEffect } from "react"; +import { useNavigate } from "react-router"; + +export const NotFound = () => { + const navigate = useNavigate(); + useEffect(() => { + navigate("/login"); + }); + return
; +}; diff --git a/src/pages/Register.tsx b/src/pages/Register.tsx index eb92ddb..651502d 100644 --- a/src/pages/Register.tsx +++ b/src/pages/Register.tsx @@ -1,4 +1,4 @@ -import { useState } from "react"; +import { useContext, useState } from "react"; import { Alert, Button, @@ -8,11 +8,15 @@ import { } from "@cloudscape-design/components"; import * as zod from "zod"; import { registerUser } from "../api/client"; +import { Link, useNavigate } from "react-router"; +import { PreLoginPageContext } from "../context/pre-login-page-context"; export const Register = () => { const [userName, setUserName] = useState(""); const [password, setPassword] = useState(""); const [passwordConfirm, setPasswordConfirm] = useState(""); + const { setUserId } = useContext(PreLoginPageContext)!; + const navigate = useNavigate(); const PASSWORD_MAX_LENGTH = 64; const PASSWORD_MIN_LENGTH = 8; @@ -45,6 +49,13 @@ export const Register = () => { } } + const handleRegisterFlow = () => + registerUser(userName, password).then((response) => { + console.log(response); + setUserId(response.data.userId); + navigate("/signup"); + }); + return (
Register
@@ -70,10 +81,15 @@ export const Register = () => { ))} +
); };