import { ActionIcon, Group, Menu, Text, Tooltip } from "@mantine/core"; import { IconArrowRight, IconArrowsHorizontal, IconDots, IconFileExport, IconHistory, IconLink, IconList, IconMessage, IconPrinter, IconTrash, IconWifiOff, } from "@tabler/icons-react"; import React from "react"; import useToggleAside from "@/hooks/use-toggle-aside.tsx"; import { useAtom } from "jotai"; import { historyAtoms } from "@/features/page-history/atoms/history-atoms.ts"; import { useClipboard, useDisclosure } from "@mantine/hooks"; import { useParams } from "react-router-dom"; import { usePageQuery } from "@/features/page/queries/page-query.ts"; import { buildPageUrl } from "@/features/page/page.utils.ts"; import { notifications } from "@mantine/notifications"; import { getAppUrl } from "@/lib/config.ts"; import { extractPageSlugId } from "@/lib"; import { treeApiAtom } from "@/features/page/tree/atoms/tree-api-atom.ts"; import { useDeletePageModal } from "@/features/page/hooks/use-delete-page-modal.tsx"; import { PageWidthToggle } from "@/features/user/components/page-width-pref.tsx"; import { Trans, useTranslation } from "react-i18next"; import ExportModal from "@/components/common/export-modal"; import { pageEditorAtom, yjsConnectionStatusAtom, } from "@/features/editor/atoms/editor-atoms.ts"; import { formattedDate, timeAgo } from "@/lib/time.ts"; import MovePageModal from "@/features/page/components/move-page-modal.tsx"; import { useTimeAgo } from "@/hooks/use-time-ago.tsx"; import ShareModal from "@/features/share/components/share-modal.tsx"; interface PageHeaderMenuProps { readOnly?: boolean; } export default function PageHeaderMenu({ readOnly }: PageHeaderMenuProps) { const { t } = useTranslation(); const toggleAside = useToggleAside(); const [yjsConnectionStatus] = useAtom(yjsConnectionStatusAtom); return ( <> {yjsConnectionStatus === "disconnected" && ( )} toggleAside("comments")} > toggleAside("toc")} > ); } interface PageActionMenuProps { readOnly?: boolean; } function PageActionMenu({ readOnly }: PageActionMenuProps) { const { t } = useTranslation(); const [, setHistoryModalOpen] = useAtom(historyAtoms); const clipboard = useClipboard({ timeout: 500 }); const { pageSlug, spaceSlug } = useParams(); const { data: page, isLoading } = usePageQuery({ pageId: extractPageSlugId(pageSlug), }); const { openDeleteModal } = useDeletePageModal(); const [tree] = useAtom(treeApiAtom); const [exportOpened, { open: openExportModal, close: closeExportModal }] = useDisclosure(false); const [ movePageModalOpened, { open: openMovePageModal, close: closeMoveSpaceModal }, ] = useDisclosure(false); const [pageEditor] = useAtom(pageEditorAtom); const pageUpdatedAt = useTimeAgo(page?.updatedAt); const handleCopyLink = () => { const pageUrl = getAppUrl() + buildPageUrl(spaceSlug, page.slugId, page.title); clipboard.copy(pageUrl); notifications.show({ message: t("Link copied") }); }; const handlePrint = () => { setTimeout(() => { window.print(); }, 250); }; const openHistoryModal = () => { setHistoryModalOpen(true); }; const handleDeletePage = () => { openDeleteModal({ onConfirm: () => tree?.delete(page.id) }); }; return ( <> } onClick={handleCopyLink} > {t("Copy link")} }> } onClick={openHistoryModal} > {t("Page history")} {!readOnly && ( } onClick={openMovePageModal} > {t("Move")} )} } onClick={openExportModal} > {t("Export")} } onClick={handlePrint} > {t("Print PDF")} {!readOnly && ( <> } onClick={handleDeletePage} > {t("Delete")} )} <>
{t("Word count: {{wordCount}}", { wordCount: pageEditor?.storage?.characterCount?.words(), })} }} /> {t("Created at: {{time}}", { time: formattedDate(page.createdAt), })}
); }