From e12812d202aa31ba565100400f2a14312a302e86 Mon Sep 17 00:00:00 2001 From: nihonium Date: Sun, 26 Oct 2025 02:39:54 +0300 Subject: [PATCH] feat: frontend first routing implementation --- modules/frontend/package-lock.json | 57 ++++++++++++++++++- modules/frontend/package.json | 3 +- modules/frontend/src/App.tsx | 11 +++- .../src/components/UserPage/UserPage.tsx | 10 +++- 4 files changed, 74 insertions(+), 7 deletions(-) diff --git a/modules/frontend/package-lock.json b/modules/frontend/package-lock.json index b1789ed..6a06afb 100644 --- a/modules/frontend/package-lock.json +++ b/modules/frontend/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "axios": "^1.12.2", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.4" }, "devDependencies": { "@eslint/js": "^9.36.0", @@ -2061,6 +2062,15 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3346,6 +3356,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -3363,6 +3374,44 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.4.tgz", + "integrity": "sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.4.tgz", + "integrity": "sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.4" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3466,6 +3515,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/modules/frontend/package.json b/modules/frontend/package.json index c40ff17..b4977aa 100644 --- a/modules/frontend/package.json +++ b/modules/frontend/package.json @@ -12,7 +12,8 @@ "dependencies": { "axios": "^1.12.2", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.4" }, "devDependencies": { "@eslint/js": "^9.36.0", diff --git a/modules/frontend/src/App.tsx b/modules/frontend/src/App.tsx index 6b2ee5f..a88ad57 100644 --- a/modules/frontend/src/App.tsx +++ b/modules/frontend/src/App.tsx @@ -1,8 +1,15 @@ import React from "react"; +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import UserPage from "./components/UserPage/UserPage"; const App: React.FC = () => { - return ; + return ( + + + } /> + + + ); }; -export default App; +export default App; \ No newline at end of file diff --git a/modules/frontend/src/components/UserPage/UserPage.tsx b/modules/frontend/src/components/UserPage/UserPage.tsx index b0db90c..0a83679 100644 --- a/modules/frontend/src/components/UserPage/UserPage.tsx +++ b/modules/frontend/src/components/UserPage/UserPage.tsx @@ -1,17 +1,21 @@ import React, { useEffect, useState } from "react"; -import { DefaultService } from "../../api/services/DefaultService"; // adjust path +import { useParams } from "react-router-dom"; // <-- import +import { DefaultService } from "../../api/services/DefaultService"; import type { User } from "../../api/models/User"; import styles from "./UserPage.module.css"; const UserPage: React.FC = () => { + const { id } = useParams<{ id: string }>(); // <-- get user id from URL const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { + if (!id) return; + const getUserInfo = async () => { try { - const userInfo = await DefaultService.getUsers("1", "all"); + const userInfo = await DefaultService.getUsers(id, "all"); // <-- use dynamic id setUser(userInfo); } catch (err) { console.error(err); @@ -21,7 +25,7 @@ const UserPage: React.FC = () => { } }; getUserInfo(); - }, []); + }, [id]); if (loading) return
Loading...
; if (error) return
{error}
;