feat: Phase 7 — Marmot group chat UI & ViewModel layer

Add complete UI layer for Marmot Protocol MLS group messaging:

State models (commons/commonMain/):
- MarmotGroupChatroom: tracks decrypted inner messages per group
- MarmotGroupList: manages all group chatrooms with change notifications
- MarmotGroupFeedFilter: feed filter for group message feeds
- MarmotGroupFeedViewModel: ViewModel exposing group messages

Account integration:
- Add marmotGroupList to IAccount interface and implementations
- GroupEventHandler indexes inner events into MarmotGroupList
- AccountViewModel gains sendMarmotGroupMessage, createMarmotGroup,
  publishMarmotKeyPackage helper methods

Android screens (amethyst/):
- MarmotGroupListScreen: lists all groups with last message preview
- MarmotGroupChatScreen: group conversation with message composer
- MarmotGroupChatView: message feed + simple text composer
- CreateGroupDialog: create new MLS group with display name
- AddMemberDialog: add member by npub/hex (KeyPackage fetch TBD)

Navigation & integration:
- Route.MarmotGroupList and Route.MarmotGroupChat routes
- Wired into AppNavigation nav graph
- "MLS Groups" button added to ChannelFabColumn on Messages screen
- Marmot group newest messages appear in ChatroomListKnownFeedFilter

https://claude.ai/code/session_0194SxKfAU61PY92eqP4cCXM
This commit is contained in:
Claude
2026-04-05 20:38:23 +00:00
parent e1304ddcab
commit 7ed036bbaa
19 changed files with 1137 additions and 1 deletions
@@ -118,6 +118,9 @@ class DesktopIAccount(
override val spammersHashCodes: Set<Int> = emptySet()
override val chatroomList: ChatroomList = ChatroomList(accountState.pubKeyHex)
override val marmotGroupList =
com.vitorpamplona.amethyst.commons.model.marmotGroups
.MarmotGroupList()
override val nip47SignerState: INwcSignerState =
object : INwcSignerState {