From e92d055c3057e374d78de714d40cb8d1c25f88b5 Mon Sep 17 00:00:00 2001 From: Yunus M Date: Wed, 8 Jan 2025 11:16:41 +0530 Subject: [PATCH] feat: enable billing and org-settings in workspace blocked state (#6761) * feat: enable billing and org-settings in workspace blocked state * feat: disable sidebar items in workspace blocked state --- frontend/src/AppRoutes/Private.tsx | 16 +++++++++++++++- .../SideNav/NavItem/NavItem.styles.scss | 7 +++++++ .../src/container/SideNav/NavItem/NavItem.tsx | 15 +++++++++++++-- frontend/src/container/SideNav/SideNav.tsx | 16 ++++++++++++++++ frontend/src/pages/Settings/index.tsx | 15 ++++++++++++--- frontend/src/pages/Settings/utils.ts | 7 +++++++ .../WorkspaceLocked.styles.scss | 8 ++++++++ .../pages/WorkspaceLocked/WorkspaceLocked.tsx | 18 ++++++++++++++++++ 8 files changed, 96 insertions(+), 6 deletions(-) diff --git a/frontend/src/AppRoutes/Private.tsx b/frontend/src/AppRoutes/Private.tsx index ab46d96a8e..162ca5de6b 100644 --- a/frontend/src/AppRoutes/Private.tsx +++ b/frontend/src/AppRoutes/Private.tsx @@ -11,6 +11,7 @@ import { useQuery } from 'react-query'; import { matchPath, useLocation } from 'react-router-dom'; import { LicenseState, LicenseStatus } from 'types/api/licensesV3/getActive'; import { Organization } from 'types/api/user/getOrganization'; +import { USER_ROLES } from 'types/roles'; import { isCloudUser } from 'utils/app'; import { routePermission } from 'utils/permission'; @@ -36,6 +37,8 @@ function PrivateRoute({ children }: PrivateRouteProps): JSX.Element { activeLicenseV3, isFetchingActiveLicenseV3, } = useAppContext(); + + const isAdmin = user.role === USER_ROLES.ADMIN; const mapRoutes = useMemo( () => new Map( @@ -113,7 +116,17 @@ function PrivateRoute({ children }: PrivateRouteProps): JSX.Element { const navigateToWorkSpaceBlocked = (route: any): void => { const { path } = route; - if (path && path !== ROUTES.WORKSPACE_LOCKED) { + const isRouteEnabledForWorkspaceBlockedState = + isAdmin && + (path === ROUTES.ORG_SETTINGS || + path === ROUTES.BILLING || + path === ROUTES.MY_SETTINGS); + + if ( + path && + path !== ROUTES.WORKSPACE_LOCKED && + !isRouteEnabledForWorkspaceBlockedState + ) { history.push(ROUTES.WORKSPACE_LOCKED); } }; @@ -127,6 +140,7 @@ function PrivateRoute({ children }: PrivateRouteProps): JSX.Element { navigateToWorkSpaceBlocked(currentRoute); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isFetchingLicenses, licenses?.workSpaceBlock, mapRoutes, pathname]); const navigateToWorkSpaceSuspended = (route: any): void => { diff --git a/frontend/src/container/SideNav/NavItem/NavItem.styles.scss b/frontend/src/container/SideNav/NavItem/NavItem.styles.scss index ede4376033..84621b436b 100644 --- a/frontend/src/container/SideNav/NavItem/NavItem.styles.scss +++ b/frontend/src/container/SideNav/NavItem/NavItem.styles.scss @@ -15,6 +15,13 @@ } } + &.disabled { + .nav-item-data { + opacity: 0.5; + cursor: not-allowed; + } + } + &:hover { cursor: pointer; diff --git a/frontend/src/container/SideNav/NavItem/NavItem.tsx b/frontend/src/container/SideNav/NavItem/NavItem.tsx index 012708cc30..67beb82d73 100644 --- a/frontend/src/container/SideNav/NavItem/NavItem.tsx +++ b/frontend/src/container/SideNav/NavItem/NavItem.tsx @@ -11,17 +11,28 @@ export default function NavItem({ item, isActive, onClick, + isDisabled, }: { item: SidebarItem; isActive: boolean; onClick: (event: React.MouseEvent) => void; + isDisabled: boolean; }): JSX.Element { const { label, icon, isBeta, isNew } = item; return (
onClick(event)} + className={cx( + 'nav-item', + isActive ? 'active' : '', + isDisabled ? 'disabled' : '', + )} + onClick={(event): void => { + if (isDisabled) { + return; + } + onClick(event); + }} >
diff --git a/frontend/src/container/SideNav/SideNav.tsx b/frontend/src/container/SideNav/SideNav.tsx index b7e2e3de6e..982a30e3c6 100644 --- a/frontend/src/container/SideNav/SideNav.tsx +++ b/frontend/src/container/SideNav/SideNav.tsx @@ -89,6 +89,8 @@ function SideNav(): JSX.Element { const licenseStatus: string = licenses?.licenses?.find((e: License) => e.isCurrent)?.status || ''; + const isWorkspaceBlocked = licenses?.workSpaceBlock || false; + const isLicenseActive = licenseStatus?.toLocaleLowerCase() === LICENSE_PLAN_STATUS.VALID.toLocaleLowerCase(); @@ -351,7 +353,11 @@ function SideNav(): JSX.Element {
+ )} + Got Questions?