diff --git a/web/ce/components/pages/index.ts b/web/ce/components/pages/index.ts index 6f3d30c9a9..715386d0d0 100644 --- a/web/ce/components/pages/index.ts +++ b/web/ce/components/pages/index.ts @@ -1,2 +1,3 @@ export * from "./editor"; +export * from "./version"; export * from "./extra-actions"; diff --git a/web/ce/components/pages/version/editor.tsx b/web/ce/components/pages/version/editor.tsx new file mode 100644 index 0000000000..56615c7246 --- /dev/null +++ b/web/ce/components/pages/version/editor.tsx @@ -0,0 +1,115 @@ +import { observer } from "mobx-react"; +import { useParams } from "next/navigation"; +// plane editor +import { DocumentReadOnlyEditorWithRef, TDisplayConfig } from "@plane/editor"; +// plane types +import { IUserLite, TPageVersion } from "@plane/types"; +// plane ui +import { Loader } from "@plane/ui"; +// hooks +import { useMember, useMention, usePage, useUser } from "@/hooks/store"; +import { usePageFilters } from "@/hooks/use-page-filters"; +// plane web hooks +import { useIssueEmbed } from "@/plane-web/hooks/use-issue-embed"; + +type Props = { + activeVersion: string | null; + isCurrentVersionActive: boolean; + pageId: string; + versionDetails: TPageVersion | undefined; +}; + +export const PagesVersionEditor: React.FC = observer((props) => { + const { activeVersion, isCurrentVersionActive, pageId, versionDetails } = props; + // params + const { workspaceSlug, projectId } = useParams(); + // store hooks + const { data: currentUser } = useUser(); + const { + getUserDetails, + project: { getProjectMemberIds }, + } = useMember(); + const currentPageDetails = usePage(pageId); + // derived values + const projectMemberIds = projectId ? getProjectMemberIds(projectId.toString()) : []; + const projectMemberDetails = projectMemberIds?.map((id) => getUserDetails(id) as IUserLite); + // issue-embed + const { issueEmbedProps } = useIssueEmbed(workspaceSlug?.toString() ?? "", projectId?.toString() ?? ""); + // use-mention + const { mentionHighlights } = useMention({ + workspaceSlug: workspaceSlug?.toString() ?? "", + projectId: projectId?.toString() ?? "", + members: projectMemberDetails, + user: currentUser ?? undefined, + }); + // page filters + const { fontSize, fontStyle } = usePageFilters(); + + const displayConfig: TDisplayConfig = { + fontSize, + fontStyle, + }; + + if (!isCurrentVersionActive && !versionDetails) + return ( +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ + +
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+ ); + + const description = isCurrentVersionActive ? currentPageDetails.description_html : versionDetails?.description_html; + if (description === undefined || description?.trim() === "") return null; + + return ( +

"} + containerClassName="p-0 pb-64 border-none" + displayConfig={displayConfig} + editorClassName="pl-10" + mentionHandler={{ + highlights: mentionHighlights, + }} + embedHandler={{ + issue: { + widgetCallback: issueEmbedProps.widgetCallback, + }, + }} + /> + ); +}); diff --git a/web/ce/components/pages/version/index.ts b/web/ce/components/pages/version/index.ts new file mode 100644 index 0000000000..8b1fd904bb --- /dev/null +++ b/web/ce/components/pages/version/index.ts @@ -0,0 +1 @@ +export * from "./editor"; diff --git a/web/core/components/pages/version/main-content.tsx b/web/core/components/pages/version/main-content.tsx index 5bfe29bb29..f729556792 100644 --- a/web/core/components/pages/version/main-content.tsx +++ b/web/core/components/pages/version/main-content.tsx @@ -8,7 +8,7 @@ import { TPageVersion } from "@plane/types"; import { Button, setToast, TOAST_TYPE } from "@plane/ui"; // helpers import { renderFormattedDate, renderFormattedTime } from "@/helpers/date-time.helper"; -// components +// plane web components import { PagesVersionEditor } from "@/plane-web/components/pages"; type Props = {