## Issue https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/issues/207 ## 状況 [[Obsidian Mobile]] 1.4.16で再現するが、状況による。 ### 再現する状況 - [[Obsidian Mobile]] - Obsidian Desktopで以下すべての条件を満たしたとき - `app.emulateMobile(true)` でモバイルデバッグモード - 横幅を縮めてモバイルと同じUI状態にする ### 挙動とエラー - ダイアログが閉じて何も起こらない - エラーは発生しない ## 調査 - navigateの2回目の呼び出しがうまくいってなさそう - 1回目はちゃんと機能しているはず(たぶん) - `navigate`は`close()`の処理前に呼ばれる本体のメソッドなのか (なるほど) - 再現環境では `this.close()` でそもそもダイアログが閉じてないが..? ### `chooseCurrentSuggestion` 実行後の挙動 デスクトップ版では `navigate` で登録したcallbackが順番に実行される - `this.close()` で既に閉じてはいたけど `markClosed` に代入されるのはこのときか - `markClosed` もObsidianのパラメータかな..? モバイル環境では`chooseCurrentSuggestion`メソッドがすべて終わってから、以下の箇所で遅延して実行されてそう。 ```ts function Ie(e, t, n) { Le(e), De(e, t.from); var i = { props: t, fn: function() { return Le(e) }, timer: 0, complete: n, win: e.win }; Me.set(e, i); null === Pe && (Pe = [], setTimeout((function() { document.body.offsetHeight; var e = Pe; Pe = null; for (var t = 0, n = e; t < n.length; t++) { (0, n[t])() } } ``` ここをもうちょっと調べてみる。 とりあえず問題は『openFileの処理が閉じた後に呼ばれないこと』なので。 `this.close`の処理。`LT.isPhone`のところで処理が分岐してそう。 ```ts e.prototype.close = function() { // ... 中略 Lt.isPhone ? function(e, t) { return new Promise((function(n) { // ... 中略 )) }(o, a).then((function() { // rはcontainerEl r.detach() // eはthis.modalEl e.onClose() } )) : (r.detach(), this.onClose()), ``` ちなみにisMobileはUIがモバイルになっているかどうか。Obsidian mobileかどうかは `isMobileApp`のはず。 ```ts export const Platform: { /** * The UI is in desktop mode. * @public */ isDesktop: boolean; /** * The UI is in mobile mode. * @public */ isMobile: boolean; /** * We're running the electron-based desktop app. * @public */ ``` ## 対策 `this.close()`の前に`this.onClose()`を実行することで、`this.close()`のアニメーションを待たなくても処理が継続するようにする。 `this.close()`が呼び出されている箇所は多いので、overrideして実装する。 ```ts close() { if (Platform.isMobile) { // https://github.com/tadashi-aikawa/obsidian-another-quick-switcher/issues/207 this.onClose(); } super.close(); } ``` 通常は - `close` - `detach` - `onClose` という順番が - `onClose` - `close` - `detach` と変わってしまうので副作用が発生する可能性はある。ただ、デスクトップUIでは影響ないので、モバイルUIが全く動作しない今よりはマシだと思う。