diff --git a/src/app/(admin)/(others-pages)/profile/page.tsx b/src/app/(admin)/(others-pages)/profile/page.tsx index 68b9e4c..55896f9 100644 --- a/src/app/(admin)/(others-pages)/profile/page.tsx +++ b/src/app/(admin)/(others-pages)/profile/page.tsx @@ -9,14 +9,17 @@ import { MediaDto } from "@/interface/media"; import { UserMetaCardProps } from "@/interface/user"; import { apiGetCurrentUser } from "@/service/auth"; import { apiGetCurrentUserApplications, apiGetCurrentUserMedia } from "@/service/userService"; +import { setUserData } from "@/store/features/userSlice"; import { useEffect, useState } from "react"; +import { useDispatch } from "react-redux"; export default function Profile() { const [user, setUser] = useState(null); const [mediaData, setMediaData] = useState(null); const [applications, setApplications] = useState([]); const [loading, setLoading] = useState(true); - + const dispatch = useDispatch(); + useEffect(() => { const fetchUser = async () => { try { @@ -24,11 +27,12 @@ export default function Profile() { const mediaResponse = await apiGetCurrentUserMedia(); const userApplications = await apiGetCurrentUserApplications(); - console.log(userData); + console.log("user", userData); if (userApplications?.data) { setApplications(userApplications.data); } + dispatch(setUserData(userData.data)); setMediaData(mediaResponse); setUser(userData); diff --git a/src/app/testing/page.tsx b/src/app/testing/page.tsx index 611e5ee..7d02086 100644 --- a/src/app/testing/page.tsx +++ b/src/app/testing/page.tsx @@ -7,7 +7,7 @@ export default function GetUser() { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); - + useEffect(() => { const fetchUser = async () => { try { diff --git a/src/layout/AppSidebar.tsx b/src/layout/AppSidebar.tsx index ed71353..83bdd1f 100644 --- a/src/layout/AppSidebar.tsx +++ b/src/layout/AppSidebar.tsx @@ -117,25 +117,21 @@ const AppSidebar: React.FC = () => { // Lấy data gốc từ Redux (không bị render lại vô cớ) const rolesData = useSelector((state: RootState) => state.user.data?.roles); - // Chỉ tạo mảng map mới khi rolesData thực sự thay đổi const userRoles = useMemo(() => { return rolesData?.map((r: any) => r.name) || []; }, [rolesData]); - // 2. Logic lọc Menu theo Role const filterMenuByRole = useCallback((items: NavItem[]) => { return items .map((item) => ({ ...item, subItems: item.subItems?.filter((sub) => { - if (!sub.roles) return true; // Ai cũng xem được nếu không định nghĩa role + if (!sub.roles) return true; return sub.roles.some((role) => userRoles.includes(role)); }), })) .filter((item) => { - // Ẩn mục cha nếu nó yêu cầu role mà user không có if (item.roles && !item.roles.some((role) => userRoles.includes(role))) return false; - // Ẩn mục cha nếu các mục con đã bị lọc sạch (đối với menu dạng dropdown) if (item.subItems && item.subItems.length === 0 && !item.path) return false; return true; }); @@ -144,7 +140,6 @@ const AppSidebar: React.FC = () => { const filteredNavItems = useMemo(() => filterMenuByRole(ALL_NAV_ITEMS), [filterMenuByRole]); const filteredOthersItems = useMemo(() => filterMenuByRole(OTHERS_ITEMS), [filterMenuByRole]); - // --- State quản lý đóng mở Submenu --- const [openSubmenu, setOpenSubmenu] = useState<{ type: "main" | "others"; index: number;