Skip to content

Commit 5205467

Browse files
fix(setup): drain stale keypresses between TUI screen transitions (npm#186)
* fix(setup): drain stale keypresses between TUI screen transitions The picker's vim-style j/k navigation can leave buffered keypresses in crossterm's event queue that leak into the next input field, corrupting pre-populated values like client_id. * refactor: extract drain logic into helper, add changeset
1 parent 62d6ddb commit 5205467

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@googleworkspace/cli": patch
3+
---
4+
5+
fix(setup): drain stale keypresses between TUI screen transitions

src/setup_tui.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,15 @@ fn run_picker_loop(
448448
}
449449
}
450450

451+
/// Drains any queued crossterm events to prevent stale keypresses from leaking
452+
/// between TUI interactions.
453+
fn drain_pending_events() -> std::io::Result<()> {
454+
while crossterm::event::poll(std::time::Duration::ZERO)? {
455+
let _ = event::read()?;
456+
}
457+
Ok(())
458+
}
459+
451460
// ── Setup Wizard (unified TUI session) ──────────────────────────
452461

453462
/// Status of a single setup step.
@@ -536,6 +545,7 @@ impl SetupWizard {
536545
multiselect: bool,
537546
) -> std::io::Result<PickerResult> {
538547
let mut picker = PickerState::new(title, help_text, items, multiselect);
548+
drain_pending_events()?;
539549
loop {
540550
let steps_snapshot = self.steps.clone();
541551
let msg = self.message.clone();
@@ -598,6 +608,7 @@ impl SetupWizard {
598608
initial: Option<&str>,
599609
) -> std::io::Result<InputResult> {
600610
let mut input = InputState::new(title, help_text, initial);
611+
drain_pending_events()?;
601612
loop {
602613
let steps_snapshot = self.steps.clone();
603614
let msg = self.message.clone();

0 commit comments

Comments
 (0)