From 9a651a5b53ac336ad55fdcfd4814b417ce32193f Mon Sep 17 00:00:00 2001 From: L-Sun Date: Wed, 28 May 2025 10:55:32 +0000 Subject: [PATCH] fix(editor): tool panel not closed when user close keyboard with default gesture in android (#12613) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close [BS-3159](https://linear.app/affine-design/issue/BS-3159/输入法自带的键盘收起操作后-占位符还留着) ## Summary by CodeRabbit - **Bug Fixes** - The toolbar now automatically closes when the keyboard is dismissed and no panel is open, ensuring smoother user experience. - Improved cleanup to prevent delayed actions after the toolbar is closed, enhancing stability. --- .../widgets/keyboard-toolbar/src/keyboard-toolbar.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts index 8d74bade03..fba1dcba42 100644 --- a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts +++ b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts @@ -8,7 +8,7 @@ import { requiredProperties, ShadowlessElement, } from '@blocksuite/std'; -import { effect, type Signal, signal } from '@preact/signals-core'; +import { effect, type Signal, signal, untracked } from '@preact/signals-core'; import { html } from 'lit'; import { property } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; @@ -260,6 +260,11 @@ export class AffineKeyboardToolbar extends SignalWatcher( if (this.keyboard.visible$.value) { this._closeToolPanel(); } + // when keyboard is closed and the panel is not opened, we need to close the toolbar, + // this usually happens when user close keyboard from system side + else if (this.hasUpdated && untracked(() => !this.panelOpened)) { + this.close(true); + } }) ); @@ -308,9 +313,12 @@ export class AffineKeyboardToolbar extends SignalWatcher( override firstUpdated() { // workaround for the virtual keyboard showing transition animation - setTimeout(() => { + const timeoutId = setTimeout(() => { this._scrollCurrentBlockIntoView(); }, 700); + this.disposables.add(() => { + clearTimeout(timeoutId); + }); } override render() {