import { useCallback, useEffect, useMemo, useState } from 'react'; import { NavLink, useNavigate, useParams } from 'react-router-dom'; import { Organization, User } from 'gql-client'; import { motion } from 'framer-motion'; import { useDisconnect } from 'wagmi'; import { useGQLClient } from 'context/GQLClientContext'; import { GlobeIcon, LifeBuoyIcon, LogoutIcon, QuestionMarkRoundIcon, } from 'components/shared/CustomIcon'; import { Tabs } from 'components/shared/Tabs'; import { Logo } from 'components/Logo'; import { Avatar } from 'components/shared/Avatar'; import { formatAddress } from 'utils/format'; import { getInitials } from 'utils/geInitials'; import { Button } from 'components/shared/Button'; import { cn } from 'utils/classnames'; import { useMediaQuery } from 'usehooks-ts'; import { SIDEBAR_MENU } from './constants'; import { UserSelect } from 'components/shared/UserSelect'; import { BASE_URL } from 'utils/constants'; interface SidebarProps { mobileOpen?: boolean; } export const Sidebar = ({ mobileOpen }: SidebarProps) => { const { orgSlug } = useParams(); const navigate = useNavigate(); const client = useGQLClient(); const isDesktop = useMediaQuery('(min-width: 960px)'); const [user, setUser] = useState(); const { disconnect } = useDisconnect(); const fetchUser = useCallback(async () => { const { user } = await client.getUser(); setUser(user); }, []); useEffect(() => { fetchUser(); }, []); const [selectedOrgSlug, setSelectedOrgSlug] = useState(orgSlug); const [organizations, setOrganizations] = useState([]); const fetchUserOrganizations = useCallback(async () => { const { organizations } = await client.getOrganizations(); setOrganizations(organizations); }, [orgSlug]); useEffect(() => { fetchUserOrganizations(); setSelectedOrgSlug(orgSlug); }, [orgSlug]); const formattedSelected = useMemo(() => { const selected = organizations.find((org) => org.slug === selectedOrgSlug); return { value: selected?.slug ?? '', label: selected?.name ?? '', imgSrc: '/logo.svg', }; }, [organizations, selectedOrgSlug, orgSlug]); const formattedSelectOptions = useMemo(() => { return organizations.map((org) => ({ value: org.slug, label: org.name, imgSrc: '/logo.svg', })); }, [organizations, selectedOrgSlug, orgSlug]); const renderMenu = useMemo(() => { return SIDEBAR_MENU(orgSlug).map(({ title, icon, url }, index) => ( {title} )); }, [orgSlug]); const handleLogOut = useCallback(async () => { await fetch(`${BASE_URL}/auth/logout`, { method: 'POST', credentials: 'include', }); localStorage.clear(); disconnect(); navigate('/login'); }, [disconnect, navigate]); return (
{/* Logo */}
{/* Switch organization */}
{renderMenu}
{/* Bottom navigation */}
{/* // TODO: use proper link buttons */} } value="" className="hidden lg:flex" > Log Out } value=""> Documentation } value=""> Support
{/* Only shows when on mobile */}
{user?.name && (

{formatAddress(user.name)}

)}
); };