import React, { Fragment, ReactNode } from 'react'; import { IconButton, Box, CloseButton, Flex, Image, HStack, VStack, Icon, useColorModeValue, Link, Text, BoxProps, FlexProps, Menu, MenuButton, MenuItem, MenuList, Accordion, AccordionButton, AccordionPanel, AccordionItem, useMediaQuery, } from '@chakra-ui/react'; import { FiUser, FiCode, FiSettings, FiMenu, FiUsers, FiChevronDown, } from 'react-icons/fi'; import { BiCustomize } from 'react-icons/bi'; import { AiOutlineKey } from 'react-icons/ai'; import { SiOpenaccess, SiJsonwebtokens } from 'react-icons/si'; import { MdSecurity } from 'react-icons/md'; import { RiDatabase2Line } from 'react-icons/ri'; import { BsCheck2Circle } from 'react-icons/bs'; import { HiOutlineMail, HiOutlineOfficeBuilding } from 'react-icons/hi'; import { IconType } from 'react-icons'; import { ReactText } from 'react'; import { useMutation, useQuery } from 'urql'; import { NavLink, useNavigate, useLocation } from 'react-router-dom'; import { useAuthContext } from '../contexts/AuthContext'; import { AdminLogout } from '../graphql/mutation'; import { MetaQuery } from '../graphql/queries'; interface SubRoutes { name: string; icon: IconType; route: string; } interface LinkItemProps { name: string; icon: IconType; route: string; subRoutes?: SubRoutes[]; } const LinkItems: Array = [ { name: 'Environment ', icon: FiSettings, route: '/', subRoutes: [ { name: 'OAuth Config', icon: AiOutlineKey, route: '/oauth-setting', }, { name: 'Roles', icon: FiUser, route: '/roles' }, { name: 'JWT Secrets', icon: SiJsonwebtokens, route: '/jwt-config', }, { name: 'Session Storage', icon: RiDatabase2Line, route: '/session-storage', }, { name: 'Email Configurations', icon: HiOutlineMail, route: '/email-config', }, { name: 'Domain White Listing', icon: BsCheck2Circle, route: '/whitelist-variables', }, { name: 'Organization Info', icon: HiOutlineOfficeBuilding, route: '/organization-info', }, { name: 'Access Token', icon: SiOpenaccess, route: '/access-token' }, { name: 'Features', icon: BiCustomize, route: '/features', }, { name: 'Database', icon: RiDatabase2Line, route: '/db-cred' }, { name: ' Security', icon: MdSecurity, route: '/admin-secret', }, ], }, { name: 'Users', icon: FiUsers, route: '/users' }, ]; interface SidebarProps extends BoxProps { onClose: () => void; } export const Sidebar = ({ onClose, ...rest }: SidebarProps) => { const { pathname } = useLocation(); const [{ data }] = useQuery({ query: MetaQuery }); const [isNotSmallerScreen] = useMediaQuery('(min-width:600px)'); return ( logo AUTHORIZER {LinkItems.map((link) => link?.subRoutes ? (
{link.name} {link.subRoutes?.map((sublink) => ( {' '} {sublink.name} {' '} ))}
) : ( {' '} {link.name} {' '} ) )} API Playground
{data?.meta?.version && ( {' '} Current Version: {data.meta.version} )}
); }; interface NavItemProps extends FlexProps { icon: IconType; children: ReactText | JSX.Element | JSX.Element[]; } export const NavItem = ({ icon, children, ...rest }: NavItemProps) => { return ( {icon && ( )} {children} ); }; interface MobileProps extends FlexProps { onOpen: () => void; } export const MobileNav = ({ onOpen, ...rest }: MobileProps) => { const [_, logout] = useMutation(AdminLogout); const { setIsLoggedIn } = useAuthContext(); const navigate = useNavigate(); const handleLogout = async () => { await logout(); setIsLoggedIn(false); navigate('/', { replace: true }); }; return ( } /> logo Admin Sign out ); };