import { ActionIcon, Group, Menu, Text, Tooltip, UnstyledButton, } from "@mantine/core"; import { IconArrowDown, IconDots, IconFileExport, IconHome, IconPlus, IconSearch, IconSettings, } from "@tabler/icons-react"; import classes from "./space-sidebar.module.css"; import React from "react"; import { useAtom } from "jotai"; import { SearchSpotlight } from "@/features/search/search-spotlight.tsx"; import { treeApiAtom } from "@/features/page/tree/atoms/tree-api-atom.ts"; import { Link, useLocation, useParams } from "react-router-dom"; import clsx from "clsx"; import { useDisclosure } from "@mantine/hooks"; import SpaceSettingsModal from "@/features/space/components/settings-modal.tsx"; import { useGetSpaceBySlugQuery } from "@/features/space/queries/space-query.ts"; import { getSpaceUrl } from "@/lib/config.ts"; import SpaceTree from "@/features/page/tree/components/space-tree.tsx"; import { useSpaceAbility } from "@/features/space/permissions/use-space-ability.ts"; import { SpaceCaslAction, SpaceCaslSubject, } from "@/features/space/permissions/permissions.type.ts"; import PageImportModal from "@/features/page/components/page-import-modal.tsx"; import { useTranslation } from "react-i18next"; import { SwitchSpace } from "./switch-space"; import ExportModal from "@/components/common/export-modal"; import { mobileSidebarAtom } from "@/components/layouts/global/hooks/atoms/sidebar-atom.ts"; import { useToggleSidebar } from "@/components/layouts/global/hooks/hooks/use-toggle-sidebar.ts"; import { searchSpotlight } from "@/features/search/constants"; export function SpaceSidebar() { const { t } = useTranslation(); const [tree] = useAtom(treeApiAtom); const location = useLocation(); const [opened, { open: openSettings, close: closeSettings }] = useDisclosure(false); const [mobileSidebarOpened] = useAtom(mobileSidebarAtom); const toggleMobileSidebar = useToggleSidebar(mobileSidebarAtom); const { spaceSlug } = useParams(); const { data: space } = useGetSpaceBySlugQuery(spaceSlug); const spaceRules = space?.membership?.permissions; const spaceAbility = useSpaceAbility(spaceRules); if (!space) { return <>; } function handleCreatePage() { tree?.create({ parentId: null, type: "internal", index: 0 }); } return ( <>
{t("Overview")}
{t("Search")}
{t("Space settings")}
{spaceAbility.can( SpaceCaslAction.Manage, SpaceCaslSubject.Page, ) && ( { handleCreatePage(); if (mobileSidebarOpened) { toggleMobileSidebar(); } }} >
{t("New page")}
)}
{t("Pages")} {spaceAbility.can( SpaceCaslAction.Manage, SpaceCaslSubject.Page, ) && ( )}
); } interface SpaceMenuProps { spaceId: string; onSpaceSettings: () => void; } function SpaceMenu({ spaceId, onSpaceSettings }: SpaceMenuProps) { const { t } = useTranslation(); const [importOpened, { open: openImportModal, close: closeImportModal }] = useDisclosure(false); const [exportOpened, { open: openExportModal, close: closeExportModal }] = useDisclosure(false); return ( <> } > {t("Import pages")} } > {t("Export space")} } > {t("Space settings")} ); }