import { Outlet, useRouterState } from "@tanstack/react-router"; import Drawer from "../components/Drawer/Drawer"; import { useDrawerStore } from "../context/zustand-store/appStore"; import { checkIsMobile } from "../utils/checkIsMobile"; import BottomNavigation from "../screen/BottomNavigation"; import Navbar from "../screen/NavBar"; import Backdrop from "../components/BackDrop/Backdrop"; import Modal from "../components/Modal/Modal"; import { useUserProfileStore, useUserStore, } from "../context/zustand-store/userStore"; import "../App.css"; import { SideBar } from "../screen/SideBar"; import { motion, AnimatePresence } from "framer-motion"; import { useEffect, useRef, useState } from "react"; import { ItemWithSubItems } from "../types/userPermissions"; import { getUserPermissions } from "../utils/getUserAvalableItems"; import { getFaPermissions } from "../utils/getFaPermissions"; import Typography from "../components/Typography/Typography"; import { ArrowLeftIcon } from "@heroicons/react/24/outline"; import Divider from "../components/Divider/Divider"; import { RolesContextMenu } from "../components/Button/RolesContextMenu"; import { useApiRequest } from "../utils/useApiRequest"; const sidebarVariants = { hidden: { opacity: 0, x: 50 }, visible: { opacity: 1, x: 0, transition: { type: "spring", stiffness: 300, damping: 30, }, }, exit: { opacity: 0, x: 50, transition: { type: "tween", ease: "easeInOut", duration: 0.25, }, }, }; export const RootLayout = () => { const { drawerState } = useDrawerStore(); const contentRef = useRef(null); const { auth } = useUserStore(); const isMobile = checkIsMobile(); const location = useRouterState({ select: (state) => state.location }); const { profile } = useUserProfileStore(); // const [, setIsDark] = useDarkMode(); const [contextMenu, setContextMenu] = useState<{ x: number; y: number; } | null>(null); const [selectedAccess, setSelectedAccess] = useState(null); const menuItems: ItemWithSubItems[] = getUserPermissions( profile?.permissions ); const currentPath = window.location.pathname; const matchedItem = menuItems.find((item) => item.subItems.some( (sub) => sub.path === currentPath || sub.path === "/" + currentPath.split("/")[1] || sub.path.includes(currentPath.split("/")[1] + "/") ) ); const matchedSubItem = menuItems .flatMap((item) => item.subItems) .find( (sub) => sub.path === currentPath || sub.path.includes(currentPath.split("/")[1] + "/") ); const isAdmin = profile?.role?.type?.key === "ADM"; const { data: permissionsData } = useApiRequest({ api: "/auth/api/v1/permission/", method: "get", params: { page: 1, page_size: 1000 }, queryKey: ["all-permissions"], enabled: !!contextMenu && isAdmin, }); const handleSitemapContextMenu = (e: React.MouseEvent) => { if (!isAdmin) return; const pageKey = matchedSubItem?.name; if (!pageKey) return; e.preventDefault(); e.stopPropagation(); setContextMenu({ x: e.clientX, y: e.clientY }); }; useEffect(() => { if (contextMenu && permissionsData?.results && matchedSubItem?.name) { const firstNonModify = permissionsData.results.find( (p: any) => p.page === matchedSubItem.name && p.modify_state === false ) || null; setSelectedAccess(firstNonModify?.name || null); } }, [contextMenu, permissionsData, matchedSubItem?.name]); useEffect(() => { const closeOnClick = () => { if (contextMenu) setContextMenu(null); }; if (contextMenu) { document.addEventListener("click", closeOnClick); } return () => { document.removeEventListener("click", closeOnClick); }; }, [contextMenu]); useEffect(() => { contentRef.current?.scrollTo(0, 0); // if (!auth) { // setIsDark(false); // } }, [location.pathname]); return (
{auth && } {drawerState?.isOpen && } {auth && ( )} {window.location.pathname !== "/" && matchedItem?.fa && auth && !isMobile && (
{matchedItem?.fa} /{" "} {getFaPermissions(matchedSubItem?.name || "") || "نمایش"} {location.pathname !== "/" && (
window.history.back()} className="p-1 rounded-full cursor-pointer w-25" >
بازگشت
)}
)}
{isMobile && auth && } {contextMenu && isAdmin && matchedSubItem?.name && selectedAccess && ( setContextMenu(null)} isPage={true} /> )}
); };