feat(editor): add viewport element service (#10727)

This commit is contained in:
Saul-Mirone
2025-03-10 04:26:18 +00:00
parent 7ab3b695dc
commit 4dd5f2ffb0
12 changed files with 107 additions and 99 deletions

View File

@@ -21,4 +21,5 @@ export * from './telemetry-service';
export * from './theme-service';
export * from './toolbar-service';
export * from './user-service';
export * from './viewport-element-service';
export * from './virtual-keyboard-service';

View File

@@ -0,0 +1,60 @@
import { createIdentifier } from '@blocksuite/global/di';
import { BlockSuiteError } from '@blocksuite/global/exceptions';
import type { ExtensionType } from '@blocksuite/store';
import type { Viewport } from '../types';
export interface ViewportElementService {
get viewportElement(): HTMLElement;
get viewport(): Viewport;
}
export const ViewportElementProvider = createIdentifier<ViewportElementService>(
'ViewportElementProvider'
);
export const ViewportElementExtension = (selector: string): ExtensionType => {
return {
setup: di => {
di.override(ViewportElementProvider, () => {
const getViewportElement = (): HTMLElement => {
const viewportElement = document.querySelector<HTMLElement>(selector);
if (!viewportElement) {
throw new BlockSuiteError(
BlockSuiteError.ErrorCode.ValueNotExists,
`ViewportElementProvider: viewport element is not found`
);
}
return viewportElement;
};
return {
get viewportElement() {
return getViewportElement();
},
get viewport() {
const viewportElement = getViewportElement();
const {
scrollLeft,
scrollTop,
scrollWidth,
scrollHeight,
clientWidth,
clientHeight,
} = viewportElement;
const { top, left } = viewportElement.getBoundingClientRect();
return {
top,
left,
scrollLeft,
scrollTop,
scrollWidth,
scrollHeight,
clientWidth,
clientHeight,
};
},
};
});
},
};
};