Repository navigation
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126T3TR7JLgpH6bwpF2wAWp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126T3TR7JLgpH6bwpF2wAWp
With offline pending messages, a text written after an image that is still waiting for its upload could be sent first once the image is older than the dependency cap. Also look up the self user's assets that are uploading or waiting to be sent when resolving dependencies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126T3TR7JLgpH6bwpF2wAWp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126T3TR7JLgpH6bwpF2wAWp
An image or file waiting for its upload can't be cancelled, and Delete is hidden for pending messages. With offline pending messages it can wait for a long time, so allow deleting it locally while it's still uploading: the asset message is only sent after the upload, so nobody else has it. The upload is cancelled first, and the deletion runs on the sync context so it can't race with the send. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126T3TR7JLgpH6bwpF2wAWp
…fline-pending-assets-WPB-26307
…fline-pending-assets-WPB-26307 # Conflicts: # wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/ConversationContentViewController+MessageDeletion.swift
…fline-pending-assets-WPB-26307
While offline (behind the offlinePendingMessages flag), the open conversation shows a notice that messages are sent once online again. It's placed above the messages the self user sent while offline, or below the newest message, and disappears when the device is back online. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0126T3TR7JLgpH6bwpF2wAWp
|
Please make sure new localizations are translated once merged to develop. New strings (English):
|
Test Results0 tests 0 ✅ 0s ⏱️ Results for commit ba43a43. ♻️ This comment has been updated with latest results. Summary: workflow run #41443125353 |
…fline-pending-assets-WPB-26307
…e-system-message-WPB-25326
|
There was a problem hiding this comment.
🟡 Changes recommended
The offline notice has unresolved VoiceOver and Dynamic Type gaps, is absent in empty conversations, and causes quadratic pending-message scans during rebuilds.
4 open issues
What changed in this PR
Adds a conversation-level offline notice behind offlinePendingMessages, building on #5447’s pending-message behavior. The PR also extends pending asset deletion and send ordering.
Changes:
- Observe network availability and position the notice above trailing pending messages or below the newest message.
- Add localized notice text and tests for notice placement.
- Allow local deletion of uploading assets and include older pending assets in message dependencies.
| File | Description |
|---|---|
wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/ConversationTableViewDataSource.swift |
Computes notice visibility and placement. |
wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/ConversationContentViewController+OfflineNotice.swift |
Observes network state behind the developer flag. |
wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/ConversationContentViewController+MessageDeletion.swift |
Generalizes pending deletion to supported message types. |
wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/ConversationContentViewController.swift |
Starts and retains network observation. |
wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/Cells/ConfigurationMessageCell/ConversationMessageSectionController.swift |
Inserts notice cells and preserves sender headers. |
wire-ios/Wire-iOS/Sources/UserInterface/Conversation/Content/Cells/ConfigurationMessageCell/Components/ConversationOfflineNoticeCell.swift |
Defines the notice’s appearance and accessibility label. |
wire-ios/Wire-iOS/Resources/Localization/Base.lproj/Localizable.strings |
Adds offline notice text. |
wire-ios/Wire-iOS/Generated/Strings+Generated.swift |
Adds generated localization accessors. |
wire-ios/Wire-iOS Tests/ConversationMessageCell/ConversationMessageSectionControllerTests.swift |
Tests notice placement and cell grouping. |
wire-ios-request-strategy/Sources/Protocols/OTREntityTests+Dependency.swift |
Tests dependencies on older uploading assets. |
wire-ios-request-strategy/Sources/Helpers/ZMMessage+Dependency.swift |
Includes pending assets in send dependencies. |
wire-ios-data-model/Tests/Model/Messages/ZMAssetClientMessageTests.swift |
Tests pending asset deletion eligibility and behavior. |
wire-ios-data-model/Source/Model/Message/ZMAssetClientMessage+Deletion.swift |
Adds shared pending-deletion support and asset cancellation. |
wire-ios-data-model/Source/Model/Message/ConversationMessage.swift |
Uses shared pending-deletion eligibility. |
Review effort: Balanced
|
|
||
| override init(frame: CGRect) { | ||
| super.init(frame: frame) | ||
| lineView.isHidden = true |
| let textColor = SemanticColors.Label.textDefault | ||
| let attributedText = NSMutableAttributedString( | ||
| string: Strings.title, | ||
| attributes: [.font: UIFont.systemFont(ofSize: 14, weight: .semibold), .foregroundColor: textColor] |
| searchQueries: searchQueries, | ||
| previousMessageIsKnock: previousMessage?.isKnock == true | ||
| previousMessageIsKnock: previousMessage?.isKnock == true, | ||
| offlineNotice: offlineNoticePosition(at: index, messages: messages) |
| let pendingMessageCount = messages.prefix { message in | ||
| Message.isNormal(message) && message.deliveryState == .pending && message.sender?.isSelfUser == true | ||
| }.count |
acv-w
left a comment
There was a problem hiding this comment.
Please fix the empty-state notice and accessibility issues before merge.
| searchQueries: searchQueries, | ||
| previousMessageIsKnock: previousMessage?.isKnock == true | ||
| previousMessageIsKnock: previousMessage?.isKnock == true, | ||
| offlineNotice: offlineNoticePosition(at: index, messages: messages) |
There was a problem hiding this comment.
issue (P2): An empty conversation creates no message sections, so it never shows this notice while offline. Please add a UI-only section for the empty state.
|
|
||
| override init(frame: CGRect) { | ||
| super.init(frame: frame) | ||
| lineView.isHidden = true |
There was a problem hiding this comment.
issue (P2): Please set isAccessibilityElement = true on this view. The base cell hides its text and image from accessibility, so the assigned label is not exposed to VoiceOver.
| let textColor = SemanticColors.Label.textDefault | ||
| let attributedText = NSMutableAttributedString( | ||
| string: Strings.title, | ||
| attributes: [.font: UIFont.systemFont(ofSize: 14, weight: .semibold), .foregroundColor: textColor] |
There was a problem hiding this comment.
issue (P2): These fixed 14-point fonts do not scale with Dynamic Type. Please use scaled fonts and update the text when the content-size category changes.
…fline-pending-assets-WPB-26307
…e-system-message-WPB-25326
…reapp/wire-ios into feat/offline-system-message-WPB-25326

Issue
While the device is offline, the open conversation now shows a notice: "You are offline. Your messages will be sent once you are online again." It's behind the developer flag
offlinePendingMessagesand builds on #5447 (offline pending messages), so it depends on it and will be rebased once that's merged.Behavior
Implementation
ConversationMessageContexthas a newofflineNoticevalue (above or below) that says where the cell goes.ConversationTableViewDataSourcecomputes it from the network state and the pending messages.ConversationContentViewControllerobserves network availability likeNetworkStatusViewController.Testing
Turn on Developer settings →
offlinePendingMessagesand restart the app.Checklist
[WPB-XXX].UI accessibility checklist