* feat(blocked-users): complete block/unblock UX
* docs(changelog): link block/unblock UX entry to PR #676
* fix(l10n): reuse profile key instead of duplicate blockedUserProfileTitle
* fix(blocked-user): disable unblock button while action is in flight
* fix(blocked-users): address pepina review
* refactor(blocked-users): morph in place on unblock and polish notice card
* fix(blocked-users): restore bottom padding only when unblocked panel is shown
* style(blocked-users): apply dart format
* Cover unblocked action panel buttons in BlockedUserScreen tests
* Consolidate blocked-user and start-chat screens into UserProfileScreen
* Cover topAligned mode, blocked notice transitions, and UserProfileScreen.show in tests
* Cover topAligned invite share tap and failure paths
* Fall back to bech32 npub for the blocked user tile display name and drop stale start-chat route stub
* Drop the WnSystemNotice elevatedCard variant and use fillSecondary on the blocked user notice
* Address pepi's review on the blocked notice and open user profiles top-aligned from start-chat entries
* feat: add UserBlockChanged to ChatListUpdateTrigger bridge
* feat: add block/unblock user bridge functions
* chore: regenerate flutter_rust_bridge bindings for mute_list API
* test: enforce exact order in userBlockChanged chat list assertions
* chore: bump whitenoise-rs rev and regenerate bridge bindings
* chore: format generated dart bridge files
* chore: rustfmt generated bridge file
* chore: rebase with master and regenerate bridge bindings
* fix: remove duplicate test function in chat_list
* feat: expose mute/unmute chat through Flutter bridge
Bridge whitenoise-rs mute_chat, unmute_chat, and mute_forever_timestamp
to Dart via flutter_rust_bridge. Add muted_until to ChatSummary and
ChatMuteChanged trigger for real-time UI updates.
Also fixes pre-existing subscribe_to_group_messages API mismatch
(new limit parameter added upstream).
* test: cover chatMuteChanged trigger in use_chat_list
* make ccoderabbit happy
* feat: expose ChatMuteDuration enum through Flutter bridge
* chore: regenerate freezed code for ChatMuteDuration
* remove MUTE_FOREVER reference from doc comment
Bumps whitenoise-rs to b5c9e8b and regenerates flutter_rust_bridge bindings.
- Add removed_at: Option<DateTime<Utc>> to ChatSummary so the Flutter
layer can tell when a group membership was revoked by an admin
- Add RemovedFromGroup variant to ChatListUpdateTrigger so real-time
removal events can be handled distinctly from archive/unarchive
- Regenerate frb_generated.rs, frb_generated.dart, and
api/chat_list.dart from the updated bridge definition
* feat: wire delivery status from Rust bridge to Flutter UI
* chore: regenerate flutter_rust_bridge codegen
* Fix cargo fmt lint and handle messageRetried edge case
Fix import ordering in frb_generated.rs and line break in messages.rs
to pass cargo fmt check. Handle messageRetried when message ID is not
yet in the display list by appending it instead of silently ignoring.
* Run dart format on generated bridge files
* Update whitenoise-rs rev to aa56ba6 to fix mdk version conflict
* Add tests for deliveryStatusChanged and messageRetried handlers
* Add tests for DeliveryStatus mapping in ChatMessageBubble
* Sync with Rust retry redesign: add Retried status, remove messageRetried
Update whitenoise-rs rev to 74a3071 and re-run codegen to sync with
the retry-as-new-message design. DeliveryStatus now includes Retried,
UpdateTrigger no longer has MessageRetried.
- Update whitenoise-rs rev to 74a3071
- Add DeliveryStatus.retried variant and From impl in bridge
- Remove MessageRetried from UpdateTrigger enum and From impl
- Remove messageRetried handler from useChatMessages hook
- Add Retried case to DeliveryStatus mapping in ChatMessageBubble
- Remove messageRetried tests, add retried conversion test
* cargo fmt on generated code, add Retried delivery status test
* Run dart format on generated bridge files
* feat: update bridge to expose KeyPackageStatus enum (#308)
Update whitenoise-rs to bd18293 and mdk-core to v0.6.0. Change
user_has_key_package return type from bool to KeyPackageStatus
(Valid/NotFound/Incompatible) and regenerate FRB bindings.
* fix: migrate Flutter code from bool to KeyPackageStatus
Update hook, screens, mocks, and tests to use the new
KeyPackageStatus enum instead of bool for key package checks.