diff --git a/blocksuite/affine/components/src/context-menu/sub-menu.ts b/blocksuite/affine/components/src/context-menu/sub-menu.ts index d74ce7d52f..b88f1aa070 100644 --- a/blocksuite/affine/components/src/context-menu/sub-menu.ts +++ b/blocksuite/affine/components/src/context-menu/sub-menu.ts @@ -85,6 +85,8 @@ export class MenuSubMenu extends MenuFocusable { .catch(err => console.error(err)); }); this.menu.openSubMenu(menu); + // in case that the menu is not closed, but the component is removed, + this.disposables.add(unsub); } protected override render(): unknown { diff --git a/blocksuite/affine/gfx/template/src/toolbar/template-tool-button.ts b/blocksuite/affine/gfx/template/src/toolbar/template-tool-button.ts index 89030472a9..42d2e592d3 100644 --- a/blocksuite/affine/gfx/template/src/toolbar/template-tool-button.ts +++ b/blocksuite/affine/gfx/template/src/toolbar/template-tool-button.ts @@ -116,6 +116,7 @@ export class EdgelessTemplateButton extends EdgelessToolbarToolMixin( `; private _cleanup: (() => void) | null = null; + private _autoUpdateCleanup: (() => void) | null = null; private _prevTool: ToolOptionWithType | null = null; @@ -128,6 +129,11 @@ export class EdgelessTemplateButton extends EdgelessToolbarToolMixin( return [TemplateCard1[theme], TemplateCard2[theme], TemplateCard3[theme]]; } + override connectedCallback() { + super.connectedCallback(); + this.disposables.add(() => this._autoUpdateCleanup?.()); + } + private _closePanel() { if (this._openedPanel) { this._openedPanel.remove(); @@ -175,8 +181,8 @@ export class EdgelessTemplateButton extends EdgelessToolbarToolMixin( requestAnimationFrame(() => { const arrowEl = panel.renderRoot.querySelector('.arrow') as HTMLElement; - - autoUpdate(this, panel, () => { + this._autoUpdateCleanup?.(); + this._autoUpdateCleanup = autoUpdate(this, panel, () => { computePosition(this, panel, { placement: 'top', middleware: [offset(20), arrow({ element: arrowEl }), shift()], diff --git a/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts b/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts index 5024908771..bc856b414f 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/copy-more.ts @@ -160,6 +160,7 @@ export class ChatCopyMore extends WithDisposable(LitElement) { mainAxis: 0, crossAxis: -100, }); + this.disposables.add(() => this._morePopper?.dispose()); } } } diff --git a/packages/frontend/core/src/blocksuite/ai/widgets/edgeless-copilot/index.ts b/packages/frontend/core/src/blocksuite/ai/widgets/edgeless-copilot/index.ts index ccf30178d0..529909cade 100644 --- a/packages/frontend/core/src/blocksuite/ai/widgets/edgeless-copilot/index.ts +++ b/packages/frontend/core/src/blocksuite/ai/widgets/edgeless-copilot/index.ts @@ -54,6 +54,8 @@ export class EdgelessCopilotWidget extends WidgetComponent { private _selectionModelRect!: DOMRect; + private _autoUpdateCleanup: (() => void) | null = null; + groups: AIItemGroupConfig[] = []; get gfx() { @@ -145,7 +147,8 @@ export class EdgelessCopilotWidget extends WidgetComponent { const originMaxHeight = window.getComputedStyle(panel).maxHeight; - autoUpdate(referenceElement, panel, () => { + this._autoUpdateCleanup?.(); + this._autoUpdateCleanup = autoUpdate(referenceElement, panel, () => { computePosition(referenceElement, panel, { placement: 'bottom-start', middleware: [ @@ -267,6 +270,8 @@ export class EdgelessCopilotWidget extends WidgetComponent { this._copilotPanel = null; }) ); + + this._disposables.add(() => this._autoUpdateCleanup?.()); } determineInsertionBounds(width = 800, height = 95) {