feat(core): bump blocksuite (#8114)

This commit is contained in:
akumatus
2024-09-05 13:54:56 +00:00
parent 5083fe3cfd
commit 4bbb94c32d
23 changed files with 313 additions and 249 deletions

View File

@@ -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",

View File

@@ -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;
}

View File

@@ -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';

View File

@@ -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',

View File

@@ -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
)
);
}
}

View File

@@ -1,8 +1,8 @@
import { MindmapElementModel } from '@blocksuite/affine-block-surface';
import {
type AIItemGroupConfig,
AIStarIconWithAnimation,
BlocksUtils,
MindmapElementModel,
ShapeElementModel,
TextElementModel,
} from '@blocksuite/blocks';

View File

@@ -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;
};

View File

@@ -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';

View File

@@ -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',

View File

@@ -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';

View File

@@ -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';

View File

@@ -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,

View File

@@ -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', {

View File

@@ -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,

View File

@@ -1,7 +1,7 @@
import { EdgelessSurfaceBlockSpec } from '@blocksuite/affine-block-surface';
import type { ExtensionType } from '@blocksuite/block-std';
import {
EdgelessNoteBlockSpec,
EdgelessSurfaceBlockSpec,
EdgelessSurfaceRefBlockSpec,
EdgelessTextBlockSpec,
FrameBlockSpec,

View File

@@ -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';

View File

@@ -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());