2022-01-26 21:55:11 +05:30
|
|
|
import { Menu, Typography } from 'antd';
|
2022-03-22 16:22:02 +05:30
|
|
|
import getLocalStorageKey from 'api/browser/localstorage/get';
|
|
|
|
|
import { IS_SIDEBAR_COLLAPSED } from 'constants/app';
|
2021-09-23 15:43:43 +05:30
|
|
|
import ROUTES from 'constants/routes';
|
2021-09-28 18:50:10 +05:30
|
|
|
import history from 'lib/history';
|
2022-03-24 12:06:57 +05:30
|
|
|
import setTheme, { AppMode } from 'lib/theme/setTheme';
|
2022-03-22 16:22:02 +05:30
|
|
|
import React, { useCallback, useLayoutEffect, useState } from 'react';
|
|
|
|
|
import { connect, useDispatch, useSelector } from 'react-redux';
|
2022-03-22 12:10:31 +05:30
|
|
|
import { NavLink, useLocation } from 'react-router-dom';
|
2021-09-28 18:50:10 +05:30
|
|
|
import { bindActionCreators } from 'redux';
|
|
|
|
|
import { ThunkDispatch } from 'redux-thunk';
|
2021-11-16 21:13:20 +05:30
|
|
|
import { ToggleDarkMode } from 'store/actions';
|
2022-03-22 16:22:02 +05:30
|
|
|
import { SideBarCollapse } from 'store/actions/app';
|
2021-09-28 18:50:10 +05:30
|
|
|
import { AppState } from 'store/reducers';
|
|
|
|
|
import AppActions from 'types/actions';
|
|
|
|
|
import AppReducer from 'types/reducer/app';
|
2021-09-23 15:43:43 +05:30
|
|
|
|
|
|
|
|
import menus from './menuItems';
|
2022-02-12 15:01:38 +05:30
|
|
|
import Slack from './Slack';
|
2022-03-22 12:10:31 +05:30
|
|
|
import {
|
|
|
|
|
Logo,
|
|
|
|
|
Sider,
|
|
|
|
|
SlackButton,
|
|
|
|
|
SlackMenuItemContainer,
|
|
|
|
|
ThemeSwitcherWrapper,
|
|
|
|
|
ToggleButton,
|
|
|
|
|
} from './styles';
|
2021-08-27 12:13:32 +05:30
|
|
|
|
2022-03-22 12:10:31 +05:30
|
|
|
function SideNav({ toggleDarkMode }: Props): JSX.Element {
|
2022-03-22 16:22:02 +05:30
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
const [collapsed, setCollapsed] = useState<boolean>(
|
|
|
|
|
getLocalStorageKey(IS_SIDEBAR_COLLAPSED) === 'true',
|
|
|
|
|
);
|
2021-09-28 18:50:10 +05:30
|
|
|
const { isDarkMode } = useSelector<AppState, AppReducer>((state) => state.app);
|
2021-08-27 12:13:32 +05:30
|
|
|
|
2022-03-22 21:56:12 +05:30
|
|
|
const { pathname } = useLocation();
|
|
|
|
|
|
2021-09-28 18:50:10 +05:30
|
|
|
const toggleTheme = useCallback(() => {
|
2022-03-24 12:06:57 +05:30
|
|
|
const preMode: AppMode = isDarkMode ? 'lightMode' : 'darkMode';
|
2021-12-24 11:57:29 +05:30
|
|
|
setTheme(preMode);
|
2021-09-28 18:50:10 +05:30
|
|
|
|
2022-03-24 12:06:57 +05:30
|
|
|
const id: AppMode = preMode;
|
2022-03-22 12:10:31 +05:30
|
|
|
const { head } = document;
|
2021-09-28 18:50:10 +05:30
|
|
|
const link = document.createElement('link');
|
|
|
|
|
link.rel = 'stylesheet';
|
|
|
|
|
link.type = 'text/css';
|
2021-09-28 19:03:19 +05:30
|
|
|
link.href = !isDarkMode ? '/css/antd.dark.min.css' : '/css/antd.min.css';
|
2021-09-28 18:50:10 +05:30
|
|
|
link.media = 'all';
|
|
|
|
|
link.id = id;
|
|
|
|
|
head.appendChild(link);
|
|
|
|
|
|
|
|
|
|
link.onload = (): void => {
|
|
|
|
|
toggleDarkMode();
|
2021-12-24 11:57:29 +05:30
|
|
|
const prevNode = document.getElementById('appMode');
|
2021-09-28 18:50:10 +05:30
|
|
|
prevNode?.remove();
|
|
|
|
|
};
|
|
|
|
|
}, [toggleDarkMode, isDarkMode]);
|
2021-08-27 12:13:32 +05:30
|
|
|
|
|
|
|
|
const onCollapse = useCallback(() => {
|
|
|
|
|
setCollapsed((collapsed) => !collapsed);
|
|
|
|
|
}, []);
|
|
|
|
|
|
2022-03-22 16:22:02 +05:30
|
|
|
useLayoutEffect(() => {
|
|
|
|
|
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(
|
|
|
|
|
(to: string) => {
|
|
|
|
|
if (pathname !== to) {
|
|
|
|
|
history.push(to);
|
|
|
|
|
}
|
|
|
|
|
},
|
2021-11-16 21:13:20 +05:30
|
|
|
[pathname],
|
2021-10-20 09:24:55 +05:30
|
|
|
);
|
2021-09-23 15:43:43 +05:30
|
|
|
|
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');
|
|
|
|
|
};
|
|
|
|
|
|
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}>
|
2021-08-27 12:13:32 +05:30
|
|
|
<ThemeSwitcherWrapper>
|
2022-02-12 15:01:38 +05:30
|
|
|
<ToggleButton
|
|
|
|
|
checked={isDarkMode}
|
|
|
|
|
onChange={toggleTheme}
|
|
|
|
|
defaultChecked={isDarkMode}
|
|
|
|
|
/>
|
2021-08-27 12:13:32 +05:30
|
|
|
</ThemeSwitcherWrapper>
|
2021-10-20 09:24:55 +05:30
|
|
|
<NavLink to={ROUTES.APPLICATION}>
|
2022-03-22 12:10:31 +05:30
|
|
|
<Logo src="/signoz.svg" alt="SigNoz" collapsed={collapsed} />
|
2021-08-27 12:13:32 +05:30
|
|
|
</NavLink>
|
|
|
|
|
|
|
|
|
|
<Menu
|
|
|
|
|
theme="dark"
|
|
|
|
|
defaultSelectedKeys={[ROUTES.APPLICATION]}
|
|
|
|
|
selectedKeys={[pathname]}
|
|
|
|
|
mode="inline"
|
|
|
|
|
>
|
|
|
|
|
{menus.map(({ to, Icon, name }) => (
|
2022-02-09 11:48:54 +05:30
|
|
|
<Menu.Item
|
|
|
|
|
key={to}
|
|
|
|
|
icon={<Icon />}
|
|
|
|
|
onClick={(): void => onClickHandler(to)}
|
|
|
|
|
>
|
|
|
|
|
<Typography>{name}</Typography>
|
2021-08-27 12:13:32 +05:30
|
|
|
</Menu.Item>
|
|
|
|
|
))}
|
2022-02-12 15:17:40 +05:30
|
|
|
<SlackMenuItemContainer collapsed={collapsed}>
|
2022-03-03 19:04:23 +05:30
|
|
|
<Menu.Item onClick={onClickSlackHandler} icon={<Slack />}>
|
2022-02-13 12:05:20 +05:30
|
|
|
<SlackButton>Support</SlackButton>
|
2022-03-03 19:04:23 +05:30
|
|
|
</Menu.Item>
|
2022-02-12 15:17:40 +05:30
|
|
|
</SlackMenuItemContainer>
|
2021-08-27 12:13:32 +05:30
|
|
|
</Menu>
|
|
|
|
|
</Sider>
|
|
|
|
|
);
|
2022-03-22 12:10:31 +05:30
|
|
|
}
|
2021-08-27 12:13:32 +05:30
|
|
|
|
2021-09-28 18:50:10 +05:30
|
|
|
interface DispatchProps {
|
|
|
|
|
toggleDarkMode: () => void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const mapDispatchToProps = (
|
|
|
|
|
dispatch: ThunkDispatch<unknown, unknown, AppActions>,
|
|
|
|
|
): DispatchProps => ({
|
|
|
|
|
toggleDarkMode: bindActionCreators(ToggleDarkMode, dispatch),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
type Props = DispatchProps;
|
|
|
|
|
|
|
|
|
|
export default connect(null, mapDispatchToProps)(SideNav);
|