import React, { useEffect, useState, useMemo } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Col, ConfigProvider, Flex, Menu, MenuProps, Alert } from 'antd'; import { createPortal } from 'react-dom'; import InviteTeamMembers from '../../components/common/invite-team-members/invite-team-members'; import InviteButton from './invite/InviteButton'; import MobileMenuButton from './mobileMenu/MobileMenuButton'; import NavbarLogo from './navbar-logo'; import NotificationButton from '../../components/navbar/notifications/notifications-drawer/notification/notification-button'; import ProfileButton from './user-profile/profile-button'; import SwitchTeamButton from './switchTeam/SwitchTeamButton'; import UpgradePlanButton from './upgradePlan/UpgradePlanButton'; import NotificationDrawer from '../../components/navbar/notifications/notifications-drawer/notification/notfication-drawer'; import { useResponsive } from '@/hooks/useResponsive'; import { getJSONFromLocalStorage } from '@/utils/localStorageFunctions'; import { navRoutes, NavRoutesType } from './navRoutes'; import { useAuthService } from '@/hooks/useAuth'; import { authApiService } from '@/api/auth/auth.api.service'; import { ISUBSCRIPTION_TYPE } from '@/shared/constants'; import logger from '@/utils/errorLogger'; import TimerButton from './timers/timer-button'; import HelpButton from './help/HelpButton'; const Navbar = () => { const [current, setCurrent] = useState('home'); const currentSession = useAuthService().getCurrentSession(); const [daysUntilExpiry, setDaysUntilExpiry] = useState(null); const location = useLocation(); const { isDesktop, isMobile, isTablet } = useResponsive(); const { t } = useTranslation('navbar'); const authService = useAuthService(); const [navRoutesList, setNavRoutesList] = useState(navRoutes); const [isOwnerOrAdmin, setIsOwnerOrAdmin] = useState(authService.isOwnerOrAdmin()); const showUpgradeTypes = [ISUBSCRIPTION_TYPE.TRIAL]; useEffect(() => { authApiService .verify() .then(authorizeResponse => { if (authorizeResponse.authenticated) { authService.setCurrentSession(authorizeResponse.user); setIsOwnerOrAdmin(!!(authorizeResponse.user.is_admin || authorizeResponse.user.owner)); } }) .catch(error => { logger.error('Error during authorization', error); }); }, []); useEffect(() => { const storedNavRoutesList: NavRoutesType[] = getJSONFromLocalStorage('navRoutes') || navRoutes; setNavRoutesList(storedNavRoutesList); }, []); useEffect(() => { if (currentSession?.trial_expire_date) { const today = new Date(); const expiryDate = new Date(currentSession.trial_expire_date); const diffTime = expiryDate.getTime() - today.getTime(); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); setDaysUntilExpiry(diffDays); } }, [currentSession?.trial_expire_date]); const navlinkItems = useMemo( () => navRoutesList .filter(route => { if ( !route.freePlanFeature && currentSession?.subscription_type === ISUBSCRIPTION_TYPE.FREE ) return false; if (route.adminOnly && !isOwnerOrAdmin) return false; return true; }) .map((route, index) => ({ key: route.path.split('/').pop() || index, label: ( {t(route.name)} ), })), [navRoutesList, t, isOwnerOrAdmin, currentSession?.subscription_type] ); useEffect(() => { const afterWorklenzString = location.pathname.split('/worklenz/')[1]; const pathKey = afterWorklenzString.split('/')[0]; setCurrent(pathKey ?? 'home'); }, [location]); return ( {/* logo */} {/* navlinks menu */} {isDesktop && ( )} {isDesktop && ( {isOwnerOrAdmin && showUpgradeTypes.includes( currentSession?.subscription_type as ISUBSCRIPTION_TYPE ) && } {isOwnerOrAdmin && } {/* */} )} {isTablet && !isDesktop && ( )} {isMobile && ( )} {isOwnerOrAdmin && createPortal(, document.body, 'invite-team-members')} {createPortal(, document.body, 'notification-drawer')} ); }; export default Navbar;