2022-04-05 18:21:25 +05:30
|
|
|
import { CheckCircleTwoTone, WarningOutlined } from '@ant-design/icons';
|
2023-09-06 13:00:20 +05:30
|
|
|
import { MenuProps } from 'antd';
|
2022-03-22 16:22:02 +05:30
|
|
|
import getLocalStorageKey from 'api/browser/localstorage/get';
|
|
|
|
|
import { IS_SIDEBAR_COLLAPSED } from 'constants/app';
|
2023-09-12 19:20:14 +05:30
|
|
|
import { FeatureKeys } from 'constants/features';
|
2021-09-23 15:43:43 +05:30
|
|
|
import ROUTES from 'constants/routes';
|
2023-10-16 23:57:44 +05:30
|
|
|
import useLicense, { LICENSE_PLAN_KEY } from 'hooks/useLicense';
|
2021-09-28 18:50:10 +05:30
|
|
|
import history from 'lib/history';
|
2023-10-19 11:52:58 +05:30
|
|
|
import { LifeBuoy } from 'lucide-react';
|
2023-09-06 13:00:20 +05:30
|
|
|
import { useCallback, useLayoutEffect, useMemo, useState } from 'react';
|
2022-04-05 18:21:25 +05:30
|
|
|
import { useTranslation } from 'react-i18next';
|
2022-05-03 15:27:09 +05:30
|
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
|
|
|
import { useLocation } from 'react-router-dom';
|
2023-09-06 13:00:20 +05:30
|
|
|
import { sideBarCollapse } from 'store/actions/app';
|
2021-09-28 18:50:10 +05:30
|
|
|
import { AppState } from 'store/reducers';
|
|
|
|
|
import AppReducer from 'types/reducer/app';
|
2023-10-19 11:52:58 +05:30
|
|
|
import { checkVersionState, isCloudUser, isEECloudUser } from 'utils/app';
|
2021-09-23 15:43:43 +05:30
|
|
|
|
2023-04-20 18:14:32 +05:30
|
|
|
import { routeConfig, styles } from './config';
|
|
|
|
|
import { getQueryString } from './helper';
|
2023-09-12 19:20:14 +05:30
|
|
|
import defaultMenuItems from './menuItems';
|
2023-09-06 13:00:20 +05:30
|
|
|
import { MenuItem, SecondaryMenuItemKey } from './sideNav.types';
|
|
|
|
|
import { getActiveMenuKeyFromPath } from './sideNav.utils';
|
2022-02-12 15:01:38 +05:30
|
|
|
import Slack from './Slack';
|
2022-03-22 12:10:31 +05:30
|
|
|
import {
|
2023-09-06 13:00:20 +05:30
|
|
|
MenuLabelContainer,
|
2022-04-05 18:21:25 +05:30
|
|
|
RedDot,
|
2022-03-22 12:10:31 +05:30
|
|
|
Sider,
|
2023-09-06 13:00:20 +05:30
|
|
|
StyledPrimaryMenu,
|
|
|
|
|
StyledSecondaryMenu,
|
|
|
|
|
StyledText,
|
2022-03-22 12:10:31 +05:30
|
|
|
} from './styles';
|
2021-08-27 12:13:32 +05:30
|
|
|
|
2022-05-03 15:27:09 +05:30
|
|
|
function SideNav(): JSX.Element {
|
2022-03-22 16:22:02 +05:30
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
const [collapsed, setCollapsed] = useState<boolean>(
|
|
|
|
|
getLocalStorageKey(IS_SIDEBAR_COLLAPSED) === 'true',
|
|
|
|
|
);
|
2023-09-12 19:20:14 +05:30
|
|
|
const {
|
2023-10-16 23:57:44 +05:30
|
|
|
role,
|
2023-09-12 19:20:14 +05:30
|
|
|
currentVersion,
|
|
|
|
|
latestVersion,
|
|
|
|
|
isCurrentVersionError,
|
|
|
|
|
featureResponse,
|
|
|
|
|
} = useSelector<AppState, AppReducer>((state) => state.app);
|
|
|
|
|
|
2023-10-16 23:57:44 +05:30
|
|
|
const { data } = useLicense();
|
|
|
|
|
|
2023-10-19 11:52:58 +05:30
|
|
|
let secondaryMenuItems: MenuItem[] = [];
|
|
|
|
|
|
2023-10-16 23:57:44 +05:30
|
|
|
const isOnBasicPlan =
|
|
|
|
|
data?.payload?.licenses?.some(
|
|
|
|
|
(license) =>
|
|
|
|
|
license.isCurrent && license.planKey === LICENSE_PLAN_KEY.BASIC_PLAN,
|
|
|
|
|
) || data?.payload?.licenses === null;
|
|
|
|
|
|
2023-09-12 19:20:14 +05:30
|
|
|
const menuItems = useMemo(
|
|
|
|
|
() =>
|
|
|
|
|
defaultMenuItems.filter((item) => {
|
|
|
|
|
const isOnboardingEnabled =
|
|
|
|
|
featureResponse.data?.find(
|
|
|
|
|
(feature) => feature.name === FeatureKeys.ONBOARDING,
|
|
|
|
|
)?.active || false;
|
|
|
|
|
|
2023-10-16 23:57:44 +05:30
|
|
|
if (role !== 'ADMIN' || isOnBasicPlan) {
|
|
|
|
|
return item.key !== ROUTES.BILLING;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-17 16:54:37 +05:30
|
|
|
if (!isOnboardingEnabled || !isCloudUser()) {
|
2023-09-12 19:20:14 +05:30
|
|
|
return item.key !== ROUTES.GET_STARTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}),
|
2023-10-17 16:54:37 +05:30
|
|
|
[featureResponse.data, isOnBasicPlan, role],
|
2023-09-12 19:20:14 +05:30
|
|
|
);
|
2021-08-27 12:13:32 +05:30
|
|
|
|
2023-04-20 18:14:32 +05:30
|
|
|
const { pathname, search } = useLocation();
|
2023-06-08 10:49:33 +03:00
|
|
|
|
2022-04-05 18:21:25 +05:30
|
|
|
const { t } = useTranslation('');
|
2022-03-22 21:56:12 +05:30
|
|
|
|
2021-08-27 12:13:32 +05:30
|
|
|
const onCollapse = useCallback(() => {
|
|
|
|
|
setCollapsed((collapsed) => !collapsed);
|
|
|
|
|
}, []);
|
|
|
|
|
|
2022-03-22 16:22:02 +05:30
|
|
|
useLayoutEffect(() => {
|
2023-09-06 13:00:20 +05:30
|
|
|
dispatch(sideBarCollapse(collapsed));
|
2022-03-22 21:56:12 +05:30
|
|
|
}, [collapsed, dispatch]);
|
2022-03-22 16:22:02 +05:30
|
|
|
|
2021-10-20 09:24:55 +05:30
|
|
|
const onClickHandler = useCallback(
|
2023-08-02 11:22:24 +05:30
|
|
|
(key: string) => {
|
2023-04-20 18:14:32 +05:30
|
|
|
const params = new URLSearchParams(search);
|
2023-08-02 11:22:24 +05:30
|
|
|
const availableParams = routeConfig[key];
|
2023-04-20 18:14:32 +05:30
|
|
|
|
2023-06-08 10:49:33 +03:00
|
|
|
const queryString = getQueryString(availableParams || [], params);
|
2023-04-20 18:14:32 +05:30
|
|
|
|
2023-08-02 11:22:24 +05:30
|
|
|
if (pathname !== key) {
|
|
|
|
|
history.push(`${key}?${queryString.join('&')}`);
|
2021-10-20 09:24:55 +05:30
|
|
|
}
|
|
|
|
|
},
|
2023-04-20 18:14:32 +05:30
|
|
|
[pathname, search],
|
2021-10-20 09:24:55 +05:30
|
|
|
);
|
2021-09-23 15:43:43 +05:30
|
|
|
|
2023-06-08 10:49:33 +03:00
|
|
|
const onClickMenuHandler: MenuProps['onClick'] = (e) => {
|
|
|
|
|
onClickHandler(e.key);
|
|
|
|
|
};
|
|
|
|
|
|
2022-03-22 16:22:02 +05:30
|
|
|
const onClickSlackHandler = (): void => {
|
2022-02-12 15:01:38 +05:30
|
|
|
window.open('https://signoz.io/slack', '_blank');
|
|
|
|
|
};
|
|
|
|
|
|
2022-04-05 18:21:25 +05:30
|
|
|
const onClickVersionHandler = (): void => {
|
|
|
|
|
history.push(ROUTES.VERSION);
|
|
|
|
|
};
|
|
|
|
|
|
2023-10-18 21:43:46 +05:30
|
|
|
const isLatestVersion = checkVersionState(currentVersion, latestVersion);
|
2022-04-05 18:21:25 +05:30
|
|
|
|
2023-10-19 11:52:58 +05:30
|
|
|
if (isCloudUser() || isEECloudUser()) {
|
|
|
|
|
secondaryMenuItems = [
|
|
|
|
|
{
|
|
|
|
|
key: SecondaryMenuItemKey.Support,
|
|
|
|
|
label: 'Support',
|
|
|
|
|
icon: <LifeBuoy />,
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
} else {
|
|
|
|
|
secondaryMenuItems = [
|
|
|
|
|
{
|
|
|
|
|
key: SecondaryMenuItemKey.Version,
|
|
|
|
|
icon: !isLatestVersion ? (
|
|
|
|
|
<WarningOutlined style={{ color: '#E87040' }} />
|
|
|
|
|
) : (
|
|
|
|
|
<CheckCircleTwoTone twoToneColor={['#D5F2BB', '#1f1f1f']} />
|
|
|
|
|
),
|
|
|
|
|
label: (
|
|
|
|
|
<MenuLabelContainer>
|
|
|
|
|
<StyledText ellipsis>
|
|
|
|
|
{!isCurrentVersionError ? currentVersion : t('n_a')}
|
|
|
|
|
</StyledText>
|
|
|
|
|
{!isLatestVersion && <RedDot />}
|
|
|
|
|
</MenuLabelContainer>
|
|
|
|
|
),
|
|
|
|
|
onClick: onClickVersionHandler,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: SecondaryMenuItemKey.Slack,
|
|
|
|
|
icon: <Slack />,
|
|
|
|
|
label: <StyledText>Support</StyledText>,
|
|
|
|
|
onClick: onClickSlackHandler,
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
}
|
2022-04-05 18:21:25 +05:30
|
|
|
|
2023-09-06 13:00:20 +05:30
|
|
|
const activeMenuKey = useMemo(() => getActiveMenuKeyFromPath(pathname), [
|
|
|
|
|
pathname,
|
|
|
|
|
]);
|
2023-03-03 12:09:24 +01:00
|
|
|
|
2021-08-27 12:13:32 +05:30
|
|
|
return (
|
2021-09-28 18:50:10 +05:30
|
|
|
<Sider collapsible collapsed={collapsed} onCollapse={onCollapse} width={200}>
|
2023-09-06 13:00:20 +05:30
|
|
|
<StyledPrimaryMenu
|
2021-08-27 12:13:32 +05:30
|
|
|
theme="dark"
|
|
|
|
|
defaultSelectedKeys={[ROUTES.APPLICATION]}
|
2023-09-06 13:00:20 +05:30
|
|
|
selectedKeys={activeMenuKey ? [activeMenuKey] : []}
|
2023-03-23 14:50:17 +05:30
|
|
|
mode="vertical"
|
2023-01-11 14:39:06 +05:30
|
|
|
style={styles}
|
2023-09-06 13:00:20 +05:30
|
|
|
items={menuItems}
|
2023-06-08 10:49:33 +03:00
|
|
|
onClick={onClickMenuHandler}
|
2023-03-03 12:09:24 +01:00
|
|
|
/>
|
2023-09-06 13:00:20 +05:30
|
|
|
<StyledSecondaryMenu
|
|
|
|
|
theme="dark"
|
|
|
|
|
selectedKeys={activeMenuKey ? [activeMenuKey] : []}
|
|
|
|
|
mode="vertical"
|
|
|
|
|
style={styles}
|
|
|
|
|
items={secondaryMenuItems}
|
2023-10-19 11:52:58 +05:30
|
|
|
onClick={onClickMenuHandler}
|
2023-09-06 13:00:20 +05:30
|
|
|
/>
|
2021-08-27 12:13:32 +05:30
|
|
|
</Sider>
|
|
|
|
|
);
|
2022-03-22 12:10:31 +05:30
|
|
|
}
|
2021-08-27 12:13:32 +05:30
|
|
|
|
2022-05-03 15:27:09 +05:30
|
|
|
export default SideNav;
|