mirror of
https://github.com/meshtastic/web.git
synced 2026-07-31 06:56:28 -04:00
Previously the optimistic append happened after `await sendText(...)`,
which itself awaited `queue.wait(id)` — i.e. the firmware ack. On LoRa
that's 1–3 seconds, so the user saw a noticeable delay between hitting
Enter and the bubble appearing.
Move the append before the await. To do that the chat slice needs to
know the packet id synchronously, so:
- `MeshClient.sendPacket` gains an optional `packetId` parameter
(defaults to `generatePacketId()`, behaviour unchanged for callers
that don't pass one).
- `SendTextInput.packetId` plumbs through `SendTextUseCase` to
`sendPacket`.
- `ChatClient.send` generates the id up-front, appends the message
with `state=Pending` immediately, persists it, then awaits
`sendText(..., { packetId })`. On Err the optimistic message stays
visible but flips to `Failed` so the user sees what happened.
Routing-ack subscriber still flips `Pending → Ack` keyed by id —
unchanged.
Tests added (suite 74 → 76):
- "appends the optimistic message before the send promise resolves"
— asserts the bucket contains the message synchronously after the
send call returns its pending promise.
- "flips outbound state to Failed when sendText returns Err"
— exercises the empty-text validation path.