mirror of
https://github.com/docmost/docmost.git
synced 2026-05-07 06:23:06 +08:00
d2629afff2
* feat: add heading extension with unique ID support and scroll functionality * Added unique id for heading * remove baseUrl heading storage * move heading to extensions package * WIP * support anchors in mentions * enhance scrolling functionality * nodeId function * fix nanoid import * Bring unique-id extension local * fixes * fix internal link scroll in public pages * add unique id server side * rename mention anchor to anchorId * capture first anchorId on paste --------- Co-authored-by: Romik <40670677+RomikMakavana@users.noreply.github.com>
82 lines
2.3 KiB
TypeScript
82 lines
2.3 KiB
TypeScript
import { useParams } from "react-router-dom";
|
|
import { usePageQuery } from "@/features/page/queries/page-query";
|
|
import { FullEditor } from "@/features/editor/full-editor";
|
|
import HistoryModal from "@/features/page-history/components/history-modal";
|
|
import { Helmet } from "react-helmet-async";
|
|
import PageHeader from "@/features/page/components/header/page-header.tsx";
|
|
import { extractPageSlugId } from "@/lib";
|
|
import { useGetSpaceBySlugQuery } from "@/features/space/queries/space-query.ts";
|
|
import { useSpaceAbility } from "@/features/space/permissions/use-space-ability.ts";
|
|
import {
|
|
SpaceCaslAction,
|
|
SpaceCaslSubject,
|
|
} from "@/features/space/permissions/permissions.type.ts";
|
|
import { useTranslation } from "react-i18next";
|
|
import React from "react";
|
|
|
|
const MemoizedFullEditor = React.memo(FullEditor);
|
|
const MemoizedPageHeader = React.memo(PageHeader);
|
|
const MemoizedHistoryModal = React.memo(HistoryModal);
|
|
|
|
export default function Page() {
|
|
const { t } = useTranslation();
|
|
const { pageSlug } = useParams();
|
|
|
|
const {
|
|
data: page,
|
|
isLoading,
|
|
isError,
|
|
error,
|
|
} = usePageQuery({ pageId: extractPageSlugId(pageSlug) });
|
|
const { data: space } = useGetSpaceBySlugQuery(page?.space?.slug);
|
|
|
|
const spaceRules = space?.membership?.permissions;
|
|
const spaceAbility = useSpaceAbility(spaceRules);
|
|
|
|
if (isLoading) {
|
|
return <></>;
|
|
}
|
|
|
|
if (isError || !page) {
|
|
if ([401, 403, 404].includes(error?.["status"])) {
|
|
return <div>{t("Page not found")}</div>;
|
|
}
|
|
return <div>{t("Error fetching page data.")}</div>;
|
|
}
|
|
|
|
if (!space) {
|
|
return <></>;
|
|
}
|
|
|
|
return (
|
|
page && (
|
|
<div>
|
|
<Helmet>
|
|
<title>{`${page?.icon || ""} ${page?.title || t("untitled")}`}</title>
|
|
</Helmet>
|
|
|
|
<MemoizedPageHeader
|
|
readOnly={spaceAbility.cannot(
|
|
SpaceCaslAction.Manage,
|
|
SpaceCaslSubject.Page,
|
|
)}
|
|
/>
|
|
|
|
<MemoizedFullEditor
|
|
key={page.id}
|
|
pageId={page.id}
|
|
title={page.title}
|
|
content={page.content}
|
|
slugId={page.slugId}
|
|
spaceSlug={page?.space?.slug}
|
|
editable={spaceAbility.can(
|
|
SpaceCaslAction.Manage,
|
|
SpaceCaslSubject.Page,
|
|
)}
|
|
/>
|
|
<MemoizedHistoryModal pageId={page.id} />
|
|
</div>
|
|
)
|
|
);
|
|
}
|