-
-

-
-
- {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");