import { Table, Group, Text, Anchor, Menu, ActionIcon } from "@mantine/core"; import React from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { modals } from "@mantine/modals"; import { notifications } from "@mantine/notifications"; import { IconCopy, IconDots, IconExternalLink, IconWorld, IconWorldOff, } from "@tabler/icons-react"; import Paginate from "@/components/common/paginate.tsx"; import { useCursorPaginate } from "@/hooks/use-cursor-paginate"; import { usePublishedSpacesQuery, usePublishSpaceMutation, } from "@/features/public-space/queries/public-space-query.ts"; import { IPublishedSpaceItem } from "@/features/public-space/types/public-space.types.ts"; import { buildPublicSpaceUrl } from "@/features/page/page.utils.ts"; import { getAppUrl, getSpaceUrl } from "@/lib/config.ts"; import { useClipboard } from "@/hooks/use-clipboard"; import { formatLocalized, useDateFnsLocale } from "@/lib/date-locale.ts"; import { CustomAvatar } from "@/components/ui/custom-avatar.tsx"; import { AvatarIconType } from "@/features/attachments/types/attachment.types.ts"; import { EmptyState } from "@/components/ui/empty-state.tsx"; import rowClasses from "@/components/ui/clickable-table-row.module.css"; export default function PublishedSpacesList() { const { t } = useTranslation(); const { cursor, goNext, goPrev } = useCursorPaginate(); const { data, isLoading } = usePublishedSpacesQuery({ cursor }); const locale = useDateFnsLocale(); if (!isLoading && data?.items.length === 0) { return ; } return ( <> {t("Space")} {t("Published by")} {t("Published at")} {data?.items.map((item: IPublishedSpaceItem) => ( {item.space.name} {item.creator?.name} {formatLocalized( item.createdAt, "MMM dd, yyyy", "PP", locale, )} ))}
{data?.items.length > 0 && ( goNext(data?.meta?.nextCursor)} onPrev={goPrev} /> )} ); } function PublishedSpaceActionMenu({ item }: { item: IPublishedSpaceItem }) { const { t } = useTranslation(); const navigate = useNavigate(); const clipboard = useClipboard(); const publishMutation = usePublishSpaceMutation(); const publicPath = buildPublicSpaceUrl({ spaceSlug: item.space.slug }); const copyLink = () => { clipboard.copy(`${getAppUrl()}${publicPath}`); notifications.show({ message: t("Link copied") }); }; const onUnpublish = async () => { try { await publishMutation.mutateAsync({ spaceId: item.spaceId, enabled: false, }); } catch { // error handled by mutation } }; const openUnpublishModal = () => modals.openConfirmModal({ title: t("Unpublish space"), children: ( {t( "This space will no longer be publicly accessible. Are you sure?", )} ), centered: true, labels: { confirm: t("Unpublish"), cancel: t("Cancel") }, confirmProps: { color: "red" }, onConfirm: onUnpublish, }); return ( }> {t("Copy link")} navigate(getSpaceUrl(item.space.slug))} leftSection={} > {t("Open space")} } disabled={item.space?.userRole !== "admin"} > {t("Unpublish")} ); }