diff --git a/frontend/app/package-lock.json b/frontend/app/package-lock.json
index b92bd66..34da32a 100644
--- a/frontend/app/package-lock.json
+++ b/frontend/app/package-lock.json
@@ -13,7 +13,8 @@
"antd": "^5.15.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
- "react-redux": "^9.1.0"
+ "react-redux": "^9.1.0",
+ "react-router-dom": "^6.22.3"
},
"devDependencies": {
"@rsbuild/core": "^0.5.4",
@@ -424,6 +425,14 @@
}
}
},
+ "node_modules/@remix-run/router": {
+ "version": "1.15.3",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz",
+ "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@rsbuild/core": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-0.5.4.tgz",
@@ -4012,6 +4021,36 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-router": {
+ "version": "6.22.3",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz",
+ "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==",
+ "dependencies": {
+ "@remix-run/router": "1.15.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.22.3",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz",
+ "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==",
+ "dependencies": {
+ "@remix-run/router": "1.15.3",
+ "react-router": "6.22.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
"node_modules/redux": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
diff --git a/frontend/app/package.json b/frontend/app/package.json
index 1a0092f..a9e8f08 100644
--- a/frontend/app/package.json
+++ b/frontend/app/package.json
@@ -13,7 +13,8 @@
"antd": "^5.15.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
- "react-redux": "^9.1.0"
+ "react-redux": "^9.1.0",
+ "react-router-dom": "^6.22.3"
},
"devDependencies": {
"@rsbuild/core": "^0.5.4",
diff --git a/frontend/app/src/App.css b/frontend/app/src/App.css
index 164c0a6..525cd30 100644
--- a/frontend/app/src/App.css
+++ b/frontend/app/src/App.css
@@ -11,7 +11,6 @@ body {
line-height: 1.1;
text-align: center;
flex-direction: column;
- justify-content: center;
}
.content h1 {
diff --git a/frontend/app/src/App.tsx b/frontend/app/src/App.tsx
index 12a9cd2..51eb2c0 100644
--- a/frontend/app/src/App.tsx
+++ b/frontend/app/src/App.tsx
@@ -6,6 +6,7 @@ import { theme } from "./config/style";
import { Provider } from "react-redux";
import { store } from "./config/store";
import { MessageInstance } from "antd/es/message/interface";
+import AppRoutes from "./pages/AppRoutes";
export const MessageContext = createContext({} as MessageInstance);
@@ -21,6 +22,7 @@ const App = () => {
diff --git a/frontend/app/src/components/AuthModal.tsx b/frontend/app/src/components/AuthModal.tsx
index ca64c86..6ae2abd 100644
--- a/frontend/app/src/components/AuthModal.tsx
+++ b/frontend/app/src/components/AuthModal.tsx
@@ -17,17 +17,16 @@ const AuthModal = (props: {
const [loginForm] = Form.useForm();
const [registerForm] = Form.useForm();
+ const { data, refetch, isFetching, isError } = useGetUserQuery({});
+ useEffect(() => {
+ if (!isFetching && !isError) {
+ store.dispatch(updateUser(data));
+ }
+ }, [data, isFetching, useGetUserQuery]);
+
const [current, setCurrent] = useState("login");
const messageApi = useContext(MessageContext);
- // const { data, refetch, isFetching, isError } = useGetUserQuery({});
- // useEffect(() => {
- // console.log(data);
- // if (!isFetching && !isError) {
- // store.dispatch(updateUser(data));
- // }
- // }, [data, isFetching, useGetUserQuery]);
-
const [loginUser, { isLoading: isLoggingIn }] = useLoginMutation();
const [registerUser, { isLoading: isRegistering }] = useRegisterMutation();
@@ -41,6 +40,7 @@ const AuthModal = (props: {
.then((data) => {
store.dispatch(updateToken(data.access_token));
})
+ .then(() => refetch())
.then(() => props.setOpen(false))
.catch(() => messageApi.error("Login failed!"));
};
diff --git a/frontend/app/src/components/HeaderComponent.tsx b/frontend/app/src/components/HeaderComponent.tsx
index 8e9e229..b91ed21 100644
--- a/frontend/app/src/components/HeaderComponent.tsx
+++ b/frontend/app/src/components/HeaderComponent.tsx
@@ -1,10 +1,10 @@
-import { UserOutlined } from "@ant-design/icons";
-import { Layout, Menu, MenuProps } from "antd";
+import { LogoutOutlined, UserOutlined } from "@ant-design/icons";
+import { Button, Layout, Menu, MenuProps, Tooltip } from "antd";
import React, { useEffect, useState } from "react";
import AuthModal from "./AuthModal";
import "./styles.css";
-import { getLocalToken, store, updateUser } from "../config/store";
-import { User, useGetUserQuery } from "../slice/AuthApi";
+import { StorePrototype, logOut, store } from "../config/store";
+import { useSelector } from "react-redux";
const { Header } = Layout;
@@ -12,31 +12,43 @@ type NullableUser = { name: string | null; username: string } | null;
const HeaderComponent = () => {
const [authModalOpen, setAuthModalOpen] = useState(false);
- store.dispatch(getLocalToken());
- const user: NullableUser = store.getState().auth.user;
- // useEffect(() => {
- // console.log(data);
- // if (!isFetching && !isError) {
- // store.dispatch(updateUser(data));
- // }
- // }, [data, isFetching, useGetUserQuery]);
+ const user: NullableUser = useSelector(
+ (state: StorePrototype) => state.auth.user
+ );
- console.log(store.getState());
+ // const userMenuItems: MenuProps["userMenuItems"] = [
+ // {
+ // label: ,
+ // key: "logout",
+ // icon: ,
+ // onClick: () => store.dispatch(logOut()),
+ // },
+ // ]
const items: MenuProps["items"] = [
{
- label: user ? user.username : "Log In",
+ label: user ? (
+ store.dispatch(logOut())}>Log out
+ }
+ >
+ {user.username}
+
+ ) : (
+ "Log In"
+ ),
key: "login",
icon: ,
- onClick: () => setAuthModalOpen(true),
+ onClick: () => !user && setAuthModalOpen(true),
},
];
return (
<>
-
+