import { useEffect, useState } from "react"; import { ScrollArea, Text, Divider, Modal, UnstyledButton, Tooltip } from "@mantine/core"; import { IconHome, IconClock, IconStar, IconLayoutGrid, IconSettings, IconUserPlus, IconTemplate, } from "@tabler/icons-react"; import { Link, useLocation } from "react-router-dom"; import classes from "./global-sidebar.module.css"; import { useTranslation } from "react-i18next"; import { useAtom } from "jotai"; import { mobileSidebarAtom } from "@/components/layouts/global/hooks/atoms/sidebar-atom"; import { useToggleSidebar } from "@/components/layouts/global/hooks/hooks/use-toggle-sidebar"; import { useFavoritesQuery } from "@/features/favorite/queries/favorite-query"; import { getSpaceUrl } from "@/lib/config"; import { useDisclosure } from "@mantine/hooks"; import { WorkspaceInviteForm } from "@/features/workspace/components/members/components/workspace-invite-form"; import { CustomAvatar } from "@/components/ui/custom-avatar"; import { AvatarIconType } from "@/features/attachments/types/attachment.types"; import { useHasFeature } from "@/ee/hooks/use-feature"; import { Feature } from "@/ee/features"; import { useUpgradeLabel } from "@/ee/hooks/use-upgrade-label"; export default function GlobalSidebar() { const { t } = useTranslation(); const location = useLocation(); const [active, setActive] = useState(location.pathname); const [mobileSidebarOpened] = useAtom(mobileSidebarAtom); const toggleMobileSidebar = useToggleSidebar(mobileSidebarAtom); const hasTemplates = useHasFeature(Feature.TEMPLATES); const upgradeLabel = useUpgradeLabel(); const mainNavItems = [ { label: "Home", icon: IconHome, path: "/home" }, { label: "Favorites", icon: IconStar, path: "/favorites" }, { label: "Spaces", icon: IconLayoutGrid, path: "/spaces" }, { label: "Templates", icon: IconTemplate, path: "/templates", disabled: !hasTemplates, }, ]; const { data: favoriteSpacesData, isPending: isFavoritesPending } = useFavoritesQuery("space"); const favoriteSpaces = favoriteSpacesData?.pages.flatMap((p) => p.items) ?? []; const sortedFavoriteSpaces = [...favoriteSpaces] .filter((fav) => fav.space) .sort((a, b) => { const cmp = (a.space!.name ?? "").localeCompare(b.space!.name ?? "", undefined, { sensitivity: "base" }); return cmp !== 0 ? cmp : a.id.localeCompare(b.id); }); const [inviteOpened, { open: openInvite, close: closeInvite }] = useDisclosure(false); useEffect(() => { setActive(location.pathname); }, [location.pathname]); const handleNavClick = () => { if (mobileSidebarOpened) { toggleMobileSidebar(); } }; return (
{mainNavItems.map((item) => item.disabled ? ( {t(item.label)} ) : ( {t(item.label)} ), )}
{t("Favorite spaces")} {!isFavoritesPending && sortedFavoriteSpaces.length === 0 ? ( {t("Favorite spaces appear here")} ) : ( <> {sortedFavoriteSpaces.slice(0, 10).map((fav) => ( {fav.space!.name} ))} {sortedFavoriteSpaces.length > 10 && ( {t("View all")} )} )}
{t("Invite People")} {t("Settings")}
); }