import { useParams } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { Skeleton, Stack, Text } from "@mantine/core"; import React from "react"; import ReadonlyPageEditor from "@/features/editor/readonly-page-editor.tsx"; import { extractPageSlugId } from "@/lib"; import { Error404 } from "@/components/ui/error-404.tsx"; import { usePublicSpacePageQuery } from "@/features/public-space/queries/public-space-query.ts"; import { DocumentTitle } from "@/components/ui/document-title.tsx"; import DocsBreadcrumbs from "@/features/public-space/components/docs/docs-breadcrumbs.tsx"; import DocsPageNav from "@/features/public-space/components/docs/docs-page-nav.tsx"; import { CustomAvatar } from "@/components/ui/custom-avatar.tsx"; import { timeAgo } from "@/lib/time.ts"; import styles from "@/features/public-space/components/docs/docs.module.css"; export default function PublicSpacePage() { const { t } = useTranslation(); const { spaceSlug, pageSlug } = useParams(); const { data, isLoading, isError, error } = usePublicSpacePageQuery({ spaceSlug, pageSlugId: pageSlug ? extractPageSlugId(pageSlug) : undefined, }); if (isLoading) { return ( ); } if (isError || !data) { if ([401, 403, 404].includes(error?.["status"])) { return ; } return
{t("Error fetching page data.")}
; } if (data.page === null) { return (
{t("This space has no public pages yet.")}
); } const showAuthor = data.byline?.author === true && Boolean(data.page.creator?.name); const showUpdatedAt = data.byline?.updatedAt === true && Boolean(data.page.updatedAt); return (
{!data.searchIndexing && } } trailingSpace={false} />
); } type DocsBylineProps = { creator?: { name: string; avatarUrl: string }; updatedAt?: Date | string; }; function DocsByline({ creator, updatedAt }: DocsBylineProps) { const { t } = useTranslation(); if (!creator && !updatedAt) return null; return (
{creator && ( {t("By {{name}}", { name: creator.name })} )} {creator && updatedAt && ( )} {updatedAt && ( {t("Updated {{date}}", { date: timeAgo(new Date(updatedAt)) })} )}
); }