✅状態遷移再設計 (scrapbox-select-suggestion)
修正が期待できるバグ
あれ?これ以前話題にでたような……
でもタイミングはずれそう
まとめてやったこと
DOM経由よりバグが少ない
状況によって微妙に構造が変わってしまう
場合分けしてコードを書くのが面倒
単体テストできる
domの場合だと、UserScriptとして読み込んで実際に使ってみてからでないとバグを発見できない
2023-03-23
18:25:31 補完確定処理がおかしい
テスト中に気づかなかった……
確定処理はこれ
break pointを仕掛けて調べる
どうやら updator
の処理を間違えているようだ
d
を _
に変換する関数
updator
には Completion.tsx
の confirm
が代入されている
わかった。 query
は []
を抜いてしまっているから、 []
分文字数を足さないと行けなかったんだ
query
から []
取るのやめようかな……紛らわしいし。
16:11:09 PR branchをbuildして動作確認する
17:56:45 windowの位置がずれてしまっているのを直す
position.char
ではなく start
を使う
17:34:53 ↓の useEffect()
が大量にcallされてた
selection
が useSelection
が実行されるたびに再生成されていたのが原因
selection.range
を監視するように直した
16:51:09 windowがちらつく
右下のdebug用表示を見ると、 completion
がそれ以外のmodeに僅かな間だけ切り替わっているのがわかる
このケースでは、必ず cursor:changed
→ lines:changed
の順に呼び出されることが分かっている。
cursor:changed
の次に lines:changed
が呼び出されたときのみ、 cursor:changed
を省略するようにしよう
いや、 cursor:changed
だけdebounceしてもいいか
ほかはdebounceなしに実行する
いや、 scrapbox.Page.lines
を高頻度で呼び出したくないから、debounceは仕掛けておこう
待ち時間を動的に変えたかったので
16:23:27 なぜか display: none
になってる
表示制御は <App />
でやるので、 <Completion />
で制御する必要はない
コード削除しそこねてたか。消そう
候補がなかったときに非表示にするロジックが暴走している
candidatesProps
はrenderされていたので、 top
と left
が取得できなくなっているみたい
状態を表示するdebug codeはこんな感じのを使った
ts const { render } = useMemo(() => useStatusBar(), []);
useEffect(() => {
render({
type: "text",
text: `${state.type}${
state.position ? `: ${state.position.line}, ${state.position.char}` : ""
}`,
});
}, [state.type, state.position?.line, state.position?.char]);
16:09:58 単体テスト作成完了
大体はカバーできたはず
まだ抜けはありそうだが……
場合分けが多くて、書くのが大変だった
単体テスト項目を増やした
どうやら indent
の文字数を無視してしまっているらしい
13:17:09 復帰
11:52:34 Selection
と Cursor
まわりの型定義修正
12:54:06 修正終了
けっこうかかった
Page
の型定義は、真面目にやっても現状メリットがないので、適当に済ませた
13:07:09 released
10:03:26 テスト用行データをjsonに切り出し中
09:54:42 作業開始