From d0009e96a9cda1bf0979a014684ee5970528315e Mon Sep 17 00:00:00 2001 From: namnd Date: Tue, 9 Dec 2025 13:30:25 +0700 Subject: [PATCH] refactor ui user --- google6ea4f563230cd745.html | 1 + src/components/PopularPost/Popular.jsx | 76 +++++++++---------- .../app-layouts/user-layouts/FooterNav.jsx | 4 +- .../HeaderNav/GroupCategoryMenu.jsx | 53 ++++++++++--- src/services/userServices/groupServices.js | 10 +++ src/stores/user-store/UserStore.js | 11 +++ 6 files changed, 105 insertions(+), 50 deletions(-) create mode 100644 google6ea4f563230cd745.html diff --git a/google6ea4f563230cd745.html b/google6ea4f563230cd745.html new file mode 100644 index 0000000..3b73ae2 --- /dev/null +++ b/google6ea4f563230cd745.html @@ -0,0 +1 @@ +google-site-verification: google6ea4f563230cd745.html \ No newline at end of file diff --git a/src/components/PopularPost/Popular.jsx b/src/components/PopularPost/Popular.jsx index 7e59a0d..23f22c7 100644 --- a/src/components/PopularPost/Popular.jsx +++ b/src/components/PopularPost/Popular.jsx @@ -31,49 +31,47 @@ const Popular = ({ data }) => { ], }; return ( - <> -
- -
- - {data?.map((val) => { - return ( - -
-
-
-
- -
-
- {val?.category?.name} -
+
+ +
+ + {data?.map((val) => { + return ( + +
+
+
+
+
-
-

{val?.title}

- - - - - - - - +
+ {val?.category?.name}
+
+

{val?.title}

+ + + + + + + + +
- - ); - })} - -
-
- +
+ + ); + })} + +
+
); }; diff --git a/src/layouts/app-layouts/user-layouts/FooterNav.jsx b/src/layouts/app-layouts/user-layouts/FooterNav.jsx index a3a88b2..8be091c 100644 --- a/src/layouts/app-layouts/user-layouts/FooterNav.jsx +++ b/src/layouts/app-layouts/user-layouts/FooterNav.jsx @@ -1,7 +1,9 @@ import { Layout } from "antd"; +import { useMemo } from "react"; const { Footer } = Layout; const FooterNav = () => { - return ; + const currentYear = useMemo(() => new Date().getFullYear(), []); + return ; }; export default FooterNav; diff --git a/src/layouts/app-layouts/user-layouts/HeaderNav/GroupCategoryMenu.jsx b/src/layouts/app-layouts/user-layouts/HeaderNav/GroupCategoryMenu.jsx index e0bd5d7..7f5923e 100644 --- a/src/layouts/app-layouts/user-layouts/HeaderNav/GroupCategoryMenu.jsx +++ b/src/layouts/app-layouts/user-layouts/HeaderNav/GroupCategoryMenu.jsx @@ -1,28 +1,61 @@ -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { Flex } from "antd"; +import { DownOutlined } from "@ant-design/icons"; import "./menu.css"; import { useUserStore } from "@/stores/user-store/UserStore"; import { Link } from "react-router-dom"; const GroupCategoryMenu = () => { - const { groupCategories, getGroupCategories } = useUserStore(); + const { groups, getAllGroups } = useUserStore(); + const [openDropdown, setOpenDropdown] = useState(null); + useEffect(() => { - getGroupCategories(); - }, []); + getAllGroups(); + }, [getAllGroups]); + + const handleMouseEnter = (groupId) => { + setOpenDropdown(groupId); + }; + + const handleMouseLeave = () => { + setOpenDropdown(null); + }; + return ( - {groupCategories?.map((val) => { + {groups?.map((group) => { + const hasCategories = group?.categories && group.categories.length > 0; return (
handleMouseEnter(group?.id)} + onMouseLeave={handleMouseLeave} > - {val?.name} + + {group?.name} + {hasCategories && } + + + {/* Dropdown menu for categories */} + {hasCategories && openDropdown === group?.id && ( +
+ {group.categories.map((category) => ( + + {category?.name} + + ))} +
+ )}
); })} diff --git a/src/services/userServices/groupServices.js b/src/services/userServices/groupServices.js index e7ac40b..2c6c2d6 100644 --- a/src/services/userServices/groupServices.js +++ b/src/services/userServices/groupServices.js @@ -35,6 +35,16 @@ class groupServices { console.log(error); } } + static async getAllGroups() { + try { + const response = await axiosInstance.get(`/user/group`); + const data = response.data; + return data; + } catch (error) { + console.log(error); + return []; + } + } } export default groupServices; diff --git a/src/stores/user-store/UserStore.js b/src/stores/user-store/UserStore.js index 383f1e4..5d711d8 100644 --- a/src/stores/user-store/UserStore.js +++ b/src/stores/user-store/UserStore.js @@ -1,6 +1,7 @@ import { create } from "zustand"; import postServices from "@/services/userServices/postServices"; import userAuthServices from "@/services/authServices/userAuthServices"; +import groupServices from "@/services/userServices/groupServices"; export const useUserAuthStore = create((set) => ({ token: JSON.parse(localStorage.getItem("user"))?.token, @@ -28,6 +29,7 @@ export const useUserAuthStore = create((set) => ({ export const useUserStore = create((set) => ({ groupCategories: [], + groups: [], userIP: "", setGroupCategories: (groupCategories) => set({ groupCategories }), setUserIP: (userIP) => set({ userIP }), @@ -40,6 +42,15 @@ export const useUserStore = create((set) => ({ console.log(error); } }, + getAllGroups: async () => { + try { + const response = await groupServices.getAllGroups(); + set({ groups: response }); + } catch (error) { + console.log(error); + set({ groups: [] }); + } + }, getUserIP: async () => { try { const response = await fetch("/ipify");