) => {
- const editorHost = editorHostRef.current;
- const doc = docRef.current;
- if (!editorHost || !doc) return;
- const edgelessService = editorHost.std.getService(
- 'affine:page'
- ) as EdgelessRootService;
- const blocks = doc.getBlocksByFlavour(flavour);
- const surface = getSurfaceBlock(doc);
- const elements = surface?.getElementsByType(flavour) || [];
- [...blocks, ...elements].forEach(ele => {
- edgelessService.updateElement(ele.id, props);
- });
- },
- [flavour]
- );
+ const updateElements = useCallback(() => {
+ const editorHost = editorHostRef.current;
+ const doc = docRef.current;
+ if (!editorHost || !doc) return;
+ const edgelessService = editorHost.std.getService(
+ 'affine:page'
+ ) as EdgelessRootService;
+ const elements = getElements(doc);
+ const props = editorSetting.get(keyName) as any;
+ elements.forEach(element => {
+ edgelessService.updateElement(element.id, props);
+ });
+ }, [editorSetting, getElements, keyName]);
const renderEditor = useCallback(async () => {
if (!wrapperRef.current) return;
@@ -72,8 +69,12 @@ export const EdgelessSnapshot = (props: Props) => {
}).render();
docRef.current = doc;
editorHostRef.current = editorHost;
- const settings = editorSetting.get(keyName);
- updateElement(settings as any);
+
+ if (firstUpdate) {
+ firstUpdate(doc, editorHost);
+ } else {
+ updateElements();
+ }
// refresh viewport
const edgelessService = editorHost.std.getService(
@@ -82,20 +83,18 @@ export const EdgelessSnapshot = (props: Props) => {
edgelessService.specSlots.viewConnected.once(({ component }) => {
const edgelessBlock = component as any;
edgelessBlock.editorViewportSelector = 'ref-viewport';
- edgelessBlock.service.viewport.sizeUpdated.once(() => {
- const frame = getFrameBlock(doc);
- if (frame) {
- boundMap.set(docName, Bound.deserialize(frame.xywh));
- doc.deleteBlock(frame);
- }
- const bound = boundMap.get(docName);
- bound && edgelessService.viewport.setViewportByBound(bound);
- });
+ const frame = getFrameBlock(doc);
+ if (frame) {
+ boundMap.set(docName, Bound.deserialize(frame.xywh));
+ doc.deleteBlock(frame);
+ }
+ const bound = boundMap.get(docName);
+ bound && edgelessService.viewport.setViewportByBound(bound);
});
// append to dom node
wrapperRef.current.append(editorHost);
- }, [docName, editorSetting, keyName, updateElement]);
+ }, [docName, firstUpdate, updateElements]);
useEffect(() => {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
@@ -117,11 +116,11 @@ export const EdgelessSnapshot = (props: Props) => {
)
.subscribe(([prev, current]) => {
if (!isEqual(prev, current)) {
- updateElement(current);
+ updateElements();
}
});
return () => sub.unsubscribe();
- }, [editorSetting.provider, flavour, keyName, updateElement]);
+ }, [editorSetting.provider, keyName, updateElements]);
return (
@@ -136,6 +135,7 @@ export const EdgelessSnapshot = (props: Props) => {
height,
}}
>
+ {children}
);
};
diff --git a/packages/frontend/core/src/components/affine/setting-modal/general-setting/editor/edgeless/text.tsx b/packages/frontend/core/src/components/affine/setting-modal/general-setting/editor/edgeless/text.tsx
index b8eaa22b5d..9a8a1a16db 100644
--- a/packages/frontend/core/src/components/affine/setting-modal/general-setting/editor/edgeless/text.tsx
+++ b/packages/frontend/core/src/components/affine/setting-modal/general-setting/editor/edgeless/text.tsx
@@ -17,6 +17,7 @@ import {
LineColorMap,
TextAlign,
} from '@blocksuite/blocks';
+import type { Doc } from '@blocksuite/store';
import { useFramework, useLiveData } from '@toeverything/infra';
import { useCallback, useMemo } from 'react';
@@ -139,13 +140,18 @@ export const TextSettings = () => {
const { color } = settings['affine:edgeless-text'];
return getColorFromMap(color, LineColorMap);
}, [getColorFromMap, settings]);
+
+ const getElements = useCallback((doc: Doc) => {
+ return doc.getBlocksByFlavour('affine:edgeless-text') || [];
+ }, []);
+
return (
<>