import React, { useState, useEffect, useContext, memo } from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import OrganizationTab from '../components/OrganizationTab.jsx'; import PartnerTab from '../components/PartnerTab.jsx'; import UserManagmentTab from '../components/UserManagmentTab.jsx'; import CacheView from "../components/CacheView.jsx"; import Files from "../components/Files.jsx"; import AppAuthTab from "../components/AppAuthTab.jsx"; import SchedulesTab from "../components/SchedulesTab.jsx"; import EnvironmentTab from "../components/EnvironmentTab.jsx"; import TenantsTab from "../components/TenantsTab.jsx"; import { Business as BusinessIcon, PermIdentity as PermIdentityIcon, HttpsOutlined as HttpsOutlinedIcon, InsertDriveFileOutlined as InsertDriveFileOutlinedIcon, StorageOutlined as StorageOutlinedIcon, AccessTimeOutlined as AccessTimeOutlinedIcon, FmdGoodOutlined as FmdGoodOutlinedIcon, GroupOutlined as GroupOutlinedIcon } from '@mui/icons-material'; import theme, { getTheme } from '../theme.jsx'; import { Box, Button, Skeleton, Tooltip, Typography } from '@mui/material'; import { Index } from 'react-instantsearch-dom'; import { Context } from '../context/ContextApi.jsx'; import { toast } from 'react-toastify'; const PartnerIcon = ({ strokeColor, fillColor = 'transparent', width = 22, height = 22 }) => ( ); const AdminNavBar = (props) => { const location = useLocation(); const { globalUrl, userdata, isCloud,isOrgLoaded, isLoaded,removeCookie, handleStatusChange, selectedStatus, setSelectedStatus, handleEditOrg, serverside, notifications, handleGetOrg, orgId, checkLogin, setNotifications, stripeKey, setSelectedOrganization, selectedOrganization } = props; const [selectedItem, setSelectedItem] = useState("Organization"); const [isSelectedFiles, setIsSelectedFiles] = useState(true); const [isSelectedDataStore, setIsSelectedDataStore] = useState(true); const [isIntegrationPartner, setIsIntegrationPartner] = useState(false); const [isChildOrg, setIsChildOrg] = useState(false); const [isGlobalUser, setIsGlobalUser] = useState(false); const [visibleItems, setVisibleItems] = useState([]); const [isUserDataLoaded, setIsUserDataLoaded] = useState(false); useEffect(() => { if (userdata && userdata?.active_org?.id?.length > 0) { setIsUserDataLoaded(true); } }, [userdata]); const { themeMode, brandColor } = React.useContext(Context); const theme = getTheme(themeMode, brandColor); const HandlePartnerChange = () => { if (userdata?.id?.length > 0) { const isIntegrationPartner = userdata?.org_status?.includes("integration_partner") || false; setIsIntegrationPartner(isIntegrationPartner); const isChildOrg = userdata?.org_status?.includes("sub_org") || false; setIsChildOrg(isChildOrg); const isGlobalUser = userdata?.active_org?.branding?.global_user || false; setIsGlobalUser(isGlobalUser); } else { setIsIntegrationPartner(false); setIsChildOrg(false); setIsGlobalUser(false); } } useEffect(() => { if (userdata && userdata?.id?.length > 0) { HandlePartnerChange(); } }, [userdata]); const HandleVisibleTabs = () => { if (userdata?.id?.length > 0) { if (userdata?.active_org?.role === "admin" || userdata?.support) { if (isChildOrg) { const filteredItems = items.filter(item => item.text !== "Partner"); setVisibleItems(filteredItems); }else { setVisibleItems(items); } }else { const filteredItems = items.filter(item => item.text !== "Users" && item.text !== "Files" && item.text !== "Datastore" && item.text !== "Triggers" && item.text !== "Locations" && item.text !== "Partner"); setVisibleItems(filteredItems); } } } useEffect(() => { if (isIntegrationPartner && isChildOrg && !isGlobalUser) { // Filter out Users and Tenants tabs if (userdata?.active_org?.role === "admin" || userdata?.support) { const filteredItems = items.filter(item => item.text !== "Users" && item.text !== "Tenants" && item.text !== "Partner" ); setVisibleItems(filteredItems); }else { const filteredItems = items.filter(item => item.text !== "Users" && item.text !== "Partner" && item.text !== "Tenants" && item.text !== "Files" && item.text !== "Datastore" && item.text !== "Triggers" && item.text !== "Locations" ); setVisibleItems(filteredItems); } } else { HandleVisibleTabs(); } }, [isIntegrationPartner, isChildOrg, isGlobalUser, selectedOrganization, userdata]); const navigate = useNavigate(); //const leadinfo = selectedOrganization.lead_info === undefined || selectedOrganization.lead_info === null || selectedOrganization.lead_info === "" ? "" : JSON.stringify(selectedOrganization.lead_info) //const isPartner = leadinfo.includes("partner") useEffect(() => { const queryParams = new URLSearchParams(location.search); const tabName = queryParams.get('tab'); const partnerTab = queryParams.get('partner_tab'); // if(!isCloud){ // if(tabName === "partner" || partnerTab !== null) { // setSelectedItem("Organization"); // navigate(`?tab=organization`, { replace: true }); // } // } if (partnerTab) { setSelectedItem("Partner"); } if (tabName === "environments") { setSelectedItem("Locations"); } else if (tabName === "suborgs") { setSelectedItem("Tenants"); }else if (tabName === "cache") { setSelectedItem("Datastore"); }else if (tabName) { setSelectedItem(tabName.charAt(0).toUpperCase() + tabName.slice(1)); }else if (tabName === "partner") { setSelectedItem("Partner"); } }, [location.search]); const items = [ { iconSrc: , alt: "Organization Icon", text: "Organization", component: OrganizationTab, props: { isIntegrationPartner, isChildOrg, isGlobalUser,globalUrl,removeCookie, selectedStatus, isLoaded, setSelectedStatus, handleStatusChange, handleEditOrg, handleGetOrg, userdata, isCloud, serverside, notifications, checkLogin, setNotifications, stripeKey, setSelectedOrganization, selectedOrganization } }, { iconSrc: undefined, alt: "Partner Icon", text: "Partner", component: PartnerTab, props: { globalUrl,removeCookie, isLoaded, handleGetOrg, userdata, isCloud, serverside, checkLogin, setSelectedOrganization, selectedOrganization } }, { iconSrc: , alt: "Users Icon", text: "Users", component: UserManagmentTab, props: { globalUrl, userdata, serverside, isCloud, selectedOrganization, setSelectedOrganization, handleEditOrg } }, { iconSrc: , alt: "App Auth Icon", text: "App_auth", component: AppAuthTab, props: { globalUrl, userdata, isCloud, selectedOrganization } }, { iconSrc: , alt: "Datastore Icon", text: "Datastore", component: CacheView, props: { globalUrl, userdata, selectedOrganization, serverside, isSelectedDataStore, orgId , isCloud} }, { iconSrc: , alt: "Files Icon", text: "Files", component: Files, props: { isCloud, globalUrl, userdata, serverside, selectedOrganization, isSelectedFiles } }, { iconSrc: , alt: "Trigger Icon", text: "Triggers", component: SchedulesTab, props: { globalUrl, userdata, isCloud, serverside } }, { iconSrc: , alt: "Environments Icon", text: "Locations", component: EnvironmentTab, props: { globalUrl, userdata, isCloud, selectedOrganization } }, { iconSrc: , alt: "Tenants Icon", text: "Tenants", component: TenantsTab, props: {isCloud, globalUrl, userdata, serverside, selectedOrganization, setSelectedOrganization, checkLogin } } ].filter(Boolean); const setConfig = (newValue) => { setSelectedItem(newValue); if (newValue === "App Auth") { const tabName = newValue.toLowerCase().replace(/\s+/g, '_'); navigate(`?tab=${tabName}`, { replace: true }); } else { const tabName = newValue.toLowerCase().replace(/\s+/g, '_'); navigate(`?tab=${tabName}`, { replace: true }); } }; useEffect(() => { if (isIntegrationPartner && isChildOrg && !isGlobalUser && isOrgLoaded && isUserDataLoaded) { const queryParams = new URLSearchParams(location.search); const tabName = queryParams?.get('admin_tab')?.toLowerCase(); if (tabName === "sso" || tabName === "branding") { toast.info("You are not allowed to access this tab. Please contact your admin for more information. Redirecting to Organization Configuration tab."); setTimeout(() => { setSelectedItem("Organization"); navigate(`?admin_tab=org_config`, { replace: true }); window.location.reload(); } , 3000); } const params = new URLSearchParams(location.search); const tab = params?.get('tab')?.toLowerCase(); if (tab === "users" || tab === "tenants" || tab === "partner") { toast.info("You are not allowed to access this tab. Please contact your admin for more information. Redirecting to Organization Configuration tab."); setTimeout(() => { setSelectedItem("Organization"); navigate(`?admin_tab=org_config`, { replace: true }); window.location.reload(); } , 3000); } } else if (userdata && isOrgLoaded && isUserDataLoaded && userdata?.active_org?.role !== "admin" && !userdata?.support) { const queryParams = new URLSearchParams(location.search); const tabName = queryParams?.get('admin_tab')?.toLowerCase(); // SSO tab is now accessible to non-admins (removed restriction) const params = new URLSearchParams(location.search); const tab = params?.get('tab')?.toLowerCase(); if (tab === "users" || tab === "locations" || tab === "environments" || tab === "files" || tab === "datastore" || tab === "triggers") { toast.info("You are not allowed to access this tab. Please contact your admin for more information. Redirecting to Organization Configuration tab."); setTimeout(() => { setSelectedItem("Organization"); navigate(`?admin_tab=org_config`, { replace: true }); window.location.reload(); } , 3000); } } }, [isIntegrationPartner, isChildOrg, isGlobalUser, location.search, userdata, isOrgLoaded, isUserDataLoaded]); const renderComponent = () => { const selectedItemData = visibleItems.find(item => item.text === selectedItem); if (!selectedItemData) { setSelectedItem("Organization"); // If no tab is specified, default to "Organization" tab return ; }; const ComponentToRender = selectedItemData.component; const componentProps = selectedItemData.props; const updatedProps = { ...componentProps, notifications: notifications, setNotifications: setNotifications, userdata: userdata, selectedOrganization: selectedOrganization }; return ; }; const defaultImage = "/images/logos/orange_logo.svg" const imageData = selectedOrganization?.image === undefined || selectedOrganization?.image.length === 0 ? defaultImage : selectedOrganization?.image; return ( !isOrgLoaded || !isUserDataLoaded ? :
{renderComponent()}
); }; export default AdminNavBar; const Loader = () => { const dummyNavItems = Array.from({ length: 6 }); const dummyTabItems = ['Org Configuration', 'SSO', 'Notifications', 'Billing & Stats', 'Branding']; const { leftSideBarOpenByClick, windowWidth, themeMode } = useContext(Context); const theme = getTheme(themeMode); return (
{/* Divider */} {/* Nav Items */}
{dummyNavItems.map((_, index) => (
))}
{dummyTabItems.map((_, index) => (
))}
{Array.from({ length: 2 }).map((_, index) => ( ))}
); }; const PaddingWrapper2 = memo(({ children }) => { return (
{children}
) }); const Wrapper2 = memo(({children}) => { return ( {children} ); }) const PaddingWrapper = memo(({ children }) => { const { leftSideBarOpenByClick, windowWidth } = useContext(Context); return (
{children}
); }); const Wrapper = memo(({ children }) => { return ( {children} ); })