OBD-II Bluetooth adapter pairing modal — opened imperatively via the
adapterPairing() controller. Four-stage flow (Scan → Pair → Probe
→ Done) with three failure variants (no adapters / pair failed /
connected-but-no-protocol), all surfaced via the shared <Alert>
primitive.
Real Bluetooth discovery isn't wired yet — the scan + probe stages
stream through fixed mock data + scripted AT-command lines on
timers. Once an Electron bridge for noble / native BT lands, the
timers swap for IPC subscriptions.
Lives as the App-shell host: subscribes to the controller's
subscribeToAdapterPairing, keys its modal node off the instance
counter so every open is a fresh React mount (no stage / picked /
progress bleed-over).
OBD-II Bluetooth adapter pairing modal — opened imperatively via the
adapterPairing()controller. Four-stage flow (Scan → Pair → Probe → Done) with three failure variants (no adapters / pair failed / connected-but-no-protocol), all surfaced via the shared<Alert>primitive.Real Bluetooth discovery isn't wired yet — the scan + probe stages stream through fixed mock data + scripted AT-command lines on timers. Once an Electron bridge for
noble/ native BT lands, the timers swap for IPC subscriptions.Lives as the App-shell host: subscribes to the controller's
subscribeToAdapterPairing, keys its modal node off theinstancecounter so every open is a fresh React mount (no stage / picked / progress bleed-over).