mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-12 12:28:42 +00:00
feat(core): bump blocksuite (#8114)
This commit is contained in:
@@ -15,13 +15,14 @@
|
||||
"@affine/graphql": "workspace:*",
|
||||
"@affine/i18n": "workspace:*",
|
||||
"@affine/templates": "workspace:*",
|
||||
"@blocksuite/block-std": "0.0.0-canary-20240903103812",
|
||||
"@blocksuite/blocks": "0.0.0-canary-20240903103812",
|
||||
"@blocksuite/global": "0.0.0-canary-20240903103812",
|
||||
"@blocksuite/affine-block-surface": "0.0.0-canary-20240905130451",
|
||||
"@blocksuite/block-std": "0.0.0-canary-20240905130451",
|
||||
"@blocksuite/blocks": "0.0.0-canary-20240905130451",
|
||||
"@blocksuite/global": "0.0.0-canary-20240905130451",
|
||||
"@blocksuite/icons": "2.1.67",
|
||||
"@blocksuite/inline": "0.0.0-canary-20240903103812",
|
||||
"@blocksuite/presets": "0.0.0-canary-20240903103812",
|
||||
"@blocksuite/store": "0.0.0-canary-20240903103812",
|
||||
"@blocksuite/inline": "0.0.0-canary-20240905130451",
|
||||
"@blocksuite/presets": "0.0.0-canary-20240905130451",
|
||||
"@blocksuite/store": "0.0.0-canary-20240905130451",
|
||||
"@dnd-kit/core": "^6.1.0",
|
||||
"@dnd-kit/modifiers": "^7.0.0",
|
||||
"@dnd-kit/sortable": "^8.0.0",
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
type EdgelessRootService,
|
||||
type ImageSelection,
|
||||
type PageRootService,
|
||||
TelemetryProvider,
|
||||
} from '@blocksuite/blocks';
|
||||
import { BlocksUtils, NoteDisplayMode } from '@blocksuite/blocks';
|
||||
import {
|
||||
@@ -304,7 +305,7 @@ const SAVE_CHAT_TO_BLOCK_ACTION: ChatAction = {
|
||||
const { notificationService } = rootService;
|
||||
const docModeService = host.std.get(DocModeProvider);
|
||||
const { layer } = surfaceService;
|
||||
const curMode = docModeService.getMode();
|
||||
const curMode = docModeService.getEditorMode() || 'page';
|
||||
const viewportCenter = getViewportCenter(
|
||||
curMode,
|
||||
rootService as PageRootService
|
||||
@@ -313,7 +314,7 @@ const SAVE_CHAT_TO_BLOCK_ACTION: ChatAction = {
|
||||
// If current mode is not edgeless, switch to edgeless mode first
|
||||
if (curMode !== 'edgeless') {
|
||||
// Set mode to edgeless
|
||||
docModeService.setMode('edgeless' as DocMode);
|
||||
docModeService.setEditorMode('edgeless' as DocMode);
|
||||
// Notify user to switch to edgeless mode
|
||||
notificationService?.notify({
|
||||
title: 'Save chat to a block',
|
||||
@@ -354,7 +355,8 @@ const SAVE_CHAT_TO_BLOCK_ACTION: ChatAction = {
|
||||
return false;
|
||||
}
|
||||
|
||||
rootService.telemetryService?.track('CanvasElementAdded', {
|
||||
const telemetryService = host.std.getOptional(TelemetryProvider);
|
||||
telemetryService?.track('CanvasElementAdded', {
|
||||
control: 'manually save',
|
||||
page: 'whiteboard editor',
|
||||
module: 'ai chat panel',
|
||||
@@ -463,7 +465,7 @@ const CREATE_AS_LINKED_DOC = {
|
||||
|
||||
const service = host.std.getService<EdgelessRootService>('affine:page');
|
||||
const docModeService = host.std.get(DocModeProvider);
|
||||
const mode = docModeService.getMode();
|
||||
const mode = docModeService.getEditorMode();
|
||||
if (mode !== 'edgeless') {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ export async function frameToCanvas(
|
||||
) {
|
||||
const edgelessRoot = getEdgelessRootFromEditor(editor);
|
||||
const { notes, frames, shapes, images } = BlocksUtils.splitElements(
|
||||
edgelessRoot.service.frame.getElementsInFrame(frame, true)
|
||||
edgelessRoot.service.frame.getElementsInFrameBound(frame, true)
|
||||
);
|
||||
if (notes.length + frames.length + images.length + shapes.length === 0) {
|
||||
return;
|
||||
@@ -106,7 +106,10 @@ export const getFirstImageInFrame = (
|
||||
editor: EditorHost
|
||||
) => {
|
||||
const edgelessRoot = getEdgelessRootFromEditor(editor);
|
||||
const elements = edgelessRoot.service.frame.getElementsInFrame(frame, false);
|
||||
const elements = edgelessRoot.service.frame.getElementsInFrameBound(
|
||||
frame,
|
||||
false
|
||||
);
|
||||
const image = elements.find(ele => {
|
||||
if (!BlocksUtils.isCanvasElement(ele)) {
|
||||
return ele.flavour === 'affine:image';
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import type { MindmapElementModel } from '@blocksuite/affine-block-surface';
|
||||
import { fitContent } from '@blocksuite/affine-block-surface';
|
||||
import type { EditorHost } from '@blocksuite/block-std';
|
||||
import type {
|
||||
AffineAIPanelWidget,
|
||||
@@ -5,7 +7,6 @@ import type {
|
||||
EdgelessCopilotWidget,
|
||||
EdgelessElementToolbarWidget,
|
||||
EdgelessRootService,
|
||||
MindmapElementModel,
|
||||
ShapeElementModel,
|
||||
SurfaceBlockModel,
|
||||
} from '@blocksuite/blocks';
|
||||
@@ -15,12 +16,12 @@ import {
|
||||
EDGELESS_TEXT_BLOCK_MIN_HEIGHT,
|
||||
EDGELESS_TEXT_BLOCK_MIN_WIDTH,
|
||||
EdgelessTextBlockModel,
|
||||
fitContent,
|
||||
ImageBlockModel,
|
||||
InsertBelowIcon,
|
||||
LightLoadingIcon,
|
||||
NoteDisplayMode,
|
||||
ResetIcon,
|
||||
TelemetryProvider,
|
||||
} from '@blocksuite/blocks';
|
||||
import { assertExists, Bound } from '@blocksuite/global/utils';
|
||||
import { html, type TemplateResult } from 'lit';
|
||||
@@ -435,7 +436,8 @@ export const responses: {
|
||||
});
|
||||
});
|
||||
|
||||
edgelessService.telemetryService?.track('CanvasElementAdded', {
|
||||
const telemetryService = host.std.getOptional(TelemetryProvider);
|
||||
telemetryService?.track('CanvasElementAdded', {
|
||||
control: 'ai',
|
||||
page: 'whiteboard editor',
|
||||
module: 'toolbar',
|
||||
|
||||
@@ -163,7 +163,12 @@ export class ChatPanelMessages extends WithDisposable(ShadowlessElement) {
|
||||
})
|
||||
);
|
||||
const docModeService = this.host.std.get(DocModeProvider);
|
||||
disposables.add(docModeService.onModeChange(() => this.requestUpdate()));
|
||||
disposables.add(
|
||||
docModeService.onPrimaryModeChange(
|
||||
() => this.requestUpdate(),
|
||||
this.host.doc.id
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { MindmapElementModel } from '@blocksuite/affine-block-surface';
|
||||
import {
|
||||
type AIItemGroupConfig,
|
||||
AIStarIconWithAnimation,
|
||||
BlocksUtils,
|
||||
MindmapElementModel,
|
||||
ShapeElementModel,
|
||||
TextElementModel,
|
||||
} from '@blocksuite/blocks';
|
||||
|
||||
@@ -40,7 +40,7 @@ export function setupSlashMenuAIEntry(slashMenu: AffineSlashMenuWidget) {
|
||||
|
||||
const chain = rootComponent.host.command.chain();
|
||||
const docModeService = rootComponent.std.get(DocModeProvider);
|
||||
const editorMode = docModeService.getMode(rootComponent.doc.id);
|
||||
const editorMode = docModeService.getPrimaryMode(rootComponent.doc.id);
|
||||
|
||||
return item?.showWhen?.(chain, editorMode, rootComponent.host) ?? true;
|
||||
};
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import type { MindmapStyle } from '@blocksuite/affine-block-surface';
|
||||
import type { EditorHost } from '@blocksuite/block-std';
|
||||
import type {
|
||||
AffineAIPanelWidgetConfig,
|
||||
MindmapStyle,
|
||||
} from '@blocksuite/blocks';
|
||||
import type { AffineAIPanelWidgetConfig } from '@blocksuite/blocks';
|
||||
import { markdownToMindmap, MiniMindmapPreview } from '@blocksuite/blocks';
|
||||
import { noop } from '@blocksuite/global/utils';
|
||||
import { html, nothing } from 'lit';
|
||||
|
||||
@@ -3,13 +3,14 @@ import './date-time';
|
||||
import '../_common/components/chat-action-list';
|
||||
import '../_common/components/copy-more';
|
||||
|
||||
import { CanvasElementType } from '@blocksuite/affine-block-surface';
|
||||
import { type EditorHost } from '@blocksuite/block-std';
|
||||
import {
|
||||
type AIError,
|
||||
CanvasElementType,
|
||||
ConnectorMode,
|
||||
DocModeProvider,
|
||||
type EdgelessRootService,
|
||||
TelemetryProvider,
|
||||
} from '@blocksuite/blocks';
|
||||
import {
|
||||
type AIChatBlockModel,
|
||||
@@ -138,7 +139,7 @@ export class AIChatBlockPeekView extends LitElement {
|
||||
*/
|
||||
createAIChatBlock = async () => {
|
||||
// Only create AI chat block in edgeless mode
|
||||
const mode = this._modeService.getMode();
|
||||
const mode = this._modeService.getEditorMode();
|
||||
if (mode !== 'edgeless') {
|
||||
return;
|
||||
}
|
||||
@@ -204,7 +205,8 @@ export class AIChatBlockPeekView extends LitElement {
|
||||
target: { id: aiChatBlockId },
|
||||
});
|
||||
|
||||
edgelessService.telemetryService?.track('CanvasElementAdded', {
|
||||
const telemetryService = this.host.std.getOptional(TelemetryProvider);
|
||||
telemetryService?.track('CanvasElementAdded', {
|
||||
control: 'conversation',
|
||||
page: 'whiteboard editor',
|
||||
module: 'canvas',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { MindmapElementModel } from '@blocksuite/affine-block-surface';
|
||||
import type { BlockComponent, EditorHost } from '@blocksuite/block-std';
|
||||
import {
|
||||
AFFINE_EDGELESS_COPILOT_WIDGET,
|
||||
type EdgelessCopilotWidget,
|
||||
type EdgelessRootService,
|
||||
matchFlavours,
|
||||
MindmapElementModel,
|
||||
type ShapeElementModel,
|
||||
} from '@blocksuite/blocks';
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ export async function frameToCanvas(
|
||||
) {
|
||||
const edgelessRoot = getEdgelessRootFromEditor(editor);
|
||||
const { notes, frames, shapes, images } = BlocksUtils.splitElements(
|
||||
edgelessRoot.service.frame.getElementsInFrame(frame, true)
|
||||
edgelessRoot.service.frame.getElementsInFrameBound(frame, true)
|
||||
);
|
||||
if (notes.length + frames.length + images.length + shapes.length === 0) {
|
||||
return;
|
||||
@@ -213,7 +213,10 @@ export const getFirstImageInFrame = (
|
||||
editor: EditorHost
|
||||
) => {
|
||||
const edgelessRoot = getEdgelessRootFromEditor(editor);
|
||||
const elements = edgelessRoot.service.frame.getElementsInFrame(frame, false);
|
||||
const elements = edgelessRoot.service.frame.getElementsInFrameBound(
|
||||
frame,
|
||||
false
|
||||
);
|
||||
const image = elements.find(ele => {
|
||||
if (!BlocksUtils.isCanvasElement(ele)) {
|
||||
return ele.flavour === 'affine:image';
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
useLitPortalFactory,
|
||||
} from '@affine/component';
|
||||
import { useJournalInfoHelper } from '@affine/core/hooks/use-journal';
|
||||
import { EditorService } from '@affine/core/modules/editor';
|
||||
import { EditorSettingService } from '@affine/core/modules/editor-settting';
|
||||
import { PeekViewService } from '@affine/core/modules/peek-view';
|
||||
import type { DocMode } from '@blocksuite/blocks';
|
||||
@@ -66,13 +67,19 @@ interface BlocksuiteEditorProps {
|
||||
|
||||
const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
|
||||
const [reactToLit, portals] = useLitPortalFactory();
|
||||
const { peekViewService, docService, docsService, editorSettingService } =
|
||||
useServices({
|
||||
PeekViewService,
|
||||
DocService,
|
||||
DocsService,
|
||||
EditorSettingService,
|
||||
});
|
||||
const {
|
||||
peekViewService,
|
||||
docService,
|
||||
docsService,
|
||||
editorSettingService,
|
||||
editorService,
|
||||
} = useServices({
|
||||
PeekViewService,
|
||||
DocService,
|
||||
DocsService,
|
||||
EditorSettingService,
|
||||
EditorService,
|
||||
});
|
||||
const framework = useFramework();
|
||||
const referenceRenderer: ReferenceReactRenderer = useMemo(() => {
|
||||
return function customReference(reference) {
|
||||
@@ -115,12 +122,15 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
|
||||
if (shared) {
|
||||
patched = patched.concat(patchForSharedPage());
|
||||
}
|
||||
patched = patched.concat(patchDocModeService(docService, docsService));
|
||||
patched = patched.concat(
|
||||
patchDocModeService(docService, docsService, editorService)
|
||||
);
|
||||
return patched;
|
||||
}, [
|
||||
confirmModal,
|
||||
docService,
|
||||
docsService,
|
||||
editorService,
|
||||
framework,
|
||||
page.readonly,
|
||||
peekViewService,
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
} from '@affine/core/blocksuite/presets/ai';
|
||||
import { mixpanel } from '@affine/core/mixpanel';
|
||||
import { EditorSettingService } from '@affine/core/modules/editor-settting';
|
||||
import { AffineCanvasTextFonts } from '@blocksuite/affine-block-surface';
|
||||
import {
|
||||
BlockFlavourIdentifier,
|
||||
BlockServiceIdentifier,
|
||||
@@ -11,9 +12,12 @@ import {
|
||||
type ExtensionType,
|
||||
StdIdentifier,
|
||||
} from '@blocksuite/block-std';
|
||||
import type { RootService, TelemetryEventMap } from '@blocksuite/blocks';
|
||||
import {
|
||||
AffineCanvasTextFonts,
|
||||
type RootService,
|
||||
type TelemetryEventMap,
|
||||
TelemetryProvider,
|
||||
} from '@blocksuite/blocks';
|
||||
import {
|
||||
EdgelessRootBlockSpec,
|
||||
EdgelessRootService,
|
||||
PageRootBlockSpec,
|
||||
@@ -44,15 +48,6 @@ function withAffineRootService(Service: typeof PageRootService) {
|
||||
override loadFonts(): void {
|
||||
customLoadFonts(this);
|
||||
}
|
||||
|
||||
override telemetryService = {
|
||||
track: <T extends keyof TelemetryEventMap>(
|
||||
eventName: T,
|
||||
props: TelemetryEventMap[T]
|
||||
) => {
|
||||
mixpanel.track(eventName as string, props as Record<string, unknown>);
|
||||
},
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -70,6 +65,17 @@ export function createPageRootBlockSpec(
|
||||
withAffineRootService(PageRootService),
|
||||
[StdIdentifier, BlockFlavourIdentifier('affine:page')]
|
||||
);
|
||||
di.addImpl(TelemetryProvider, () => ({
|
||||
track: <T extends keyof TelemetryEventMap>(
|
||||
eventName: T,
|
||||
props: TelemetryEventMap[T]
|
||||
) => {
|
||||
mixpanel.track(
|
||||
eventName as string,
|
||||
props as Record<string, unknown>
|
||||
);
|
||||
},
|
||||
}));
|
||||
},
|
||||
},
|
||||
ConfigExtension('affine:page', {
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
} from '@affine/component';
|
||||
import { track } from '@affine/core/mixpanel';
|
||||
import { DocsSearchService } from '@affine/core/modules/docs-search';
|
||||
import type { EditorService } from '@affine/core/modules/editor';
|
||||
import { resolveLinkToDoc } from '@affine/core/modules/navigation';
|
||||
import type { PeekViewService } from '@affine/core/modules/peek-view';
|
||||
import type { ActivePeekView } from '@affine/core/modules/peek-view/entities/peek-view';
|
||||
@@ -27,13 +28,14 @@ import {
|
||||
type WidgetComponent,
|
||||
} from '@blocksuite/block-std';
|
||||
import { BlockServiceWatcher } from '@blocksuite/block-std';
|
||||
import type {
|
||||
AffineReference,
|
||||
DatabaseBlockService,
|
||||
DocMode,
|
||||
ListBlockService,
|
||||
ParagraphBlockService,
|
||||
RootService,
|
||||
import {
|
||||
type AffineReference,
|
||||
type DatabaseBlockService,
|
||||
type DocMode,
|
||||
EmbedOptionProvider,
|
||||
type ListBlockService,
|
||||
type ParagraphBlockService,
|
||||
type RootService,
|
||||
} from '@blocksuite/blocks';
|
||||
import {
|
||||
AffineSlashMenuWidget,
|
||||
@@ -239,30 +241,37 @@ export function patchPeekViewService(service: PeekViewService) {
|
||||
|
||||
export function patchDocModeService(
|
||||
docService: DocService,
|
||||
docsService: DocsService
|
||||
docsService: DocsService,
|
||||
editorService: EditorService
|
||||
): ExtensionType {
|
||||
const DEFAULT_MODE = 'page';
|
||||
class AffineDocModeService implements DocModeProvider {
|
||||
setMode = (mode: DocMode, id?: string) => {
|
||||
setEditorMode = (mode: DocMode) => {
|
||||
editorService.editor.setMode(mode);
|
||||
};
|
||||
getEditorMode = () => {
|
||||
return editorService.editor.mode$.value;
|
||||
};
|
||||
setPrimaryMode = (mode: DocMode, id?: string) => {
|
||||
if (id) {
|
||||
docsService.list.setPrimaryMode(id, mode);
|
||||
} else {
|
||||
docService.doc.setPrimaryMode(mode);
|
||||
}
|
||||
};
|
||||
getMode = (id?: string) => {
|
||||
getPrimaryMode = (id?: string) => {
|
||||
const mode = id
|
||||
? docsService.list.getPrimaryMode(id)
|
||||
: docService.doc.getPrimaryMode();
|
||||
return (mode || DEFAULT_MODE) as DocMode;
|
||||
};
|
||||
toggleMode = (id?: string) => {
|
||||
togglePrimaryMode = (id?: string) => {
|
||||
const mode = id
|
||||
? docsService.list.togglePrimaryMode(id)
|
||||
: docService.doc.togglePrimaryMode();
|
||||
return (mode || DEFAULT_MODE) as DocMode;
|
||||
};
|
||||
onModeChange = (handler: (mode: DocMode) => void, id?: string) => {
|
||||
onPrimaryModeChange = (handler: (mode: DocMode) => void, id?: string) => {
|
||||
// eslint-disable-next-line rxjs/finnish
|
||||
const mode$ = id
|
||||
? docsService.list.primaryMode$(id)
|
||||
@@ -408,7 +417,7 @@ export function patchQuickSearchService(framework: FrameworkProvider) {
|
||||
) {
|
||||
const oldAction = item.action;
|
||||
item.action = async ({ model, rootComponent }) => {
|
||||
const { host, service, std } = rootComponent;
|
||||
const { host, std } = rootComponent;
|
||||
const quickSearchService =
|
||||
component.std.getOptional(QuickSearchProvider);
|
||||
|
||||
@@ -434,9 +443,9 @@ export function patchQuickSearchService(framework: FrameworkProvider) {
|
||||
}
|
||||
track.doc.editor.slashMenu.linkDoc({ control: 'linkDoc' });
|
||||
} else if ('userInput' in result) {
|
||||
const embedOptions = service.getEmbedBlockOptions(
|
||||
result.userInput
|
||||
);
|
||||
const embedOptions = std
|
||||
.get(EmbedOptionProvider)
|
||||
.getEmbedBlockOptions(result.userInput);
|
||||
if (!embedOptions) return;
|
||||
|
||||
host.doc.addSiblingBlocks(model, [
|
||||
@@ -466,31 +475,28 @@ export function patchEdgelessClipboard() {
|
||||
const { component } = view;
|
||||
if (component instanceof EdgelessRootBlockComponent) {
|
||||
const AIChatBlockFlavour = AIChatBlockSchema.model.flavour;
|
||||
const createFunc = (blocks: BlockSnapshot[]) => {
|
||||
const blockIds = blocks.map(({ props }) => {
|
||||
const {
|
||||
const createFunc = (block: BlockSnapshot) => {
|
||||
const {
|
||||
xywh,
|
||||
scale,
|
||||
messages,
|
||||
sessionId,
|
||||
rootDocId,
|
||||
rootWorkspaceId,
|
||||
} = block.props;
|
||||
const blockId = component.service.addBlock(
|
||||
AIChatBlockFlavour,
|
||||
{
|
||||
xywh,
|
||||
scale,
|
||||
messages,
|
||||
sessionId,
|
||||
rootDocId,
|
||||
rootWorkspaceId,
|
||||
} = props;
|
||||
const blockId = component.service.addBlock(
|
||||
AIChatBlockFlavour,
|
||||
{
|
||||
xywh,
|
||||
scale,
|
||||
messages,
|
||||
sessionId,
|
||||
rootDocId,
|
||||
rootWorkspaceId,
|
||||
},
|
||||
component.surface.model.id
|
||||
);
|
||||
return blockId;
|
||||
});
|
||||
return blockIds;
|
||||
},
|
||||
component.surface.model.id
|
||||
);
|
||||
return blockId;
|
||||
};
|
||||
component.clipboardController.registerBlock(
|
||||
AIChatBlockFlavour,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { EdgelessSurfaceBlockSpec } from '@blocksuite/affine-block-surface';
|
||||
import type { ExtensionType } from '@blocksuite/block-std';
|
||||
import {
|
||||
EdgelessNoteBlockSpec,
|
||||
EdgelessSurfaceBlockSpec,
|
||||
EdgelessSurfaceRefBlockSpec,
|
||||
EdgelessTextBlockSpec,
|
||||
FrameBlockSpec,
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
import { PageSurfaceBlockSpec } from '@blocksuite/affine-block-surface';
|
||||
import type { ExtensionType } from '@blocksuite/block-std';
|
||||
import {
|
||||
NoteBlockSpec,
|
||||
PageSurfaceBlockSpec,
|
||||
PageSurfaceRefBlockSpec,
|
||||
} from '@blocksuite/blocks';
|
||||
import { NoteBlockSpec, PageSurfaceRefBlockSpec } from '@blocksuite/blocks';
|
||||
import { type FrameworkProvider } from '@toeverything/infra';
|
||||
|
||||
import { AIBlockSpecs, DefaultBlockSpecs } from './common';
|
||||
|
||||
@@ -52,10 +52,10 @@ export const EditorChatPanel = forwardRef(function EditorChatPanel(
|
||||
pageService.slots.docLinkClicked.on(() => {
|
||||
(chatPanelRef.current as ChatPanel).doc = editor.doc;
|
||||
}),
|
||||
docModeService.onModeChange(() => {
|
||||
docModeService.onPrimaryModeChange(() => {
|
||||
if (!editor.host) return;
|
||||
(chatPanelRef.current as ChatPanel).host = editor.host;
|
||||
}),
|
||||
}, editor.doc.id),
|
||||
];
|
||||
|
||||
return () => disposable.forEach(d => d.dispose());
|
||||
|
||||
Reference in New Issue
Block a user