-
+
{isEditable ? (
@@ -80,7 +98,7 @@ export const TitleWrapper = ({ editor, node }) => {
) : null}
) : null}
- {portals}
+ {isEditable ? createAddCoverUIControl() : null}
);
diff --git a/packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx b/packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx
index 5b956ca1..2b4a30f3 100644
--- a/packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx
+++ b/packages/client/src/tiptap/editor/collaboration/collaboration/editor.tsx
@@ -1,4 +1,12 @@
+import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
+
import { BackTop, Toast } from '@douyinfe/semi-ui';
+
+import { EditorContent, useEditor } from 'tiptap/core';
+import { Collaboration } from 'tiptap/core/extensions/collaboration';
+import { CollaborationCursor } from 'tiptap/core/extensions/collaboration-cursor';
+import { Tocs } from 'tiptap/editor/tocs';
+
import { HocuspocusProvider } from '@hocuspocus/provider';
import cls from 'classnames';
import { Banner } from 'components/banner';
@@ -11,17 +19,13 @@ import { useDocumentStyle } from 'hooks/use-document-style';
import { useNetwork } from 'hooks/use-network';
import { IsOnMobile } from 'hooks/use-on-mobile';
import { useToggle } from 'hooks/use-toggle';
-import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
-import { EditorContent, useEditor } from 'tiptap/core';
-import { Collaboration } from 'tiptap/core/extensions/collaboration';
-import { CollaborationCursor } from 'tiptap/core/extensions/collaboration-cursor';
-import { Tocs } from 'tiptap/editor/tocs';
import { CollaborationKit } from '../kit';
-import styles from './index.module.scss';
import { MenuBar } from './menubar';
import { ICollaborationEditorProps, ProviderStatus } from './type';
+import styles from './index.module.scss';
+
type IProps = Pick<
ICollaborationEditorProps,
'editable' | 'user' | 'onTitleUpdate' | 'menubar' | 'renderInEditorPortal' | 'hideComment'
@@ -165,7 +169,11 @@ export const EditorInstance = forwardRef((props: IProps, ref) => {
{(!online || status === 'disconnected') && (
)}
diff --git a/packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss b/packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss
index 1d46b9d0..1da0c864 100644
--- a/packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss
+++ b/packages/client/src/tiptap/editor/collaboration/collaboration/index.module.scss
@@ -50,6 +50,7 @@
flex: 1;
justify-content: center;
flex-wrap: nowrap;
+ scroll-behavior: smooth;
.contentWrap {
width: 100%;
diff --git a/packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx b/packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx
index 9194c3ca..5f0b404c 100644
--- a/packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx
+++ b/packages/client/src/tiptap/editor/collaboration/collaboration/index.tsx
@@ -1,24 +1,35 @@
+import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
+
import { Spin, Typography } from '@douyinfe/semi-ui';
-import { HocuspocusProvider } from '@hocuspocus/provider';
-import { DataRender } from 'components/data-render';
-import deepEqual from 'deep-equal';
-import { throttle } from 'helpers/throttle';
-import { useToggle } from 'hooks/use-toggle';
-import { SecureDocumentIllustration } from 'illustrations/secure-document';
-import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
+
import { Editor } from 'tiptap/core';
import { IndexeddbPersistence } from 'tiptap/core/thritypart/y-indexeddb';
+import { HocuspocusProvider } from '@hocuspocus/provider';
+import { DataRender } from 'components/data-render';
+import deepEqual from 'deep-equal';
+import { useToggle } from 'hooks/use-toggle';
+import { SecureDocumentIllustration } from 'illustrations/secure-document';
+
import { EditorInstance } from './editor';
-import styles from './index.module.scss';
import { ICollaborationEditorProps, ProviderStatus } from './type';
+import styles from './index.module.scss';
+
const { Text } = Typography;
export type ICollaborationRefProps = {
getEditor: () => Editor;
};
+const errorContainerStyle = {
+ margin: '10%',
+ display: 'flex',
+ justifyContent: 'center',
+ flexDirection: 'column',
+ alignItems: 'center',
+} as React.CSSProperties;
+
export const CollaborationEditor = forwardRef((props: ICollaborationEditorProps, ref) => {
const {
id: documentId,
@@ -49,17 +60,17 @@ export const CollaborationEditor = forwardRef((props: ICollaborationEditorProps,
editable,
},
maxAttempts: 1,
- onAwarenessUpdate: throttle(({ states }) => {
+ onAwarenessUpdate: ({ states }) => {
const users = states.map((state) => ({ clientId: state.clientId, user: state.user }));
if (deepEqual(user, lastAwarenessRef.current)) {
return;
}
onAwarenessUpdate && onAwarenessUpdate(users);
lastAwarenessRef.current = users;
- }, 200),
- onAuthenticationFailed() {
+ },
+ onAuthenticationFailed(e) {
toggleLoading(false);
- setError(new Error('鉴权失败!暂时无法提供服务'));
+ setError(e || new Error('鉴权失败!暂时无法提供服务'));
},
onSynced() {
toggleLoading(false);
@@ -70,6 +81,34 @@ export const CollaborationEditor = forwardRef((props: ICollaborationEditorProps,
} as any);
}, [documentId, user, type, editable, onAwarenessUpdate, toggleLoading]);
+ const renderEditor = useCallback(
+ () => (
+
+ ),
+ [documentId, editable, hideComment, hocuspocusProvider, menubar, onTitleUpdate, renderInEditorPortal, status, user]
+ );
+
+ const renderError = useCallback(
+ (error) => (
+
+
+ {(error && error.message) || '未知错误'}
+
+ ),
+ []
+ );
+
useImperativeHandle(
ref,
() =>
@@ -102,49 +141,9 @@ export const CollaborationEditor = forwardRef((props: ICollaborationEditorProps,
}, [hocuspocusProvider]);
return (
- <>
-
-
-
-
- }
- error={error}
- errorContent={(error) => (
-
-
-
- {(error && error.message) || '未知错误'}
-
-
- )}
- normalContent={() => (
-
- )}
- />
-
- >
+