Mirrors the Kotlin flow: both pickers get an "Add profile" row, and
CreateProfile gains an optional onCreate so the same form is reused. Each
picker's create function is five lines that end in the path a row tap
already takes - changeProfile(newUser) for a prepared chat,
selectedProfile plus .switchingUser for a one-time link.
The sheets are attached to body rather than to a row, because rows live
in a LazyVStack and profilePicker() is swapped for currentSelection()
when listExpanded flips. Surface 1's picker height is computed from the
row count, so it needs one more row.
The list is refreshed after creating, for the same reason as Kotlin, and
interactive dismissal is blocked while the create is in flight so backing
out cannot leave the invitation moved.
Not compiled: no Swift toolchain available.
* core: option to show group as sender of chat item (for the initial items, e.g. welcome message)
* add chat item to contact request chats
* return AChat for prepared chats and contact requests
* update iOS api types, show prepared contact as blue, show preview info when content message is not available (previously was showing feature item)
* ios: remove ContactType
* ios: show group as sender, fix avatar not showing when member message sequence starts with merged items
* ios: update compose UI for all connection scenarios
* address settings
* ios: address settings UI
* fix tests
* fix tests 2
* ios: fix minor issues