refactor: editor warnings

This commit is contained in:
Aaryan Khandelwal
2025-07-09 13:20:42 +05:30
parent a4ec80ceca
commit 1e17c30e37
56 changed files with 134 additions and 115 deletions

View File

@@ -69,7 +69,7 @@ export const LiteTextEditor = React.forwardRef<EditorRefApi, LiteTextEditorWrapp
}}
isSubmitting={isSubmitting}
showSubmitButton={showSubmitButton}
handleSubmit={(e) => rest.onEnterKeyPress?.(e)}
handleSubmit={() => rest.onEnterKeyPress?.()}
isCommentEmpty={isEmpty}
editorRef={editorRef}
/>

View File

@@ -4,7 +4,7 @@ import React, { useRef, useState } from "react";
import { observer } from "mobx-react";
import { useForm, Controller } from "react-hook-form";
// plane imports
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
import { SitesFileService } from "@plane/services";
import { TIssuePublicComment } from "@plane/types";
import { TOAST_TYPE, setToast } from "@plane/ui";
@@ -75,8 +75,8 @@ export const AddComment: React.FC<Props> = observer((props) => {
control={control}
render={({ field: { value, onChange } }) => (
<LiteTextEditor
onEnterKeyPress={(e) => {
if (currentUser) handleSubmit(onSubmit)(e);
onEnterKeyPress={() => {
if (currentUser) handleSubmit(onSubmit)();
}}
anchor={anchor}
workspaceId={workspaceID?.toString() ?? ""}

View File

@@ -4,7 +4,7 @@ import { Controller, useForm } from "react-hook-form";
import { Check, MessageSquare, MoreVertical, X } from "lucide-react";
import { Menu, Transition } from "@headlessui/react";
// plane imports
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
import { TIssuePublicComment } from "@plane/types";
import { getFileURL } from "@plane/utils";
// components

View File

@@ -1,6 +1,6 @@
import { Control } from "react-hook-form";
// plane imports
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
// types
import { TBulkIssueProperties, TIssue } from "@plane/types";

View File

@@ -3,7 +3,7 @@
import React, { useEffect, useRef, useState } from "react";
import { ChevronRight, CornerDownRight, LucideIcon, RefreshCcw, Sparkles, TriangleAlert } from "lucide-react";
// plane editor
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
// plane ui
import { Tooltip } from "@plane/ui";
// components

View File

@@ -6,7 +6,7 @@ import { useForm } from "react-hook-form";
import { Check, Globe2, Lock, Pencil, Trash2, X } from "lucide-react";
// PLane
import { EIssueCommentAccessSpecifier } from "@plane/constants";
import { EditorReadOnlyRefApi, EditorRefApi } from "@plane/editor";
import type { EditorReadOnlyRefApi, EditorRefApi } from "@plane/editor";
import { useTranslation } from "@plane/i18n";
import { TIssueComment, TCommentsOperations } from "@plane/types";
import { CustomMenu } from "@plane/ui";
@@ -150,9 +150,9 @@ export const CommentCard: FC<TCommentCard> = observer((props) => {
initialValue={commentHTML ?? ""}
value={null}
onChange={(comment_json, comment_html) => setValue("comment_html", comment_html)}
onEnterKeyPress={(e) => {
onEnterKeyPress={() => {
if (!isEmpty && !isSubmitting) {
handleSubmit(onEnter)(e);
handleSubmit(onEnter)();
}
}}
showSubmitButton={false}

View File

@@ -4,7 +4,7 @@ import { useForm, Controller } from "react-hook-form";
// plane constants
import { EIssueCommentAccessSpecifier } from "@plane/constants";
// plane editor
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
// plane types
import { TIssueComment, TCommentsOperations } from "@plane/types";
import { cn, isCommentEmpty } from "@plane/utils";
@@ -117,9 +117,9 @@ export const CommentCreate: FC<TCommentCreate> = observer((props) => {
id={"add_comment_" + entityId}
value={"<p></p>"}
workspaceSlug={workspaceSlug}
onEnterKeyPress={(e) => {
onEnterKeyPress={() => {
if (!isEmpty && !isSubmitting) {
handleSubmit(onSubmit)(e);
handleSubmit(onSubmit)();
}
}}
ref={editorRef}

View File

@@ -4,7 +4,7 @@ import React, { useEffect, useState, useCallback } from "react";
import { Globe2, Lock, LucideIcon } from "lucide-react";
import { EIssueCommentAccessSpecifier } from "@plane/constants";
// editor
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
// i18n
import { useTranslation } from "@plane/i18n";
// ui

View File

@@ -3,7 +3,7 @@
import React, { useEffect, useState, useCallback } from "react";
import { Palette, Trash2 } from "lucide-react";
// editor
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
// ui
import { useOutsideClickDetector } from "@plane/hooks";
import { TSticky } from "@plane/types";

View File

@@ -4,7 +4,7 @@ import { Dispatch, SetStateAction, useEffect, useMemo, useRef } from "react";
import { observer } from "mobx-react";
// plane imports
import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants";
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
import { EInboxIssueSource, TIssue, TNameDescriptionLoader } from "@plane/types";
import { Loader, TOAST_TYPE, setToast } from "@plane/ui";
// components

View File

@@ -4,7 +4,7 @@ import { FC, FormEvent, useCallback, useEffect, useRef, useState } from "react";
import { observer } from "mobx-react";
// plane imports
import { ETabIndices, WORK_ITEM_TRACKER_EVENTS } from "@plane/constants";
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
// types
import { useTranslation } from "@plane/i18n";
import { TIssue } from "@plane/types";

View File

@@ -4,7 +4,7 @@ import { FC, RefObject } from "react";
import { observer } from "mobx-react";
// plane imports
import { ETabIndices } from "@plane/constants";
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
import { useTranslation } from "@plane/i18n";
import { EFileAssetType, TIssue } from "@plane/types";
import { Loader } from "@plane/ui";
@@ -27,7 +27,7 @@ type TInboxIssueDescription = {
data: Partial<TIssue>;
handleData: (issueKey: keyof Partial<TIssue>, issueValue: Partial<TIssue>[keyof Partial<TIssue>]) => void;
editorRef: RefObject<EditorRefApi>;
onEnterKeyPress?: (e?: any) => void;
onEnterKeyPress?: () => void;
onAssetUpload?: (assetId: string) => void;
};

View File

@@ -3,7 +3,7 @@
import { useEffect, useRef, useState } from "react";
import { observer } from "mobx-react";
// plane imports
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
import { EIssueServiceType, TNameDescriptionLoader } from "@plane/types";
// components
import { getTextContent } from "@plane/utils";

View File

@@ -1,12 +1,12 @@
import { createContext } from "react";
// ce imports
import { TIssueFields } from "ce/components/issues";
// react-hook-form
import { UseFormReset, UseFormWatch } from "react-hook-form";
// plane imports
import { EditorRefApi } from "@plane/editor";
import { ISearchIssueResponse, TIssue } from "@plane/types";
import { TIssuePropertyValues, TIssuePropertyValueErrors } from "@/plane-web/types/issue-types";
import { TIssueFields } from "ce/components/issues";
import type { EditorRefApi } from "@plane/editor";
import type { ISearchIssueResponse, TIssue } from "@plane/types";
import type { TIssuePropertyValues, TIssuePropertyValueErrors } from "@/plane-web/types/issue-types";
export type TPropertyValuesValidationProps = {
projectId: string | null;

View File

@@ -6,13 +6,20 @@ import { useParams } from "next/navigation";
import { FormProvider, useForm } from "react-hook-form";
// editor
import { ETabIndices, DEFAULT_WORK_ITEM_FORM_VALUES } from "@plane/constants";
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
// i18n
import { useTranslation } from "@plane/i18n";
import { EIssuesStoreType, TIssue, TWorkspaceDraftIssue } from "@plane/types";
// hooks
import { Button, ToggleSwitch, TOAST_TYPE, setToast } from "@plane/ui";
import { convertWorkItemDataToSearchResponse, getUpdateFormDataForReset, cn, getTextContent, getChangedIssuefields, getTabIndex } from "@plane/utils";
import {
convertWorkItemDataToSearchResponse,
getUpdateFormDataForReset,
cn,
getTextContent,
getChangedIssuefields,
getTabIndex,
} from "@plane/utils";
// components
import {
IssueDefaultProperties,

View File

@@ -2,8 +2,8 @@
import { FC, useEffect, useRef } from "react";
import { observer } from "mobx-react";
// plane imports
import { EditorRefApi } from "@plane/editor";
import { TNameDescriptionLoader } from "@plane/types";
import type { EditorRefApi } from "@plane/editor";
import type { TNameDescriptionLoader } from "@plane/types";
// components
import { getTextContent } from "@plane/utils";
import { DescriptionVersionsRoot } from "@/components/core/description-versions";

View File

@@ -15,14 +15,12 @@ import {
LockKeyholeOpen,
Trash2,
} from "lucide-react";
// constants
// plane imports
import { EPageAccess, PROJECT_PAGE_TRACKER_ELEMENTS } from "@plane/constants";
// plane editor
import { EditorRefApi } from "@plane/editor";
// plane ui
import type { EditorRefApi } from "@plane/editor";
import { ArchiveIcon, ContextMenu, CustomMenu, TContextMenuItem } from "@plane/ui";
// components
import { cn } from "@plane/utils";
// components
import { DeletePageModal } from "@/components/pages";
// helpers
// hooks

View File

@@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef, useState } from "react";
import { observer } from "mobx-react";
import { useSearchParams } from "next/navigation";
// plane imports
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
import { TDocumentPayload, TPage, TPageVersion, TWebhookConnectionQueryParams } from "@plane/types";
// components
import {

View File

@@ -1,6 +1,6 @@
import { useState, useEffect, useCallback } from "react";
// plane imports
import { EditorRefApi, IMarking } from "@plane/editor";
import type { EditorRefApi, IMarking } from "@plane/editor";
import { cn } from "@plane/utils";
// components
import { OutlineHeading1, OutlineHeading2, OutlineHeading3, THeadingComponentProps } from "./heading-components";

View File

@@ -2,12 +2,10 @@
import { useState } from "react";
import { observer } from "mobx-react";
// editor
import { EditorRefApi } from "@plane/editor";
// ui
// plane imports
import type { EditorRefApi } from "@plane/editor";
import { TextArea } from "@plane/ui";
import { cn, getPageName } from "@plane/utils";
// helpers
// hooks
import { usePageFilters } from "@/hooks/use-page-filters";

View File

@@ -2,9 +2,8 @@
import React, { useEffect, useState, useCallback } from "react";
import { Check, ChevronDown } from "lucide-react";
// editor
import { EditorRefApi } from "@plane/editor";
// ui
// plane imports
import type { EditorRefApi } from "@plane/editor";
import { CustomMenu, Tooltip } from "@plane/ui";
// components
import { cn } from "@plane/utils";

View File

@@ -4,8 +4,7 @@ import { useState } from "react";
import { PageProps, pdf } from "@react-pdf/renderer";
import { Controller, useForm } from "react-hook-form";
// plane editor
import { EditorRefApi } from "@plane/editor";
// plane ui
import type { EditorRefApi } from "@plane/editor";
import { Button, CustomSelect, EModalPosition, EModalWidth, ModalCore, setToast, TOAST_TYPE } from "@plane/ui";
// components
import { PDFDocument } from "@/components/editor";

View File

@@ -1,11 +1,9 @@
import { useCallback, useEffect, useRef } from "react";
import { usePathname } from "next/navigation";
import { Controller, useForm } from "react-hook-form";
// plane editor
import { EditorRefApi } from "@plane/editor";
// plane types
import { TSticky } from "@plane/types";
// plane utils
// plane imports
import type { EditorRefApi } from "@plane/editor";
import type { TSticky } from "@plane/types";
import { cn, isCommentEmpty } from "@plane/utils";
// hooks
import { useWorkspace } from "@/hooks/store";

View File

@@ -1,7 +1,7 @@
import { useState, useEffect, useCallback, useMemo } from "react";
import { EditorRefApi, TDocumentEventsServer } from "@plane/editor";
// plane imports
import type { EditorRefApi, TDocumentEventsServer } from "@plane/editor";
import { DocumentCollaborativeEvents, TDocumentEventsClient, getServerEventName } from "@plane/editor/lib";
// plane ui
import { TOAST_TYPE, setToast } from "@plane/ui";
// store
import { TPageInstance } from "@/store/pages/base-page";

View File

@@ -1,7 +1,7 @@
import { useMemo } from "react";
// plane imports
import { IS_FAVORITE_MENU_OPEN, PROJECT_PAGE_TRACKER_EVENTS } from "@plane/constants";
import { EditorRefApi } from "@plane/editor";
import type { EditorRefApi } from "@plane/editor";
import { EPageAccess } from "@plane/types";
import { setToast, TOAST_TYPE } from "@plane/ui";
import { copyUrlToClipboard } from "@plane/utils";

View File

@@ -1,6 +1,6 @@
import { action, makeObservable, observable, runInAction } from "mobx";
// plane imports
import { EditorRefApi, TEditorAsset } from "@plane/editor";
import type { EditorRefApi, TEditorAsset } from "@plane/editor";
export type TPageEditorInstance = {
// observables

View File

@@ -1,4 +1,4 @@
import { Extensions } from "@tiptap/core";
import type { Extensions } from "@tiptap/core";
import React from "react";
// plane imports
import { cn } from "@plane/utils";
@@ -7,7 +7,7 @@ import { PageRenderer } from "@/components/editors";
// constants
import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config";
// extensions
import { WorkItemEmbedExtension } from "@/extensions";
import { WorkItemEmbedExtension } from "@/extensions/work-item-embed";
// helpers
import { getEditorClassNames } from "@/helpers/common";
// hooks

View File

@@ -1,11 +1,14 @@
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
// plane imports
import { cn } from "@plane/utils";
// components
import { DocumentContentLoader, EditorContainer, EditorContentWrapper } from "@/components/editors";
import { DocumentContentLoader } from "@/components/editors";
import { AIFeaturesMenu, BlockMenu, EditorBubbleMenu } from "@/components/menus";
// types
import { TAIHandler, TDisplayConfig } from "@/types";
import type { TAIHandler, TDisplayConfig } from "@/types";
// local imports
import { EditorContainer } from "../editor-container";
import { EditorContentWrapper } from "../editor-content";
type Props = {
aiHandler?: TAIHandler;
@@ -37,7 +40,7 @@ export const PageRenderer = (props: Props) => {
editorContainerClassName={editorContainerClassName}
id={id}
>
<EditorContentWrapper editor={editor} id={id} tabIndex={tabIndex} />
<EditorContentWrapper editor={editor} tabIndex={tabIndex} />
{editor.isEditable && (
<div>
{bubbleMenuEnabled && <EditorBubbleMenu editor={editor} />}

View File

@@ -1,4 +1,4 @@
import { Extensions } from "@tiptap/core";
import type { Extensions } from "@tiptap/core";
import React, { forwardRef, MutableRefObject } from "react";
// plane imports
import { cn } from "@plane/utils";
@@ -7,13 +7,13 @@ import { PageRenderer } from "@/components/editors";
// constants
import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config";
// extensions
import { WorkItemEmbedExtension } from "@/extensions";
import { WorkItemEmbedExtension } from "@/extensions/work-item-embed";
// helpers
import { getEditorClassNames } from "@/helpers/common";
// hooks
import { useReadOnlyEditor } from "@/hooks/use-read-only-editor";
// types
import { EditorReadOnlyRefApi, IDocumentReadOnlyEditorProps } from "@/types";
import type { EditorReadOnlyRefApi, IDocumentReadOnlyEditorProps } from "@/types";
const DocumentReadOnlyEditor: React.FC<IDocumentReadOnlyEditorProps> = (props) => {
const {

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
import { FC, ReactNode, useRef } from "react";
// plane utils
import { cn } from "@plane/utils";
@@ -55,7 +55,8 @@ export const EditorContainer: FC<EditorContainerProps> = (props) => {
// Check if its last node and add new node
if (lastNode) {
const isLastNodeEmptyParagraph = lastNode.type.name === CORE_EXTENSIONS.PARAGRAPH && lastNode.content.size === 0;
const isLastNodeEmptyParagraph =
lastNode.type.name === CORE_EXTENSIONS.PARAGRAPH && lastNode.content.size === 0;
// Only insert a new paragraph if the last node is not an empty paragraph and not a doc node
if (!isLastNodeEmptyParagraph && lastNode.type.name !== "doc") {
const endPosition = editor?.state.doc.content.size;

View File

@@ -4,12 +4,11 @@ import { FC, ReactNode } from "react";
interface EditorContentProps {
children?: ReactNode;
editor: Editor | null;
id: string;
tabIndex?: number;
}
export const EditorContentWrapper: FC<EditorContentProps> = (props) => {
const { editor, children, id, tabIndex } = props;
const { editor, children, tabIndex } = props;
return (
<div tabIndex={tabIndex} onFocus={() => editor?.chain().focus(undefined, { scrollIntoView: false }).run()}>

View File

@@ -1,13 +1,13 @@
import { Editor, Extensions } from "@tiptap/core";
// components
import { EditorContainer } from "@/components/editors";
import type { Editor, Extensions } from "@tiptap/core";
// constants
import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config";
// hooks
import { getEditorClassNames } from "@/helpers/common";
import { useEditor } from "@/hooks/use-editor";
// types
import { IEditorProps } from "@/types";
import type { IEditorProps } from "@/types";
// local imports
import { EditorContainer } from "./editor-container";
import { EditorContentWrapper } from "./editor-content";
type Props = IEditorProps & {
@@ -78,7 +78,7 @@ export const EditorWrapper: React.FC<Props> = (props) => {
>
{children?.(editor)}
<div className="flex flex-col">
<EditorContentWrapper editor={editor} id={id} tabIndex={tabIndex} />
<EditorContentWrapper editor={editor} tabIndex={tabIndex} />
</div>
</EditorContainer>
);

View File

@@ -1,7 +1,3 @@
export * from "./document";
export * from "./lite-text";
export * from "./rich-text";
export * from "./editor-container";
export * from "./editor-content";
export * from "./editor-wrapper";
export * from "./read-only-editor-wrapper";

View File

@@ -1,10 +1,10 @@
import { forwardRef, useMemo } from "react";
// components
import { EditorWrapper } from "@/components/editors/editor-wrapper";
// extensions
import { EnterKeyExtension } from "@/extensions";
import { EnterKeyExtension } from "@/extensions/enter-key";
// types
import { EditorRefApi, ILiteTextEditorProps } from "@/types";
import type { EditorRefApi, ILiteTextEditorProps } from "@/types";
// local imports
import { EditorWrapper } from "../editor-wrapper";
const LiteTextEditor: React.FC<ILiteTextEditorProps> = (props) => {
const { onEnterKeyPress, disabledExtensions, extensions: externalExtensions = [] } = props;

View File

@@ -1,8 +1,8 @@
import { forwardRef } from "react";
// components
import { ReadOnlyEditorWrapper } from "@/components/editors";
// types
import { EditorReadOnlyRefApi, ILiteTextReadOnlyEditorProps } from "@/types";
import type { EditorReadOnlyRefApi, ILiteTextReadOnlyEditorProps } from "@/types";
// local imports
import { ReadOnlyEditorWrapper } from "../read-only-editor-wrapper";
const LiteTextReadOnlyEditorWithRef = forwardRef<EditorReadOnlyRefApi, ILiteTextReadOnlyEditorProps>((props, ref) => (
<ReadOnlyEditorWrapper {...props} forwardedRef={ref as React.MutableRefObject<EditorReadOnlyRefApi | null>} />

View File

@@ -1,5 +1,3 @@
// components
import { EditorContainer, EditorContentWrapper } from "@/components/editors";
// constants
import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config";
// helpers
@@ -7,7 +5,10 @@ import { getEditorClassNames } from "@/helpers/common";
// hooks
import { useReadOnlyEditor } from "@/hooks/use-read-only-editor";
// types
import { IReadOnlyEditorProps } from "@/types";
import type { IReadOnlyEditorProps } from "@/types";
// local imports
import { EditorContainer } from "./editor-container";
import { EditorContentWrapper } from "./editor-content";
export const ReadOnlyEditorWrapper = (props: IReadOnlyEditorProps) => {
const {
@@ -49,7 +50,7 @@ export const ReadOnlyEditorWrapper = (props: IReadOnlyEditorProps) => {
id={id}
>
<div className="flex flex-col">
<EditorContentWrapper editor={editor} id={id} />
<EditorContentWrapper editor={editor} />
</div>
</EditorContainer>
);

View File

@@ -1,13 +1,14 @@
import { forwardRef, useCallback } from "react";
// components
import { EditorWrapper } from "@/components/editors";
import { EditorBubbleMenu } from "@/components/menus";
// extensions
import { SideMenuExtension } from "@/extensions";
import { SideMenuExtension } from "@/extensions/side-menu";
// plane editor imports
import { RichTextEditorAdditionalExtensions } from "@/plane-editor/extensions/rich-text/extensions";
// types
import { EditorRefApi, IRichTextEditorProps } from "@/types";
import type { EditorRefApi, IRichTextEditorProps } from "@/types";
// local imports
import { EditorWrapper } from "../editor-wrapper";
const RichTextEditor: React.FC<IRichTextEditorProps> = (props) => {
const {

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
import { CSSProperties, useEffect, useState } from "react";
// components
import { LinkEditView, LinkPreview } from "@/components/links";

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
import { Copy, LucideIcon, Trash2 } from "lucide-react";
import { useCallback, useEffect, useRef } from "react";
import tippy, { Instance } from "tippy.js";

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/core";
import type { Editor } from "@tiptap/core";
import { AlignCenter, AlignLeft, AlignRight, LucideIcon } from "lucide-react";
// plane utils
import { cn } from "@plane/utils";

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
import { ALargeSmall, Ban } from "lucide-react";
import { Dispatch, FC, SetStateAction } from "react";
// plane utils

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/core";
import type { Editor } from "@tiptap/core";
import { Check, Link, Trash2 } from "lucide-react";
import { Dispatch, FC, SetStateAction, useCallback, useRef, useState } from "react";
// plane imports

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
import { Check, ChevronDown } from "lucide-react";
import { Dispatch, FC, SetStateAction } from "react";
// plane utils

View File

@@ -1,6 +1,6 @@
import { BubbleMenu, BubbleMenuProps, Editor, isNodeSelection, useEditorState } from "@tiptap/react";
import { FC, useEffect, useState, useRef } from "react";
// plane utils
// plane imports
import { cn } from "@plane/utils";
// components
import {
@@ -22,9 +22,10 @@ import { COLORS_LIST } from "@/constants/common";
import { CORE_EXTENSIONS } from "@/constants/extension";
// extensions
import { isCellSelection } from "@/extensions/table/table/utilities/is-cell-selection";
// types
import type { TEditorCommands } from "@/types";
// local components
import { TextAlignmentSelector } from "./alignment-selector";
import { TEditorCommands } from "@/types";
type EditorBubbleMenuProps = Omit<BubbleMenuProps, "children">;
@@ -39,13 +40,13 @@ export interface EditorStateType {
center: boolean;
color: { key: string; label: string; textColor: string; backgroundColor: string } | undefined;
backgroundColor:
| {
key: string;
label: string;
textColor: string;
backgroundColor: string;
}
| undefined;
| {
key: string;
label: string;
textColor: string;
backgroundColor: string;
}
| undefined;
}
export const EditorBubbleMenu: FC<EditorBubbleMenuProps> = (props: { editor: Editor }) => {

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
import {
BoldIcon,
Heading1,

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/core";
import type { Editor } from "@tiptap/core";
import { useEditorState } from "@tiptap/react";
import { useEffect, useRef, useState } from "react";
// constants

View File

@@ -1,4 +1,4 @@
import { Editor } from "@tiptap/core";
import type { Editor } from "@tiptap/core";
import { MarkType } from "@tiptap/pm/model";
import { Plugin, PluginKey } from "@tiptap/pm/state";
import { find } from "linkifyjs";

View File

@@ -3,8 +3,10 @@ import { Extension } from "@tiptap/core";
import { CORE_EXTENSIONS } from "@/constants/extension";
// helpers
import { getExtensionStorage } from "@/helpers/get-extension-storage";
// types
import type { IEditorProps } from "@/types";
export const EnterKeyExtension = (onEnterKeyPress?: () => void) =>
export const EnterKeyExtension = (onEnterKeyPress?: IEditorProps["onEnterKeyPress"]) =>
Extension.create({
name: CORE_EXTENSIONS.ENTER_KEY,

View File

@@ -1,6 +1,6 @@
"use client";
import { Editor } from "@tiptap/react";
import type { Editor } from "@tiptap/react";
import { forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, useState } from "react";
import { v4 as uuidv4 } from "uuid";
// plane utils

View File

@@ -1,6 +1,6 @@
import { Extension } from "@tiptap/core";
import { Plugin, PluginKey } from "@tiptap/pm/state";
import { EditorView } from "@tiptap/pm/view";
import type { EditorView } from "@tiptap/pm/view";
// constants
import { CORE_EXTENSIONS } from "@/constants/extension";
// plugins

View File

@@ -32,6 +32,7 @@ function scrollToNode(editor: Editor, pos: number): void {
}
}
// eslint-disable-next-line no-undef
export function scrollToNodeViaDOMCoordinates(editor: Editor, pos: number, behavior?: ScrollBehavior): void {
const view = editor.view;

View File

@@ -36,7 +36,9 @@ export const useEditor = (props: TEditorHookProps) => {
initialValue,
mentionHandler,
onAssetChange,
onBlur,
onChange,
onFocus,
onTransaction,
placeholder,
provider,
@@ -75,6 +77,12 @@ export const useEditor = (props: TEditorHookProps) => {
onTransaction: () => {
onTransaction?.();
},
onFocus: () => {
onFocus?.();
},
onBlur: () => {
onBlur?.();
},
onUpdate: ({ editor }) => onChange?.(editor.getJSON(), editor.getHTML()),
onDestroy: () => handleEditorReady?.(false),
},

View File

@@ -111,6 +111,7 @@ export interface EditorRefApi extends EditorReadOnlyRefApi {
onDocumentInfoChange: (callback: (documentInfo: TDocumentInfo) => void) => () => void;
onHeadingChange: (callback: (headings: IMarking[]) => void) => () => void;
onStateChange: (callback: () => void) => () => void;
// eslint-disable-next-line no-undef
scrollToNodeViaDOMCoordinates: (behavior?: ScrollBehavior, position?: number) => void;
setEditorValueAtCursorPosition: (content: string) => void;
setFocusAtPosition: (position: number) => void;
@@ -134,8 +135,10 @@ export interface IEditorProps {
initialValue: string;
mentionHandler: TMentionHandler;
onAssetChange?: (assets: TEditorAsset[]) => void;
onBlur?: () => void;
onChange?: (json: object, html: string) => void;
onEnterKeyPress?: (e?: any) => void;
onEnterKeyPress?: () => void;
onFocus?: () => void;
onTransaction?: () => void;
placeholder?: string | ((isFocused: boolean, value: string) => string);
tabIndex?: number;

View File

@@ -19,7 +19,9 @@ export type TEditorHookProps = TCoreHookProps &
| "id"
| "mentionHandler"
| "onAssetChange"
| "onBlur"
| "onChange"
| "onFocus"
| "onTransaction"
| "placeholder"
| "tabIndex"
@@ -40,7 +42,9 @@ export type TCollaborativeEditorHookProps = TCoreHookProps &
| "id"
| "mentionHandler"
| "onAssetChange"
| "onBlur"
| "onChange"
| "onFocus"
| "onTransaction"
| "placeholder"
| "tabIndex"

View File

@@ -1,5 +1,5 @@
// plane types
import { IUserLite, TSearchEntities } from "@plane/types";
import { TSearchEntities } from "@plane/types";
export type TMentionSuggestion = {
entity_identifier: string;

View File

@@ -1,7 +1,7 @@
import { CSSProperties } from "react";
import { Editor, Range } from "@tiptap/core";
// types
import { TEditorCommands } from "@/types";
import { CSSProperties } from "react";
// local imports
import type { TEditorCommands } from "./editor";
export type CommandProps = {
editor: Editor;