Menu.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { AiOutlineDashboard, AiOutlineSetting, AiOutlineAppstore } from 'react-icons/ai';
  2. import { FaRegMoon } from 'react-icons/fa';
  3. import { FiLogOut } from 'react-icons/fi';
  4. import Package from '../../../package.json';
  5. import { Box, Divider, Flex, List, ListItem, Switch, useColorMode } from '@chakra-ui/react';
  6. import React from 'react';
  7. import Link from 'next/link';
  8. import clsx from 'clsx';
  9. import { useRouter } from 'next/router';
  10. import { IconType } from 'react-icons';
  11. import { useAuthStore } from '../../state/authStore';
  12. const SideMenu: React.FC = () => {
  13. const router = useRouter();
  14. const { colorMode, setColorMode } = useColorMode();
  15. const { logout } = useAuthStore();
  16. const path = router.pathname.split('/')[1];
  17. const renderMenuItem = (title: string, name: string, Icon: IconType) => {
  18. const selected = path === name;
  19. const itemClass = clsx('mx-3 border-transparent rounded-lg p-3 transition-colors border-1', {
  20. 'drop-shadow-sm border-gray-200': selected && colorMode === 'light',
  21. 'bg-white': selected && colorMode === 'light',
  22. });
  23. return (
  24. <Link href={`/${name}`} passHref>
  25. <div className={itemClass}>
  26. <ListItem className={'flex items-center cursor-pointer hover:font-bold'}>
  27. <Icon size={20} className={clsx('mr-3', { 'text-red-600': selected && colorMode === 'light', 'text-red-200': selected && colorMode === 'dark' })} />
  28. <p className={clsx({ 'font-bold': selected, 'text-red-600': selected && colorMode === 'light', 'text-red-200': selected && colorMode === 'dark' })}>{title}</p>
  29. </ListItem>
  30. </div>
  31. </Link>
  32. );
  33. };
  34. const handleChangeColorMode = (checked: boolean) => {
  35. setColorMode(checked ? 'dark' : 'light');
  36. };
  37. return (
  38. <Box className="flex-1 flex flex-col p-0 md:p-4">
  39. <img className="self-center mb-5 logo mt-0 md:mt-5" src="/tipi.png" width={512} height={512} />
  40. <List spacing={3} className="pt-5">
  41. {renderMenuItem('Dashboard', '', AiOutlineDashboard)}
  42. {renderMenuItem('Apps', 'apps', AiOutlineAppstore)}
  43. {renderMenuItem('Settings', 'settings', AiOutlineSetting)}
  44. </List>
  45. <Divider className="my-3" />
  46. <Flex flex="1" />
  47. <List>
  48. <div className="mx-3">
  49. <ListItem onClick={logout} className="cursor-pointer hover:font-bold flex items-center mb-5">
  50. <FiLogOut size={20} className="mr-3" />
  51. <p className="flex-1">Log out</p>
  52. </ListItem>
  53. <ListItem className="flex items-center">
  54. <FaRegMoon size={20} className="mr-3" />
  55. <p className="flex-1">Dark mode</p>
  56. <Switch checked={colorMode === 'dark'} onChange={(event) => handleChangeColorMode(event.target.checked)} />
  57. </ListItem>
  58. </div>
  59. </List>
  60. <div className="pb-1 text-center text-sm text-gray-400 mt-5">Tipi version {Package.version}</div>
  61. </Box>
  62. );
  63. };
  64. export default SideMenu;