mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
77 lines
2.5 KiB
TypeScript
77 lines
2.5 KiB
TypeScript
|
import React from "react";
|
||
|
// editor
|
||
|
import { EditorRefApi, ILiteTextEditor, LiteTextEditorWithRef } from "@plane/lite-text-editor";
|
||
|
// components
|
||
|
import { IssueCommentToolbar } from "@/components/editor";
|
||
|
// helpers
|
||
|
import { cn } from "@/helpers/common.helper";
|
||
|
import { isEmptyHtmlString } from "@/helpers/string.helper";
|
||
|
// hooks
|
||
|
import { useMention } from "@/hooks/use-mention";
|
||
|
// services
|
||
|
import fileService from "@/services/file.service";
|
||
|
|
||
|
interface LiteTextEditorWrapperProps extends Omit<ILiteTextEditor, "fileHandler" | "mentionHandler"> {
|
||
|
workspaceSlug: string;
|
||
|
workspaceId: string;
|
||
|
isSubmitting?: boolean;
|
||
|
showSubmitButton?: boolean;
|
||
|
}
|
||
|
|
||
|
export const LiteTextEditor = React.forwardRef<EditorRefApi, LiteTextEditorWrapperProps>((props, ref) => {
|
||
|
const {
|
||
|
containerClassName,
|
||
|
workspaceSlug,
|
||
|
workspaceId,
|
||
|
isSubmitting = false,
|
||
|
showSubmitButton = true,
|
||
|
...rest
|
||
|
} = props;
|
||
|
// use-mention
|
||
|
const { mentionHighlights } = useMention();
|
||
|
|
||
|
function isMutableRefObject<T>(ref: React.ForwardedRef<T>): ref is React.MutableRefObject<T | null> {
|
||
|
return !!ref && typeof ref === "object" && "current" in ref;
|
||
|
}
|
||
|
const isEmpty =
|
||
|
props.initialValue === "" ||
|
||
|
props.initialValue?.trim() === "" ||
|
||
|
props.initialValue === "<p></p>" ||
|
||
|
isEmptyHtmlString(props.initialValue ?? "");
|
||
|
|
||
|
return (
|
||
|
<div className="border border-custom-border-200 rounded p-3 space-y-3">
|
||
|
<LiteTextEditorWithRef
|
||
|
ref={ref}
|
||
|
fileHandler={{
|
||
|
upload: fileService.getUploadFileFunction(workspaceSlug),
|
||
|
delete: fileService.getDeleteImageFunction(workspaceId),
|
||
|
restore: fileService.getRestoreImageFunction(workspaceId),
|
||
|
cancel: fileService.cancelUpload,
|
||
|
}}
|
||
|
mentionHandler={{
|
||
|
highlights: mentionHighlights,
|
||
|
// suggestions disabled for now
|
||
|
}}
|
||
|
{...rest}
|
||
|
// overriding the containerClassName to add relative class passed
|
||
|
containerClassName={cn(containerClassName, "relative")}
|
||
|
/>
|
||
|
<IssueCommentToolbar
|
||
|
executeCommand={(key) => {
|
||
|
if (isMutableRefObject<EditorRefApi>(ref)) {
|
||
|
ref.current?.executeMenuItemCommand(key);
|
||
|
}
|
||
|
}}
|
||
|
isSubmitting={isSubmitting}
|
||
|
showSubmitButton={showSubmitButton}
|
||
|
handleSubmit={(e) => rest.onEnterKeyPress?.(e)}
|
||
|
isCommentEmpty={isEmpty}
|
||
|
editorRef={isMutableRefObject<EditorRefApi>(ref) ? ref : null}
|
||
|
/>
|
||
|
</div>
|
||
|
);
|
||
|
});
|
||
|
|
||
|
LiteTextEditor.displayName = "LiteTextEditor";
|