diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index a9edc1952..c17c8d67c 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -7324,7 +7324,7 @@ repositoryURL = "https://github.com/BarredEwe/Prefire"; requirement = { kind = upToNextMinorVersion; - minimumVersion = 2.0.4; + minimumVersion = 2.8.0; }; }; 395DE6AE429B7ACC7C7FE31D /* XCRemoteSwiftPackageReference "KZFileWatchers" */ = { @@ -7380,7 +7380,7 @@ repositoryURL = "https://github.com/element-hq/matrix-rust-components-swift"; requirement = { kind = exactVersion; - version = 1.0.14; + version = 1.0.15; }; }; 701C7BEF8F70F7A83E852DCC /* XCRemoteSwiftPackageReference "GZIP" */ = { @@ -7484,7 +7484,7 @@ repositoryURL = "https://github.com/pointfreeco/swift-snapshot-testing"; requirement = { kind = upToNextMinorVersion; - minimumVersion = 1.16.0; + minimumVersion = 1.16.1; }; }; EC6D0C817B1C21D9D096505A /* XCRemoteSwiftPackageReference "Version" */ = { diff --git a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index de6fe8164..650e8a475 100644 --- a/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -148,8 +148,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/element-hq/matrix-rust-components-swift", "state" : { - "revision" : "76ccbfd106eb4d967c79eccaf339ddfc45e6f7fb", - "version" : "1.0.14" + "revision" : "279994ebdb1aef807946b79306bbdd892cecd873", + "version" : "1.0.15" } }, { @@ -184,8 +184,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/BarredEwe/Prefire", "state" : { - "revision" : "608e7992dedc5ee409e59b3580010371ff0cef57", - "version" : "2.0.4" + "revision" : "237f4005c81f74d5359eddb534d2d10925ef2787", + "version" : "2.8.0" } }, { @@ -247,8 +247,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-snapshot-testing", "state" : { - "revision" : "625ccca8570773dd84a34ee51a81aa2bc5a4f97a", - "version" : "1.16.0" + "revision" : "8ddd519780452729c6634ad6bd0d2595938e9ea3", + "version" : "1.16.1" } }, { diff --git a/ElementX/Sources/Application/AppSettings.swift b/ElementX/Sources/Application/AppSettings.swift index 29cf76897..0dc9640ec 100644 --- a/ElementX/Sources/Application/AppSettings.swift +++ b/ElementX/Sources/Application/AppSettings.swift @@ -237,7 +237,7 @@ final class AppSettings { // MARK: - Room Screen - @UserPreference(key: UserDefaultsKeys.timelineStyle, defaultValue: TimelineStyle.bubbles, storageType: .userDefaults(store)) + @UserPreference(key: UserDefaultsKeys.timelineStyle, defaultValue: TimelineStyle.bubbles, storageType: .volatile) var timelineStyle @UserPreference(key: UserDefaultsKeys.viewSourceEnabled, defaultValue: isDevelopmentBuild, storageType: .userDefaults(store)) diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift index 61b2f0ea3..49a9625c7 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenModels.swift @@ -114,6 +114,7 @@ enum RoomScreenViewAction { case displayRoomMemberDetails(userID: String) case displayReactionSummary(itemID: TimelineItemIdentifier, key: String) case displayEmojiPicker(itemID: TimelineItemIdentifier) + case displayMessageSendingFailureAlert(itemID: TimelineItemIdentifier) case displayReadReceipts(itemID: TimelineItemIdentifier) case displayCall @@ -216,6 +217,7 @@ struct ReadReceiptSummaryInfo: Identifiable { enum RoomScreenAlertInfoType: Hashable { case audioRecodingPermissionError case pollEndConfirmation(String) + case messageSendingFailure(TimelineItemIdentifier) } struct RoomMemberState { diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 815c8d8ad..f85007afe 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -182,6 +182,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol roomScreenInteractionHandler.displayEmojiPicker(for: itemID) case .displayReactionSummary(let itemID, let key): displayReactionSummary(for: itemID, selectedKey: key) + case .displayMessageSendingFailureAlert(let itemID): + displayAlert(.messageSendingFailure(itemID)) case .displayReadReceipts(itemID: let itemID): displayReadReceipts(for: itemID) case .displayCall: @@ -770,6 +772,12 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol message: L10n.commonPollEndConfirmation, primaryButton: .init(title: L10n.actionCancel, role: .cancel, action: nil), secondaryButton: .init(title: L10n.actionOk, action: { self.roomScreenInteractionHandler.endPoll(pollStartID: pollStartID) })) + case .messageSendingFailure(let itemID): + state.bindings.alertInfo = .init(id: type, title: L10n.screenRoomRetrySendMenuTitle, primaryButton: .init(title: L10n.actionRemove, role: .destructive) { + Task { + await self.timelineController.redact(itemID) + } + }) } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift index f4331d4c8..1a7dadbd9 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineItemBubbledStylerView.swift @@ -110,7 +110,9 @@ struct TimelineItemBubbledStylerView: View { VStack(alignment: alignment, spacing: -3) { messageBubble .timelineItemAccessibility(timelineItem) { - if adjustedDeliveryStatus != .sendingFailed { + if adjustedDeliveryStatus == .sendingFailed { + context.send(viewAction: .displayMessageSendingFailureAlert(itemID: timelineItem.id)) + } else { context.send(viewAction: .displayTimelineItemMenu(itemID: timelineItem.id)) } } @@ -166,10 +168,22 @@ struct TimelineItemBubbledStylerView: View { timelineItem.bubbleSendInfoLayoutType .layout { contentWithReply - layoutedLocalizedSendInfo + interactiveLocalizedSendInfo } } + @ViewBuilder + var interactiveLocalizedSendInfo: some View { + if adjustedDeliveryStatus == .sendingFailed { + layoutedLocalizedSendInfo + .onTapGesture { + context.send(viewAction: .displayMessageSendingFailureAlert(itemID: timelineItem.id)) + } + } else { + layoutedLocalizedSendInfo + } + } + @ViewBuilder var layoutedLocalizedSendInfo: some View { switch timelineItem.bubbleSendInfoLayoutType { diff --git a/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift b/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift index 9f04d1a3c..81a4bb613 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItemProxy.swift @@ -78,7 +78,9 @@ class EventTimelineItemProxy { } switch localSendState { - case .notSentYet, .sendingFailed: + case .sendingFailed: + return .sendingFailed + case .notSentYet: return .sending case .sent: return .sent diff --git a/project.yml b/project.yml index f6ab10cb9..a3f916c80 100644 --- a/project.yml +++ b/project.yml @@ -49,7 +49,7 @@ packages: # Element/Matrix dependencies MatrixRustSDK: url: https://github.com/element-hq/matrix-rust-components-swift - exactVersion: 1.0.14 + exactVersion: 1.0.15 # path: ../matrix-rust-sdk Compound: url: https://github.com/element-hq/compound-ios