Files
mantra-kmp/composeApp
Kgothatso NgakoandClaude Opus 5 2efe320564 feat(dialects): a screen for picking dialects out of the catalogue
Route, state, view model, screen and the way in from the group's detail screen,
beside "Add dialect" rather than instead of it. It shows and picks; proposing is
the next commit.

Three standings per row, not two. A language the room holds and a language it is
already signing both show and neither can be ticked, with different words on
each, because "not available" has two explanations and telling a member the
wrong one is worse than telling them nothing: one is theirs already, and the
other is a proposal somebody else opened that they can go and sign.

The standing is derived from DialectScaffold.missingFrom rather than computed
beside it. That function is what the proposal will be built from, so a row
saying MISSING where it disagreed would offer a dialect the room already has --
and the duplicate would not even collide, since dialect ids differ by createdAt.
One authority; held-versus-in-flight is only a label on what it already excluded.

The view model holds its state in a StateFlow rather than the mutableStateOf its
neighbours use, and not for consistency's sake: those write once, and this one is
written from Dispatchers.IO on the way in *and* again from a collector on the
room's signing sessions, which is where a mutableStateOf in a view model drops an
off-main-thread write made during the first composition.

Anything that stops being missing while the screen is open comes off the
selection, the way SelectSubgroupAdminsViewModel unpicks a member who turns out
to have no key package. Another admin proposing a language this member had ticked
would otherwise propose it twice.

"Select everything missing" means the catalogue and not the filtered rows: a
member who has typed "so" into the search and taps it means all of it, and a
selection that silently depended on a filter is the harder of the two to notice.

Twelve strings, sentence case, and one of them replaces the literal
AddDialectScreen had been carrying for the same sentence about a group with no
shared key.

A clickable Card rather than a bare clickable modifier, so a row is 48dp without
anybody having to remember minimumInteractiveComponentSize.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-02 22:49:49 +02:00
..