From ad10b1de11b01aac9188b7ea421f56e553be1615 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Tue, 22 Apr 2025 18:42:01 +0100 Subject: [PATCH 01/38] Introduction of ChatMessageViewModel --- .../MessageList/MessageContainerView.swift | 47 +++++++++++++++++-- .../ChatChannel/MessageList/MessageView.swift | 14 +++--- .../DefaultViewFactory.swift | 6 ++- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index eeecbc7f7..49c44686d 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -6,6 +6,39 @@ import AVKit import StreamChat import SwiftUI +open class MessageViewModel: ObservableObject { + @Injected(\.utils) private var utils + @Injected(\.chatClient) private var chatClient + + private var message: ChatMessage + private var channel: ChatChannel + + public init( + message: ChatMessage, + channel: ChatChannel + ) { + self.message = message + self.channel = channel + } + + open var isSwipeToQuoteReplyPossible: Bool { + message.isInteractionEnabled && channel.config.repliesEnabled + } + + open var textContent: String { + if let language = channel.membership?.language, + let translatedText = message.textContent(for: language) { + return translatedText + } + + return message.adjustedText + } + + private var messageListConfig: MessageListConfig { + utils.messageListConfig + } +} + public struct MessageContainerView: View { @Environment(\.channelTranslationLanguage) var translationLanguage @@ -35,9 +68,7 @@ public struct MessageContainerView: View { private let replyThreshold: CGFloat = 60 private let paddingValue: CGFloat = 8 - var isSwipeToReplyPossible: Bool { - message.isInteractionEnabled && channel.config.repliesEnabled - } + @ObservedObject private var viewModel: MessageViewModel public init( factory: Factory, @@ -49,7 +80,8 @@ public struct MessageContainerView: View { isLast: Bool, scrolledId: Binding, quotedMessage: Binding, - onLongPress: @escaping (MessageDisplayInfo) -> Void + onLongPress: @escaping (MessageDisplayInfo) -> Void, + viewModel: MessageViewModel? = nil ) { self.factory = factory self.channel = channel @@ -61,6 +93,10 @@ public struct MessageContainerView: View { self.onLongPress = onLongPress _scrolledId = scrolledId _quotedMessage = quotedMessage + self.viewModel = viewModel ?? MessageViewModel( + message: message, + channel: channel + ) } public var body: some View { @@ -137,7 +173,7 @@ public struct MessageContainerView: View { coordinateSpace: .local ) .updating($offset) { (value, gestureState, _) in - guard isSwipeToReplyPossible else { + guard viewModel.isSwipeToQuoteReplyPossible else { return } // Using updating since onEnded is not called if the gesture is canceled. @@ -286,6 +322,7 @@ public struct MessageContainerView: View { ) .accessibilityElement(children: .contain) .accessibilityIdentifier("MessageContainerView") + .environmentObject(viewModel) } private var maximumHorizontalSwipeDisplacement: CGFloat { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 8883c4867..29d7e9a6a 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -6,6 +6,8 @@ import StreamChat import SwiftUI public struct MessageView: View { + @EnvironmentObject private var viewModel: MessageViewModel + @Injected(\.utils) private var utils private var messageTypeResolver: MessageTypeResolving { @@ -252,7 +254,9 @@ struct StreamTextView: View { public struct LinkDetectionTextView: View { @Environment(\.layoutDirection) var layoutDirection @Environment(\.channelTranslationLanguage) var translationLanguage - + @Environment(\.originalMessageIds) var originalMessageIds + @EnvironmentObject private var viewModel: MessageViewModel + @Injected(\.colors) var colors @Injected(\.fonts) var fonts @Injected(\.utils) var utils @@ -293,12 +297,8 @@ public struct LinkDetectionTextView: View { } private func attributedString(for message: ChatMessage) -> AttributedString { - var text = message.adjustedText - - // Translation - if let translatedText = message.textContent(for: translationLanguage) { - text = translatedText - } + let text = viewModel.textContent + // Markdown let attributes = AttributeContainer() .foregroundColor(textColor(for: message)) diff --git a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift index 3e14a3829..e51fb04d3 100644 --- a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift +++ b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift @@ -341,7 +341,11 @@ extension ViewFactory { isLast: isLast, scrolledId: scrolledId, quotedMessage: quotedMessage, - onLongPress: onLongPress + onLongPress: onLongPress, + viewModel: MessageViewModel( + message: message, + channel: channel + ) ) } From ef9efc7cb285ef506e4f97bf1863c934a0f89c29 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Wed, 23 Apr 2025 16:08:45 +0100 Subject: [PATCH 02/38] Add ChatChannelViewModel and ChatMessageViewModel as environment objects --- .../ChatChannel/ChatChannelView.swift | 4 +- .../ChatChannel/ChatChannelViewModel.swift | 27 +++++++- .../MessageList/MessageContainerView.swift | 69 ++++++++++++++----- .../MessageList/MessageListView.swift | 10 ++- .../ChatChannel/MessageList/MessageView.swift | 8 ++- .../DefaultViewFactory.swift | 6 +- 6 files changed, 92 insertions(+), 32 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift index 4269a3385..4a7b8e90b 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift @@ -71,8 +71,10 @@ public struct ChatChannelView: View, KeyboardReadable { } } }, - onJumpToMessage: viewModel.jumpToMessage(messageId:) + onJumpToMessage: viewModel.jumpToMessage(messageId:), + originalTextMessageIds: $viewModel.originalTextMessageIds ) + .environmentObject(viewModel) .overlay( viewModel.currentDateString != nil ? factory.makeDateIndicatorView(dateString: viewModel.currentDateString!) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift index b6e5c90bc..90573e93a 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift @@ -130,7 +130,10 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { } @Published public private(set) var channel: ChatChannel? - + + /// The message ids of the translated messages that should show the original text. + @Published public var originalTextMessageIds: Set = [] + public var isMessageThread: Bool { messageController != nil } @@ -158,7 +161,7 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { channelDataSource.delegate = self messages = channelDataSource.messages channel = channelController.channel - + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in if let scrollToMessage, let parentMessageId = scrollToMessage.parentMessageId, messageController == nil { let message = channelController.dataStore.message(id: parentMessageId) @@ -221,7 +224,25 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { checkHeaderType() checkUnreadCount() } - + + public func showOriginalText(for message: ChatMessage) { + originalTextMessageIds.insert(message.id) + } + + public func showTranslatedText(for message: ChatMessage) { + originalTextMessageIds.remove(message.id) + } + + open func makeMessageViewModel( + for message: ChatMessage + ) -> ChatMessageViewModel { + ChatMessageViewModel( + message: message, + channel: channel, + originalTextMessageIds: originalTextMessageIds + ) + } + @objc private func selectedMessageThread(notification: Notification) { if let message = notification.userInfo?[MessageRepliesConstants.selectedMessage] as? ChatMessage { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 49c44686d..dc9d693ea 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -6,40 +6,59 @@ import AVKit import StreamChat import SwiftUI -open class MessageViewModel: ObservableObject { +open class ChatMessageViewModel: ObservableObject { @Injected(\.utils) private var utils @Injected(\.chatClient) private var chatClient private var message: ChatMessage - private var channel: ChatChannel + private var channel: ChatChannel? + public var originalTextMessageIds: Set public init( message: ChatMessage, - channel: ChatChannel + channel: ChatChannel?, + originalTextMessageIds: Set = [] ) { self.message = message self.channel = channel + self.originalTextMessageIds = originalTextMessageIds + } + + public var isOriginalTextShown: Bool { + originalTextMessageIds.contains(message.id) } open var isSwipeToQuoteReplyPossible: Bool { - message.isInteractionEnabled && channel.config.repliesEnabled + message.isInteractionEnabled && channel?.config.repliesEnabled == true } open var textContent: String { - if let language = channel.membership?.language, - let translatedText = message.textContent(for: language) { + if !isOriginalTextShown, let translatedText = translatedText { return translatedText } return message.adjustedText } + public var translatedText: String? { + if let language = channel?.membership?.language, + let translatedText = message.textContent(for: language) { + return translatedText + } + + return nil + } + + // MARK: - Helpers + private var messageListConfig: MessageListConfig { utils.messageListConfig } } public struct MessageContainerView: View { + @EnvironmentObject private var channelViewModel: ChatChannelViewModel + @EnvironmentObject private var messageViewModel: ChatMessageViewModel @Environment(\.channelTranslationLanguage) var translationLanguage @Injected(\.fonts) private var fonts @@ -68,8 +87,6 @@ public struct MessageContainerView: View { private let replyThreshold: CGFloat = 60 private let paddingValue: CGFloat = 8 - @ObservedObject private var viewModel: MessageViewModel - public init( factory: Factory, channel: ChatChannel, @@ -80,8 +97,7 @@ public struct MessageContainerView: View { isLast: Bool, scrolledId: Binding, quotedMessage: Binding, - onLongPress: @escaping (MessageDisplayInfo) -> Void, - viewModel: MessageViewModel? = nil + onLongPress: @escaping (MessageDisplayInfo) -> Void ) { self.factory = factory self.channel = channel @@ -93,10 +109,6 @@ public struct MessageContainerView: View { self.onLongPress = onLongPress _scrolledId = scrolledId _quotedMessage = quotedMessage - self.viewModel = viewModel ?? MessageViewModel( - message: message, - channel: channel - ) } public var body: some View { @@ -173,7 +185,7 @@ public struct MessageContainerView: View { coordinateSpace: .local ) .updating($offset) { (value, gestureState, _) in - guard viewModel.isSwipeToQuoteReplyPossible else { + guard messageViewModel.isSwipeToQuoteReplyPossible else { return } // Using updating since onEnded is not called if the gesture is canceled. @@ -267,9 +279,28 @@ public struct MessageContainerView: View { if message.textContent(for: translationLanguage) != nil, let localizedName = translationLanguage?.localizedName { - Text(L10n.Message.translatedTo(localizedName)) - .font(fonts.footnote) - .foregroundColor(Color(colors.subtitleText)) + HStack(spacing: 4) { + Text(L10n.Message.translatedTo(localizedName)) + .font(fonts.footnote) + .foregroundColor(Color(colors.subtitleText)) + Text("•") + .font(fonts.footnote) + .foregroundColor(Color(colors.subtitleText)) + Button( + action: { + if messageViewModel.isOriginalTextShown { + channelViewModel.showTranslatedText(for: message) + } else { + channelViewModel.showOriginalText(for: message) + } + }, + label: { + Text(messageViewModel.isOriginalTextShown ? "Show Translation" : "Show Original") + .font(fonts.footnote) + .foregroundColor(Color(colors.subtitleText)) + } + ) + } } if showsAllInfo && !message.isDeleted { if message.isSentByCurrentUser && channel.config.readEventsEnabled { @@ -322,7 +353,7 @@ public struct MessageContainerView: View { ) .accessibilityElement(children: .contain) .accessibilityIdentifier("MessageContainerView") - .environmentObject(viewModel) + .environmentObject(messageViewModel) } private var maximumHorizontalSwipeDisplacement: CGFloat { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift index e30209027..4345dde38 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift @@ -6,6 +6,7 @@ import StreamChat import SwiftUI public struct MessageListView: View, KeyboardReadable { + @EnvironmentObject private var channelViewModel: ChatChannelViewModel @Injected(\.utils) private var utils @Injected(\.chatClient) private var chatClient @@ -37,6 +38,7 @@ public struct MessageListView: View, KeyboardReadable { @State private var scrollDirection = ScrollDirection.up @State private var unreadMessagesBannerShown = false @State private var unreadButtonDismissed = false + @Binding var originalTextMessageIds: Set private var messageRenderingUtil = MessageRenderingUtil.shared private var skipRenderingMessageIds = [String]() @@ -81,7 +83,8 @@ public struct MessageListView: View, KeyboardReadable { onMessageAppear: @escaping (Int, ScrollDirection) -> Void, onScrollToBottom: @escaping () -> Void, onLongPress: @escaping (MessageDisplayInfo) -> Void, - onJumpToMessage: ((String) -> Bool)? = nil + onJumpToMessage: ((String) -> Bool)? = nil, + originalTextMessageIds: Binding> = .constant([]) ) { self.factory = factory self.channel = channel @@ -101,6 +104,7 @@ public struct MessageListView: View, KeyboardReadable { _quotedMessage = quotedMessage _scrollPosition = scrollPosition _firstUnreadMessageId = firstUnreadMessageId + _originalTextMessageIds = originalTextMessageIds if !messageRenderingUtil.hasPreviousMessageSet || self.showScrollToLatestButton == false || self.scrolledId != nil @@ -149,6 +153,10 @@ public struct MessageListView: View, KeyboardReadable { isLast: !showsLastInGroupInfo && message == messages.last ) .environment(\.channelTranslationLanguage, channel.membership?.language) + .environmentObject(channelViewModel) + .environmentObject(channelViewModel.makeMessageViewModel( + for: message + )) .onAppear { if index == nil { index = messageListDateUtils.index(for: message, in: messages) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 29d7e9a6a..8406f6309 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -6,7 +6,7 @@ import StreamChat import SwiftUI public struct MessageView: View { - @EnvironmentObject private var viewModel: MessageViewModel + @EnvironmentObject private var viewModel: ChatMessageViewModel @Injected(\.utils) private var utils @@ -254,8 +254,7 @@ struct StreamTextView: View { public struct LinkDetectionTextView: View { @Environment(\.layoutDirection) var layoutDirection @Environment(\.channelTranslationLanguage) var translationLanguage - @Environment(\.originalMessageIds) var originalMessageIds - @EnvironmentObject private var viewModel: MessageViewModel + @EnvironmentObject private var viewModel: ChatMessageViewModel @Injected(\.colors) var colors @Injected(\.fonts) var fonts @@ -294,6 +293,9 @@ public struct LinkDetectionTextView: View { .onChange(of: message, perform: { updated in displayedText = attributedString(for: updated) }) + .onChange(of: viewModel.isOriginalTextShown, perform: { _ in + displayedText = attributedString(for: message) + }) } private func attributedString(for message: ChatMessage) -> AttributedString { diff --git a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift index e51fb04d3..3e14a3829 100644 --- a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift +++ b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift @@ -341,11 +341,7 @@ extension ViewFactory { isLast: isLast, scrolledId: scrolledId, quotedMessage: quotedMessage, - onLongPress: onLongPress, - viewModel: MessageViewModel( - message: message, - channel: channel - ) + onLongPress: onLongPress ) } From fc44f5eb6a3a3d2fad0f6c5d195d2b4ff328a91f Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Wed, 23 Apr 2025 18:13:39 +0100 Subject: [PATCH 03/38] Extract the Message View Model to a separate file --- .../ChatChannel/ChatChannelView.swift | 3 +- .../ChatChannel/ChatChannelViewModel.swift | 9 ++- .../MessageList/MessageContainerView.swift | 52 +---------------- .../MessageList/MessageListView.swift | 5 +- .../ChatChannel/MessageList/MessageView.swift | 4 +- .../MessageList/MessageViewModel.swift | 56 +++++++++++++++++++ StreamChatSwiftUI.xcodeproj/project.pbxproj | 4 ++ 7 files changed, 72 insertions(+), 61 deletions(-) create mode 100644 Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift index 4a7b8e90b..196857f16 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift @@ -71,8 +71,7 @@ public struct ChatChannelView: View, KeyboardReadable { } } }, - onJumpToMessage: viewModel.jumpToMessage(messageId:), - originalTextMessageIds: $viewModel.originalTextMessageIds + onJumpToMessage: viewModel.jumpToMessage(messageId:) ) .environmentObject(viewModel) .overlay( diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift index 90573e93a..6d71214ef 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift @@ -225,18 +225,23 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { checkUnreadCount() } + /// Show the original text for the given translated message. public func showOriginalText(for message: ChatMessage) { originalTextMessageIds.insert(message.id) } + /// Show the translated text for the given translated message. public func showTranslatedText(for message: ChatMessage) { originalTextMessageIds.remove(message.id) } + /// Creates a view model for the given message. + /// + /// You can override this method to provide a custom view model. open func makeMessageViewModel( for message: ChatMessage - ) -> ChatMessageViewModel { - ChatMessageViewModel( + ) -> MessageViewModel { + MessageViewModel( message: message, channel: channel, originalTextMessageIds: originalTextMessageIds diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index dc9d693ea..e0b017dac 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -6,59 +6,9 @@ import AVKit import StreamChat import SwiftUI -open class ChatMessageViewModel: ObservableObject { - @Injected(\.utils) private var utils - @Injected(\.chatClient) private var chatClient - - private var message: ChatMessage - private var channel: ChatChannel? - public var originalTextMessageIds: Set - - public init( - message: ChatMessage, - channel: ChatChannel?, - originalTextMessageIds: Set = [] - ) { - self.message = message - self.channel = channel - self.originalTextMessageIds = originalTextMessageIds - } - - public var isOriginalTextShown: Bool { - originalTextMessageIds.contains(message.id) - } - - open var isSwipeToQuoteReplyPossible: Bool { - message.isInteractionEnabled && channel?.config.repliesEnabled == true - } - - open var textContent: String { - if !isOriginalTextShown, let translatedText = translatedText { - return translatedText - } - - return message.adjustedText - } - - public var translatedText: String? { - if let language = channel?.membership?.language, - let translatedText = message.textContent(for: language) { - return translatedText - } - - return nil - } - - // MARK: - Helpers - - private var messageListConfig: MessageListConfig { - utils.messageListConfig - } -} - public struct MessageContainerView: View { @EnvironmentObject private var channelViewModel: ChatChannelViewModel - @EnvironmentObject private var messageViewModel: ChatMessageViewModel + @EnvironmentObject private var messageViewModel: MessageViewModel @Environment(\.channelTranslationLanguage) var translationLanguage @Injected(\.fonts) private var fonts diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift index 4345dde38..38dfd70b7 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift @@ -38,7 +38,6 @@ public struct MessageListView: View, KeyboardReadable { @State private var scrollDirection = ScrollDirection.up @State private var unreadMessagesBannerShown = false @State private var unreadButtonDismissed = false - @Binding var originalTextMessageIds: Set private var messageRenderingUtil = MessageRenderingUtil.shared private var skipRenderingMessageIds = [String]() @@ -83,8 +82,7 @@ public struct MessageListView: View, KeyboardReadable { onMessageAppear: @escaping (Int, ScrollDirection) -> Void, onScrollToBottom: @escaping () -> Void, onLongPress: @escaping (MessageDisplayInfo) -> Void, - onJumpToMessage: ((String) -> Bool)? = nil, - originalTextMessageIds: Binding> = .constant([]) + onJumpToMessage: ((String) -> Bool)? = nil ) { self.factory = factory self.channel = channel @@ -104,7 +102,6 @@ public struct MessageListView: View, KeyboardReadable { _quotedMessage = quotedMessage _scrollPosition = scrollPosition _firstUnreadMessageId = firstUnreadMessageId - _originalTextMessageIds = originalTextMessageIds if !messageRenderingUtil.hasPreviousMessageSet || self.showScrollToLatestButton == false || self.scrolledId != nil diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 8406f6309..13efccf1f 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -6,7 +6,7 @@ import StreamChat import SwiftUI public struct MessageView: View { - @EnvironmentObject private var viewModel: ChatMessageViewModel + @EnvironmentObject private var viewModel: MessageViewModel @Injected(\.utils) private var utils @@ -254,7 +254,7 @@ struct StreamTextView: View { public struct LinkDetectionTextView: View { @Environment(\.layoutDirection) var layoutDirection @Environment(\.channelTranslationLanguage) var translationLanguage - @EnvironmentObject private var viewModel: ChatMessageViewModel + @EnvironmentObject private var viewModel: MessageViewModel @Injected(\.colors) var colors @Injected(\.fonts) var fonts diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift new file mode 100644 index 000000000..996e73ac0 --- /dev/null +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -0,0 +1,56 @@ +// +// Copyright © 2025 Stream.io Inc. All rights reserved. +// + +import StreamChat + +/// The view model that contains the logic for displaying a message in the message list view. +open class MessageViewModel: ObservableObject { + @Injected(\.utils) private var utils + @Injected(\.chatClient) private var chatClient + + private var message: ChatMessage + private var channel: ChatChannel? + public private(set) var originalTextMessageIds: Set + + public init( + message: ChatMessage, + channel: ChatChannel?, + originalTextMessageIds: Set = [] + ) { + self.message = message + self.channel = channel + self.originalTextMessageIds = originalTextMessageIds + } + + public var isOriginalTextShown: Bool { + originalTextMessageIds.contains(message.id) + } + + open var isSwipeToQuoteReplyPossible: Bool { + message.isInteractionEnabled && channel?.config.repliesEnabled == true + } + + open var textContent: String { + if !isOriginalTextShown, let translatedText = translatedText { + return translatedText + } + + return message.adjustedText + } + + public var translatedText: String? { + if let language = channel?.membership?.language, + let translatedText = message.textContent(for: language) { + return translatedText + } + + return nil + } + + // MARK: - Helpers + + private var messageListConfig: MessageListConfig { + utils.messageListConfig + } +} diff --git a/StreamChatSwiftUI.xcodeproj/project.pbxproj b/StreamChatSwiftUI.xcodeproj/project.pbxproj index 582fad6af..7a6bf8cd9 100644 --- a/StreamChatSwiftUI.xcodeproj/project.pbxproj +++ b/StreamChatSwiftUI.xcodeproj/project.pbxproj @@ -522,6 +522,7 @@ AD3AB65C2CB730090014D4D7 /* Shimmer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3AB65B2CB730090014D4D7 /* Shimmer.swift */; }; AD3AB65E2CB731360014D4D7 /* ChatThreadListLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3AB65D2CB731360014D4D7 /* ChatThreadListLoadingView.swift */; }; AD3AB6602CB7403C0014D4D7 /* ChatThreadListHeaderViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3AB65F2CB7403C0014D4D7 /* ChatThreadListHeaderViewModifier.swift */; }; + AD51D9182DB9543A0068D0B0 /* MessageViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD51D9172DB9543A0068D0B0 /* MessageViewModel.swift */; }; AD5C0A5F2D6FDD9700E1E500 /* BouncedMessageActionsModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD5C0A5E2D6FDD8600E1E500 /* BouncedMessageActionsModifier.swift */; }; AD6B7E052D356E8800ADEF39 /* ReactionsUsersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6B7E042D356E8800ADEF39 /* ReactionsUsersViewModel.swift */; }; ADE0F55E2CB838420053B8B9 /* ChatThreadListErrorBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE0F55D2CB838420053B8B9 /* ChatThreadListErrorBannerView.swift */; }; @@ -1123,6 +1124,7 @@ AD3AB65B2CB730090014D4D7 /* Shimmer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shimmer.swift; sourceTree = ""; }; AD3AB65D2CB731360014D4D7 /* ChatThreadListLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListLoadingView.swift; sourceTree = ""; }; AD3AB65F2CB7403C0014D4D7 /* ChatThreadListHeaderViewModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListHeaderViewModifier.swift; sourceTree = ""; }; + AD51D9172DB9543A0068D0B0 /* MessageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewModel.swift; sourceTree = ""; }; AD5C0A5E2D6FDD8600E1E500 /* BouncedMessageActionsModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BouncedMessageActionsModifier.swift; sourceTree = ""; }; AD6B7E042D356E8800ADEF39 /* ReactionsUsersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactionsUsersViewModel.swift; sourceTree = ""; }; ADE0F55D2CB838420053B8B9 /* ChatThreadListErrorBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListErrorBannerView.swift; sourceTree = ""; }; @@ -1786,6 +1788,7 @@ 8465FCFF2746A95600AF091E /* MessageListView.swift */, 8465FD052746A95600AF091E /* MessageContainerView.swift */, 8465FD0E2746A95600AF091E /* MessageView.swift */, + AD51D9172DB9543A0068D0B0 /* MessageViewModel.swift */, 84DEC8E02760D24100172876 /* MessageRepliesView.swift */, 8465FD0D2746A95600AF091E /* MessageAvatarView.swift */, 8465FCFE2746A95600AF091E /* ImageAttachmentView.swift */, @@ -2790,6 +2793,7 @@ 82D64C0C2AD7E5B700C5C79E /* ImageEncoders.swift in Sources */, 8465FD832746A95700AF091E /* LinkAttachmentView.swift in Sources */, 4FCD7DA72D632121000EEB0F /* MarkdownFormatter.swift in Sources */, + AD51D9182DB9543A0068D0B0 /* MessageViewModel.swift in Sources */, 82D64C082AD7E5B700C5C79E /* Operation.swift in Sources */, 82D64BEB2AD7E5B700C5C79E /* ImagePipelineTask.swift in Sources */, AD2DDA612CB040EA0040B8D4 /* NoThreadsView.swift in Sources */, From 5b133a50ed4df52f0a8edb2c6180edcb6481a86e Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Wed, 23 Apr 2025 18:37:37 +0100 Subject: [PATCH 04/38] Fix show original text not working properly --- .../ChatChannel/MessageList/MessageView.swift | 19 ++----------------- .../MessageList/MessageViewModel.swift | 4 ++-- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 13efccf1f..261cba941 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -266,8 +266,6 @@ public struct LinkDetectionTextView: View { LocalizedStringKey(message.adjustedText) } - @State var displayedText: AttributedString? - @State var linkDetector = TextLinkDetector() @State var tintColor = InjectedValues[\.colors].tintColor @@ -278,27 +276,14 @@ public struct LinkDetectionTextView: View { public var body: some View { Group { - if let displayedText { - Text(displayedText) - } else { - Text(message.adjustedText) - } + Text(displayText) } .foregroundColor(textColor(for: message)) .font(fonts.body) .tint(tintColor) - .onAppear { - displayedText = attributedString(for: message) - } - .onChange(of: message, perform: { updated in - displayedText = attributedString(for: updated) - }) - .onChange(of: viewModel.isOriginalTextShown, perform: { _ in - displayedText = attributedString(for: message) - }) } - private func attributedString(for message: ChatMessage) -> AttributedString { + var displayText: AttributedString { let text = viewModel.textContent // Markdown diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index 996e73ac0..83009da8e 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -9,8 +9,8 @@ open class MessageViewModel: ObservableObject { @Injected(\.utils) private var utils @Injected(\.chatClient) private var chatClient - private var message: ChatMessage - private var channel: ChatChannel? + public private(set) var message: ChatMessage + public private(set) var channel: ChatChannel? public private(set) var originalTextMessageIds: Set public init( From 4d565296226ec48464aa767f676721e9034c704b Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Wed, 23 Apr 2025 21:35:19 +0100 Subject: [PATCH 05/38] Extract some properties from the view to the MessageViewModel --- .../MessageList/MessageContainerView.swift | 46 ++++++++--------- .../MessageList/MessageViewModel.swift | 49 +++++++++++++++++-- 2 files changed, 64 insertions(+), 31 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index e0b017dac..f9fbb8611 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -63,15 +63,15 @@ public struct MessageContainerView: View { public var body: some View { HStack(alignment: .bottom) { - if message.type == .system || (message.type == .error && message.isBounced == false) { + if messageViewModel.systemMessageShown { factory.makeSystemMessageView(message: message) } else { - if message.isRightAligned { + if messageViewModel.isRightAligned { MessageSpacer(spacerWidth: spacerWidth) } else { - if messageListConfig.messageDisplayOptions.showAvatars(for: channel) { + if let userDisplayInfo = messageViewModel.userDisplayInfo { factory.makeMessageAvatarView( - for: message.authorDisplayInfo + for: userDisplayInfo ) .opacity(showsAllInfo ? 1 : 0) .offset(y: bottomReactionsShown ? offsetYAvatar : 0) @@ -79,8 +79,8 @@ public struct MessageContainerView: View { } } - VStack(alignment: message.isRightAligned ? .trailing : .leading) { - if isMessagePinned { + VStack(alignment: messageViewModel.isRightAligned ? .trailing : .leading) { + if messageViewModel.isPinned { MessagePinDetailsView( message: message, reactionsShown: topReactionsShown @@ -107,9 +107,7 @@ public struct MessageContainerView: View { } ) : nil - - ((message.localState == .sendingFailed || message.isBounced) && !message.text.isEmpty) ? - SendFailureIndicator() : nil + messageViewModel.failureIndicatorShown ? SendFailureIndicator() : nil } ) .background( @@ -238,20 +236,21 @@ public struct MessageContainerView: View { .foregroundColor(Color(colors.subtitleText)) Button( action: { - if messageViewModel.isOriginalTextShown { + if messageViewModel.originalTextShown { channelViewModel.showTranslatedText(for: message) } else { channelViewModel.showOriginalText(for: message) } }, label: { - Text(messageViewModel.isOriginalTextShown ? "Show Translation" : "Show Original") + Text(messageViewModel.originalTextShown ? "Show Translation" : "Show Original") .font(fonts.footnote) .foregroundColor(Color(colors.subtitleText)) } ) } } + if showsAllInfo && !message.isDeleted { if message.isSentByCurrentUser && channel.config.readEventsEnabled { HStack(spacing: 4) { @@ -260,15 +259,13 @@ public struct MessageContainerView: View { message: message ) - if messageListConfig.messageDisplayOptions.showMessageDate { + if messageViewModel.messageDateShown { factory.makeMessageDateView(for: message) } } - } else if !message.isRightAligned - && channel.memberCount > 2 - && messageListConfig.messageDisplayOptions.showAuthorName { + } else if messageViewModel.authorAndDateShown { factory.makeMessageAuthorAndDateView(for: message) - } else if messageListConfig.messageDisplayOptions.showMessageDate { + } else if messageViewModel.messageDateShown { factory.makeMessageDateView(for: message) } } @@ -282,20 +279,21 @@ public struct MessageContainerView: View { : nil ) - if !message.isRightAligned { + if !messageViewModel.isRightAligned { MessageSpacer(spacerWidth: spacerWidth) } } } .padding( .top, - topReactionsShown && !isMessagePinned ? messageListConfig.messageDisplayOptions.reactionsTopPadding(message) : 0 + topReactionsShown && !messageViewModel.isPinned ? messageListConfig.messageDisplayOptions + .reactionsTopPadding(message) : 0 ) .padding(.horizontal, messageListConfig.messagePaddings.horizontal) - .padding(.bottom, showsAllInfo || isMessagePinned ? paddingValue : 2) + .padding(.bottom, showsAllInfo || messageViewModel.isPinned ? paddingValue : 2) .padding(.top, isLast ? paddingValue : 0) - .background(isMessagePinned ? Color(colors.pinnedBackground) : nil) - .padding(.bottom, isMessagePinned ? paddingValue / 2 : 0) + .background(messageViewModel.isPinned ? Color(colors.pinnedBackground) : nil) + .padding(.bottom, messageViewModel.isPinned ? paddingValue / 2 : 0) .transition( message.isSentByCurrentUser ? messageListConfig.messageDisplayOptions.currentUserMessageTransition : @@ -310,16 +308,12 @@ public struct MessageContainerView: View { replyThreshold + 30 } - private var isMessagePinned: Bool { - message.pinDetails != nil - } - private var contentWidth: CGFloat { let padding: CGFloat = messageListConfig.messagePaddings.horizontal let minimumWidth: CGFloat = 240 let available = max(minimumWidth, (width ?? 0) - spacerWidth) - 2 * padding let avatarSize: CGFloat = CGSize.messageAvatarSize.width + padding - let totalWidth = message.isRightAligned ? available : available - avatarSize + let totalWidth = messageViewModel.isRightAligned ? available : available - avatarSize return totalWidth } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index 83009da8e..644b1cef3 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -23,23 +23,64 @@ open class MessageViewModel: ObservableObject { self.originalTextMessageIds = originalTextMessageIds } - public var isOriginalTextShown: Bool { + public var originalTextShown: Bool { originalTextMessageIds.contains(message.id) } + public var systemMessageShown: Bool { + message.type == .system || (message.type == .error && message.isBounced == false) + } + + public var reactionsShown: Bool { + !message.reactionScores.isEmpty + && !message.isDeleted + && channel?.config.reactionsEnabled == true + } + + public var failureIndicatorShown: Bool { + ((message.localState == .sendingFailed || message.isBounced) && !message.text.isEmpty) + } + + open var authorAndDateShown: Bool { + guard let channel = channel else { return false } + return !message.isRightAligned + && channel.memberCount > 2 + && messageListConfig.messageDisplayOptions.showAuthorName + } + + open var messageDateShown: Bool { + messageListConfig.messageDisplayOptions.showMessageDate + } + + public var isPinned: Bool { + message.isPinned + } + + public var isRightAligned: Bool { + message.isRightAligned + } + + public var userDisplayInfo: UserDisplayInfo? { + guard let channel = channel else { return nil } + guard messageListConfig.messageDisplayOptions.showAvatars(for: channel) else { return nil } + return message.authorDisplayInfo + } + open var isSwipeToQuoteReplyPossible: Bool { message.isInteractionEnabled && channel?.config.repliesEnabled == true } open var textContent: String { - if !isOriginalTextShown, let translatedText = translatedText { + if !originalTextShown, let translatedText = translatedText { return translatedText } return message.adjustedText } - public var translatedText: String? { + // MARK: - Helpers + + private var translatedText: String? { if let language = channel?.membership?.language, let translatedText = message.textContent(for: language) { return translatedText @@ -48,8 +89,6 @@ open class MessageViewModel: ObservableObject { return nil } - // MARK: - Helpers - private var messageListConfig: MessageListConfig { utils.messageListConfig } From ab0e5114380f61e9b7251dbc7440a62b19ff2b36 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Wed, 23 Apr 2025 23:21:03 +0100 Subject: [PATCH 06/38] Fix MessageContainerView_Tests --- .../MessageList/MessageContainerView.swift | 4 +- .../MessageContainerView_Tests.swift | 147 +----------------- 2 files changed, 8 insertions(+), 143 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index f9fbb8611..064c61446 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -7,8 +7,8 @@ import StreamChat import SwiftUI public struct MessageContainerView: View { - @EnvironmentObject private var channelViewModel: ChatChannelViewModel - @EnvironmentObject private var messageViewModel: MessageViewModel + @EnvironmentObject var channelViewModel: ChatChannelViewModel + @EnvironmentObject var messageViewModel: MessageViewModel @Environment(\.channelTranslationLanguage) var translationLanguage @Injected(\.fonts) private var fonts diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift index bbd514b6f..3cbbebef9 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift @@ -205,6 +205,7 @@ class MessageContainerView_Tests: StreamChatTestCase { width: 2 * defaultScreenSize.width / 3, scrolledId: .constant(nil) ) + .environmentObject(MessageViewModel(message: message, channel: nil)) .frame(width: 200) .padding() @@ -230,6 +231,7 @@ class MessageContainerView_Tests: StreamChatTestCase { isFirst: true, scrolledId: .constant(nil) ) + .environmentObject(MessageViewModel(message: message, channel: nil)) .frame(width: 200) // Then @@ -256,6 +258,7 @@ class MessageContainerView_Tests: StreamChatTestCase { isFirst: true, scrolledId: .constant(nil) ) + .environmentObject(MessageViewModel(message: message, channel: nil)) .frame(width: 200) // Then @@ -339,150 +342,11 @@ class MessageContainerView_Tests: StreamChatTestCase { AssertSnapshot(view, size: CGSize(width: 375, height: 200)) } - func test_handleGestureForMessage_whenMessageIsInteractable_shouldLongPress() { - // Given - let message = ChatMessage.mock( - id: .unique, - cid: .unique, - text: "Hello", - localState: nil, - isSentByCurrentUser: true - ) - - let exp = expectation(description: "Long press triggered") - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(), - message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil) - ) { _ in - exp.fulfill() - } - - view.handleGestureForMessage(showsMessageActions: false, showsBottomContainer: false) - - waitForExpectations(timeout: defaultTimeout) { error in - XCTAssertNil(error, "Long press was not triggered") - } - } - - func test_handleGestureForMessage_whenMessageNotInteractable_shouldNotLongPress() { - // Given - let message = ChatMessage.mock( - id: .unique, - cid: .unique, - text: "Hello", - type: .ephemeral, - localState: nil, - isSentByCurrentUser: true - ) - - let exp = expectation(description: "Long press should not be triggered") - exp.isInverted = true - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(), - message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil) - ) { _ in - exp.fulfill() - } - - view.handleGestureForMessage(showsMessageActions: false, showsBottomContainer: false) - - waitForExpectations(timeout: 1) - } - - func test_isSwipeToReplyPossible_whenRepliesEnabled_whenMessageInteractable_shouldBeTrue() { - let message = ChatMessage.mock( - id: .unique, - cid: .unique, - text: "Hello", - localState: nil, - isSentByCurrentUser: true - ) - - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(config: .mock(repliesEnabled: true)), - message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil), - onLongPress: { _ in } - ) - - XCTAssertTrue(view.isSwipeToReplyPossible) - } - - func test_isSwipeToReplyPossible_whenRepliesDisabled_whenMessageInteractable_shouldBeFalse() { - let message = ChatMessage.mock( - id: .unique, - cid: .unique, - text: "Hello", - localState: nil, - isSentByCurrentUser: true - ) - - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(config: .mock(repliesEnabled: false)), - message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil), - onLongPress: { _ in } - ) - - XCTAssertFalse(view.isSwipeToReplyPossible) - } - - func test_isSwipeToReplyPossible_whenRepliesEnabled_whenMessageNotInteractable_shouldBeFalse() { - let message = ChatMessage.mock( - id: .unique, - cid: .unique, - text: "Hello", - type: .ephemeral, - localState: nil, - isSentByCurrentUser: true - ) - - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(config: .mock(repliesEnabled: true)), - message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil), - onLongPress: { _ in } - ) - - XCTAssertFalse(view.isSwipeToReplyPossible) - } - // MARK: - private func testMessageViewContainer(message: ChatMessage) -> some View { - MessageContainerView( + let channel = ChatChannel.mockDMChannel() + return MessageContainerView( factory: DefaultViewFactory.shared, channel: .mockDMChannel(), message: message, @@ -494,6 +358,7 @@ class MessageContainerView_Tests: StreamChatTestCase { quotedMessage: .constant(nil), onLongPress: { _ in } ) + .environmentObject(MessageViewModel(message: message, channel: channel)) .frame(width: 375, height: 200) } } From b3b00efe43d723b416578690058a64a690e03303 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 24 Apr 2025 00:24:55 +0100 Subject: [PATCH 07/38] Fix MessageListView_Tests --- .../ChatChannel/MessageListView_Tests.swift | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift index d11c2fc42..252d1e4b2 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift @@ -5,7 +5,7 @@ @testable import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI -import StreamSwiftTestHelpers +@testable import StreamChatTestTools import SwiftUI import XCTest @@ -22,9 +22,9 @@ class MessageListView_Tests: StreamChatTestCase { func test_messageListView_withReactions() { // Given + let channelController = ChatChannelController_Mock.mock(client: chatClient) let channelConfig = ChannelConfig(reactionsEnabled: true) let messageListView = makeMessageListView(channelConfig: channelConfig) - .applyDefaultSize() // Then assertSnapshot(matching: messageListView, as: .image(perceptualPrecision: precision)) @@ -34,7 +34,6 @@ class MessageListView_Tests: StreamChatTestCase { // Given let channelConfig = ChannelConfig(reactionsEnabled: false) let messageListView = makeMessageListView(channelConfig: channelConfig) - .applyDefaultSize() // Then assertSnapshot(matching: messageListView, as: .image(perceptualPrecision: precision)) @@ -64,7 +63,6 @@ class MessageListView_Tests: StreamChatTestCase { channelConfig: channelConfig, currentlyTypingUsers: [typingUser] ) - .applyDefaultSize() // Then assertSnapshot(matching: messageListView, as: .image(perceptualPrecision: precision)) @@ -92,7 +90,6 @@ class MessageListView_Tests: StreamChatTestCase { channelConfig: channelConfig, unreadCount: .mock(messages: 3) ) - .applyDefaultSize() // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -104,7 +101,7 @@ class MessageListView_Tests: StreamChatTestCase { channelConfig: ChannelConfig, unreadCount: ChannelUnreadCount = .noUnread, currentlyTypingUsers: Set = [] - ) -> MessageListView { + ) -> some SwiftUI.View { let reactions = [MessageReactionType(rawValue: "like"): 2] let channel = ChatChannel.mockDMChannel( config: channelConfig, @@ -118,8 +115,12 @@ class MessageListView_Tests: StreamChatTestCase { author: .mock(id: .unique), reactionScores: reactions )] + let messages = LazyCachedMapCollection(source: temp, map: { $0 }) - let messageListView = MessageListView( + let channelController = ChatChannelController_Mock.mock(client: chatClient) + channelController.channel_mock = channel + channelController.messages_mock = Array(messages) + return MessageListView( factory: DefaultViewFactory.shared, channel: channel, messages: messages, @@ -135,7 +136,7 @@ class MessageListView_Tests: StreamChatTestCase { onScrollToBottom: {}, onLongPress: { _ in } ) - - return messageListView + .applyDefaultSize() + .environmentObject(ChatChannelViewModel(channelController: channelController)) } } From 43df71832d86296de489993b772541e4647f160e Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 24 Apr 2025 00:29:19 +0100 Subject: [PATCH 08/38] Fix MessageListViewAvatars_Tests --- .../MessageListViewAvatars_Tests.swift | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift index 930d099d2..0754eb39f 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift @@ -5,7 +5,8 @@ @testable import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI -import StreamSwiftTestHelpers +@testable import StreamChatTestTools +import SwiftUI import XCTest class MessageListViewAvatars_Tests: StreamChatTestCase { @@ -25,7 +26,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockDMChannel() // When - let view = makeMessageListView(with: channel).applyDefaultSize() + let view = makeMessageListView(with: channel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -37,7 +38,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockNonDMChannel() // When - let view = makeMessageListView(with: channel).applyDefaultSize() + let view = makeMessageListView(with: channel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -49,7 +50,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockDMChannel() // When - let view = makeMessageListView(with: channel).applyDefaultSize() + let view = makeMessageListView(with: channel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -61,7 +62,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockNonDMChannel() // When - let view = makeMessageListView(with: channel).applyDefaultSize() + let view = makeMessageListView(with: channel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -77,7 +78,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { streamChat = StreamChat(chatClient: chatClient, utils: utils) } - private func makeMessageListView(with channel: ChatChannel) -> MessageListView { + private func makeMessageListView(with channel: ChatChannel) -> some SwiftUI.View { let temp = [ChatMessage.mock( id: .unique, cid: channel.cid, @@ -85,7 +86,10 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { author: .mock(id: .unique) )] let messages = LazyCachedMapCollection(source: temp, map: { $0 }) - let messageListView = MessageListView( + let channelController = ChatChannelController_Mock.mock(client: chatClient) + channelController.channel_mock = channel + channelController.messages_mock = Array(messages) + return MessageListView( factory: DefaultViewFactory.shared, channel: channel, messages: messages, @@ -101,7 +105,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { onScrollToBottom: {}, onLongPress: { _ in } ) - - return messageListView + .applyDefaultSize() + .environmentObject(ChatChannelViewModel(channelController: channelController)) } } From 5e947ecb9fb76395501ff9dcb708ef823fee2a1e Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 5 May 2025 18:01:04 +0100 Subject: [PATCH 09/38] Use EnvironmentObject for the main container and EnvironmentValue for the child views --- .../MessageList/MessageContainerView.swift | 2 +- .../MessageList/MessageListView.swift | 26 +++++++++++++++++++ .../ChatChannel/MessageList/MessageView.swift | 6 ++--- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 064c61446..67e13abb8 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -301,7 +301,7 @@ public struct MessageContainerView: View { ) .accessibilityElement(children: .contain) .accessibilityIdentifier("MessageContainerView") - .environmentObject(messageViewModel) + .environment(\.messageViewModel, messageViewModel) } private var maximumHorizontalSwipeDisplacement: CGFloat { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift index 38dfd70b7..174d5b3d9 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift @@ -608,6 +608,14 @@ private struct ChannelTranslationLanguageKey: EnvironmentKey { static let defaultValue: TranslationLanguage? = nil } +private struct MessageViewModelKey: EnvironmentKey { + static let defaultValue: MessageViewModel? = nil +} + +private struct ChatChannelViewModelKey: EnvironmentKey { + static let defaultValue: ChatChannelViewModel? = nil +} + extension EnvironmentValues { var channelTranslationLanguage: TranslationLanguage? { get { @@ -617,4 +625,22 @@ extension EnvironmentValues { self[ChannelTranslationLanguageKey.self] = newValue } } + + var messageViewModel: MessageViewModel? { + get { + self[MessageViewModelKey.self] + } + set { + self[MessageViewModelKey.self] = newValue + } + } + + var chatChannelViewModel: ChatChannelViewModel? { + get { + self[ChatChannelViewModelKey.self] + } + set { + self[ChatChannelViewModelKey.self] = newValue + } + } } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 261cba941..38f8e8591 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -6,7 +6,7 @@ import StreamChat import SwiftUI public struct MessageView: View { - @EnvironmentObject private var viewModel: MessageViewModel + @Environment(\.messageViewModel) var messageViewModel @Injected(\.utils) private var utils @@ -254,7 +254,7 @@ struct StreamTextView: View { public struct LinkDetectionTextView: View { @Environment(\.layoutDirection) var layoutDirection @Environment(\.channelTranslationLanguage) var translationLanguage - @EnvironmentObject private var viewModel: MessageViewModel + @Environment(\.messageViewModel) var viewModel @Injected(\.colors) var colors @Injected(\.fonts) var fonts @@ -284,7 +284,7 @@ public struct LinkDetectionTextView: View { } var displayText: AttributedString { - let text = viewModel.textContent + let text = viewModel?.textContent ?? "" // Markdown let attributes = AttributeContainer() From bd695bf9a1379f362f82af8d72d504e64c23db2b Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 5 May 2025 18:46:36 +0100 Subject: [PATCH 10/38] Fix existing unit tests --- .../ChatChannel/MessageList/MessageListView.swift | 2 +- .../ChatChannel/MessageList/MessageView.swift | 6 ++---- .../ChatChannel/MessageListViewNewMessages_Tests.swift | 5 +++++ .../ChatChannel/MessageViewMultiRowReactions_Tests.swift | 7 ++++++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift index 174d5b3d9..c99b087ec 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift @@ -635,7 +635,7 @@ extension EnvironmentValues { } } - var chatChannelViewModel: ChatChannelViewModel? { + var channelViewModel: ChatChannelViewModel? { get { self[ChatChannelViewModelKey.self] } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 38f8e8591..304c6860f 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -6,8 +6,6 @@ import StreamChat import SwiftUI public struct MessageView: View { - @Environment(\.messageViewModel) var messageViewModel - @Injected(\.utils) private var utils private var messageTypeResolver: MessageTypeResolving { @@ -254,7 +252,7 @@ struct StreamTextView: View { public struct LinkDetectionTextView: View { @Environment(\.layoutDirection) var layoutDirection @Environment(\.channelTranslationLanguage) var translationLanguage - @Environment(\.messageViewModel) var viewModel + @Environment(\.messageViewModel) var messageViewModel @Injected(\.colors) var colors @Injected(\.fonts) var fonts @@ -284,7 +282,7 @@ public struct LinkDetectionTextView: View { } var displayText: AttributedString { - let text = viewModel?.textContent ?? "" + let text = messageViewModel?.textContent ?? message.text // Markdown let attributes = AttributeContainer() diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift index e23398867..495d1596f 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift @@ -5,6 +5,7 @@ import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI +@testable import StreamChatTestTools import StreamSwiftTestHelpers import SwiftUI import XCTest @@ -101,6 +102,9 @@ final class MessageListViewNewMessages_Tests: StreamChatTestCase { channel: ChatChannel ) -> some View { let messages = LazyCachedMapCollection(source: messages, map: { $0 }) + let channelController = ChatChannelController_Mock.mock(client: chatClient) + channelController.channel_mock = channel + channelController.messages_mock = Array(messages) let messageListView = MessageListView( factory: DefaultViewFactory.shared, channel: channel, @@ -117,6 +121,7 @@ final class MessageListViewNewMessages_Tests: StreamChatTestCase { onScrollToBottom: {}, onLongPress: { _ in } ) + .environmentObject(ChatChannelViewModel(channelController: channelController)) return messageListView } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift index c6211848e..d36cda73e 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift @@ -5,6 +5,7 @@ import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI +@testable import StreamChatTestTools import StreamSwiftTestHelpers import SwiftUI import XCTest @@ -45,7 +46,9 @@ final class MessageViewMultiRowReactions_Tests: StreamChatTestCase { ] ) let channel = ChatChannel.mockDMChannel() - + let channelController = ChatChannelController_Mock.mock(client: chatClient) + channelController.channel_mock = channel + // When let view = MessageContainerView( factory: viewFactory, @@ -58,6 +61,8 @@ final class MessageViewMultiRowReactions_Tests: StreamChatTestCase { quotedMessage: .constant(nil), onLongPress: { _ in } ) + .environmentObject(ChatChannelViewModel(channelController: channelController)) + .environmentObject(MessageViewModel(message: message, channel: channel)) .applyDefaultSize() // Then From 81f89fea9c7eaa89b5c7d2f720b15fbeaa0bbe2c Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 5 May 2025 20:31:29 +0100 Subject: [PATCH 11/38] Add Stream's show original translation button + make it configurable --- DemoAppSwiftUI/AppDelegate.swift | 1 + .../MessageList/MessageContainerView.swift | 29 ++------ .../MessageList/MessageListConfig.swift | 5 +- .../MessageTranslationFooterView.swift | 66 +++++++++++++++++++ .../MessageList/MessageViewModel.swift | 18 ++++- .../DefaultViewFactory.swift | 12 +++- .../StreamChatSwiftUI/Generated/L10n.swift | 4 ++ .../Resources/en.lproj/Localizable.strings | 2 + Sources/StreamChatSwiftUI/ViewFactory.swift | 11 ++++ StreamChatSwiftUI.xcodeproj/project.pbxproj | 4 ++ 10 files changed, 123 insertions(+), 29 deletions(-) create mode 100644 Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift diff --git a/DemoAppSwiftUI/AppDelegate.swift b/DemoAppSwiftUI/AppDelegate.swift index e0c1e5bf0..a771cdf15 100644 --- a/DemoAppSwiftUI/AppDelegate.swift +++ b/DemoAppSwiftUI/AppDelegate.swift @@ -64,6 +64,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { let utils = Utils( messageListConfig: MessageListConfig( + messageDisplayOptions: .init(showOriginalTranslatedButton: true), dateIndicatorPlacement: .messageList, userBlockingEnabled: true, bouncedMessagesAlertActionsEnabled: true, diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 67e13abb8..96a117e33 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -225,30 +225,11 @@ public struct MessageContainerView: View { } } - if message.textContent(for: translationLanguage) != nil, - let localizedName = translationLanguage?.localizedName { - HStack(spacing: 4) { - Text(L10n.Message.translatedTo(localizedName)) - .font(fonts.footnote) - .foregroundColor(Color(colors.subtitleText)) - Text("•") - .font(fonts.footnote) - .foregroundColor(Color(colors.subtitleText)) - Button( - action: { - if messageViewModel.originalTextShown { - channelViewModel.showTranslatedText(for: message) - } else { - channelViewModel.showOriginalText(for: message) - } - }, - label: { - Text(messageViewModel.originalTextShown ? "Show Translation" : "Show Original") - .font(fonts.footnote) - .foregroundColor(Color(colors.subtitleText)) - } - ) - } + if messageViewModel.translatedText != nil { + factory.makeMessageTranslationFooterView( + channelViewModel: channelViewModel, + messageViewModel: messageViewModel + ) } if showsAllInfo && !message.isDeleted { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift index e9fa2fe23..f1354b09f 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift @@ -146,6 +146,7 @@ public struct MessageDisplayOptions { public let spacerWidth: (CGFloat) -> CGFloat public let reactionsTopPadding: (ChatMessage) -> CGFloat public let dateSeparator: (ChatMessage, ChatMessage) -> Date? + public let showOriginalTranslatedButton: Bool public init( showAvatars: Bool = true, @@ -165,7 +166,8 @@ public struct MessageDisplayOptions { .defaultLinkDisplay, spacerWidth: @escaping (CGFloat) -> CGFloat = MessageDisplayOptions.defaultSpacerWidth, reactionsTopPadding: @escaping (ChatMessage) -> CGFloat = MessageDisplayOptions.defaultReactionsTopPadding, - dateSeparator: @escaping (ChatMessage, ChatMessage) -> Date? = MessageDisplayOptions.defaultDateSeparator + dateSeparator: @escaping (ChatMessage, ChatMessage) -> Date? = MessageDisplayOptions.defaultDateSeparator, + showOriginalTranslatedButton: Bool = false ) { self.showAvatars = showAvatars self.showAuthorName = showAuthorName @@ -184,6 +186,7 @@ public struct MessageDisplayOptions { self.newMessagesSeparatorSize = newMessagesSeparatorSize self.dateSeparator = dateSeparator self.reactionsPlacement = reactionsPlacement + self.showOriginalTranslatedButton = showOriginalTranslatedButton } public func showAvatars(for channel: ChatChannel) -> Bool { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift new file mode 100644 index 000000000..4b5a9a62f --- /dev/null +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift @@ -0,0 +1,66 @@ +// +// Copyright © 2025 Stream.io Inc. All rights reserved. +// + +import StreamChat +import SwiftUI + +public struct MessageTranslationFooterView: View { + @ObservedObject var channelViewModel: ChatChannelViewModel + @ObservedObject var messageViewModel: MessageViewModel + + @Injected(\.fonts) private var fonts + @Injected(\.colors) private var colors + @Injected(\.utils) private var utils + + public init( + channelViewModel: ChatChannelViewModel, + messageViewModel: MessageViewModel + ) { + self.channelViewModel = channelViewModel + self.messageViewModel = messageViewModel + } + + public var body: some View { + if utils.messageListConfig.messageDisplayOptions.showOriginalTranslatedButton { + HStack(spacing: 4) { + if !messageViewModel.originalTextShown { + translatedToView + separatorView + } + showOriginalButton + } + } else { + translatedToView + } + } + + private var translatedToView: some View { + Text(messageViewModel.translatedLanguageText ?? "") + .font(fonts.footnote) + .foregroundColor(Color(colors.subtitleText)) + } + + private var separatorView: some View { + Text("•") + .font(fonts.footnote) + .foregroundColor(Color(colors.subtitleText)) + } + + private var showOriginalButton: some View { + Button( + action: { + if messageViewModel.originalTextShown { + channelViewModel.showTranslatedText(for: messageViewModel.message) + } else { + channelViewModel.showOriginalText(for: messageViewModel.message) + } + }, + label: { + Text(messageViewModel.originalTranslationButtonText) + .font(fonts.footnote) + .foregroundColor(Color(colors.subtitleText)) + } + ) + } +} diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index 644b1cef3..ee4822789 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -78,9 +78,7 @@ open class MessageViewModel: ObservableObject { return message.adjustedText } - // MARK: - Helpers - - private var translatedText: String? { + public var translatedText: String? { if let language = channel?.membership?.language, let translatedText = message.textContent(for: language) { return translatedText @@ -89,6 +87,20 @@ open class MessageViewModel: ObservableObject { return nil } + public var translatedLanguageText: String? { + guard let localizedName = channel?.membership?.language?.localizedName else { + return nil + } + + return L10n.Message.translatedTo(localizedName) + } + + public var originalTranslationButtonText: String { + originalTextShown ? L10n.Message.showTranslation : L10n.Message.showOriginal + } + + // MARK: - Helpers + private var messageListConfig: MessageListConfig { utils.messageListConfig } diff --git a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift index 3e14a3829..94d6fa93c 100644 --- a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift +++ b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift @@ -370,7 +370,17 @@ extension ViewFactory { public func makeLastInGroupHeaderView(for message: ChatMessage) -> some View { EmptyView() } - + + public func makeMessageTranslationFooterView( + channelViewModel: ChatChannelViewModel, + messageViewModel: MessageViewModel + ) -> some View { + MessageTranslationFooterView( + channelViewModel: channelViewModel, + messageViewModel: messageViewModel + ) + } + public func makeImageAttachmentView( for message: ChatMessage, isFirst: Bool, diff --git a/Sources/StreamChatSwiftUI/Generated/L10n.swift b/Sources/StreamChatSwiftUI/Generated/L10n.swift index 3d1f1baa9..109848843 100644 --- a/Sources/StreamChatSwiftUI/Generated/L10n.swift +++ b/Sources/StreamChatSwiftUI/Generated/L10n.swift @@ -352,6 +352,10 @@ internal enum L10n { internal static var deletedMessagePlaceholder: String { L10n.tr("Localizable", "message.deleted-message-placeholder") } /// Only visible to you internal static var onlyVisibleToYou: String { L10n.tr("Localizable", "message.only-visible-to-you") } + /// Show Original + internal static var showOriginal: String { L10n.tr("Localizable", "message.showOriginal") } + /// Show Translation + internal static var showTranslation: String { L10n.tr("Localizable", "message.showTranslation") } /// Translated to %@ internal static func translatedTo(_ p1: Any) -> String { return L10n.tr("Localizable", "message.translatedTo", String(describing: p1)) diff --git a/Sources/StreamChatSwiftUI/Resources/en.lproj/Localizable.strings b/Sources/StreamChatSwiftUI/Resources/en.lproj/Localizable.strings index 0eab6da4d..3d57da52a 100644 --- a/Sources/StreamChatSwiftUI/Resources/en.lproj/Localizable.strings +++ b/Sources/StreamChatSwiftUI/Resources/en.lproj/Localizable.strings @@ -90,6 +90,8 @@ "message.polls.votes" = "%d votes"; "message.translatedTo" = "Translated to %@"; +"message.showOriginal" = "Show Original"; +"message.showTranslation" = "Show Translation"; "alert.actions.cancel" = "Cancel"; "alert.actions.delete" = "Delete"; diff --git a/Sources/StreamChatSwiftUI/ViewFactory.swift b/Sources/StreamChatSwiftUI/ViewFactory.swift index 762eaadc8..c0d9060e4 100644 --- a/Sources/StreamChatSwiftUI/ViewFactory.swift +++ b/Sources/StreamChatSwiftUI/ViewFactory.swift @@ -359,6 +359,17 @@ public protocol ViewFactory: AnyObject { /// - Returns: view shown in the date and author indicator slot. func makeMessageAuthorAndDateView(for message: ChatMessage) -> MessageAuthorAndDateViewType + associatedtype MessageTranslationFooterViewType: View + /// Creates a view to display translation information below a message if it has been translated. + /// - Parameters: + /// - channelViewModel: The channel view model used by default to show or hide the translation. + /// - messageViewModel: The message view model used to display information about the message. + /// - Returns: A view to display translation information of the message. + func makeMessageTranslationFooterView( + channelViewModel: ChatChannelViewModel, + messageViewModel: MessageViewModel + ) -> MessageTranslationFooterViewType + associatedtype LastInGroupHeaderView: View /// Creates a view shown as a header of the last message in a group. /// - Parameter message: the chat message for which the header will be displayed. diff --git a/StreamChatSwiftUI.xcodeproj/project.pbxproj b/StreamChatSwiftUI.xcodeproj/project.pbxproj index 7a6bf8cd9..11b00b63a 100644 --- a/StreamChatSwiftUI.xcodeproj/project.pbxproj +++ b/StreamChatSwiftUI.xcodeproj/project.pbxproj @@ -533,6 +533,7 @@ ADE442EE2CBDAAAA0066CDF7 /* ChatThreadListViewModel_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE442ED2CBDAAAA0066CDF7 /* ChatThreadListViewModel_Tests.swift */; }; ADE442F02CBDAAB70066CDF7 /* ChatThreadListView_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE442EF2CBDAAB70066CDF7 /* ChatThreadListView_Tests.swift */; }; ADE442F22CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE442F12CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift */; }; + ADF544382DC93C2A0024A0B3 /* MessageTranslationFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADF544372DC93C0D0024A0B3 /* MessageTranslationFooterView.swift */; }; C14A465B284665B100EF498E /* SDKIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C14A465A284665B100EF498E /* SDKIdentifier.swift */; }; E3A1C01C282BAC66002D1E26 /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = E3A1C01B282BAC66002D1E26 /* Sentry */; }; /* End PBXBuildFile section */ @@ -1135,6 +1136,7 @@ ADE442ED2CBDAAAA0066CDF7 /* ChatThreadListViewModel_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListViewModel_Tests.swift; sourceTree = ""; }; ADE442EF2CBDAAB70066CDF7 /* ChatThreadListView_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListView_Tests.swift; sourceTree = ""; }; ADE442F12CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListItemView_Tests.swift; sourceTree = ""; }; + ADF544372DC93C0D0024A0B3 /* MessageTranslationFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageTranslationFooterView.swift; sourceTree = ""; }; C14A465A284665B100EF498E /* SDKIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKIdentifier.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1791,6 +1793,7 @@ AD51D9172DB9543A0068D0B0 /* MessageViewModel.swift */, 84DEC8E02760D24100172876 /* MessageRepliesView.swift */, 8465FD0D2746A95600AF091E /* MessageAvatarView.swift */, + ADF544372DC93C0D0024A0B3 /* MessageTranslationFooterView.swift */, 8465FCFE2746A95600AF091E /* ImageAttachmentView.swift */, 84A75FBA274EA29B00225CE8 /* GiphyAttachmentView.swift */, 8465FD002746A95600AF091E /* FileAttachmentPreview.swift */, @@ -2678,6 +2681,7 @@ 82D64BEA2AD7E5B700C5C79E /* TaskFetchOriginalImageData.swift in Sources */, 82D64BDB2AD7E5B700C5C79E /* UIImageView.swift in Sources */, 82D64BD02AD7E5B700C5C79E /* NukeVideoPlayerView.swift in Sources */, + ADF544382DC93C2A0024A0B3 /* MessageTranslationFooterView.swift in Sources */, 84EADEB52B28935B0046B50C /* RecordingView.swift in Sources */, 84AB7B262773619F00631A10 /* MentionUsersView.swift in Sources */, 8465FDA82746A95700AF091E /* ImageLoading.swift in Sources */, From 66fdfea93b1df603f59337d1886ab4884a2607f5 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Mon, 5 May 2025 22:52:58 +0100 Subject: [PATCH 12/38] Add test coverage to show original text feature --- .../MessageContainerView_Tests.swift | 129 +++++++++++++++++- ..._translatedText_participant_snapshot.1.png | Bin 0 -> 19124 bytes ...isabled_translatedTextShown_snapshot.1.png | Bin 0 -> 35652 bytes ...onEnabled_originalTextShown_snapshot.1.png | Bin 0 -> 34898 bytes ...Enabled_translatedTextShown_snapshot.1.png | Bin 0 -> 41339 bytes 5 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_participant_snapshot.1.png create mode 100644 StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot.1.png create mode 100644 StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_originalTextShown_snapshot.1.png create mode 100644 StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot.1.png diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift index 3cbbebef9..378768f90 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift @@ -5,6 +5,7 @@ import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI +@testable import StreamChatTestTools import StreamSwiftTestHelpers import SwiftUI import XCTest @@ -318,7 +319,7 @@ class MessageContainerView_Tests: StreamChatTestCase { .environment(\.channelTranslationLanguage, .spanish) // Then - AssertSnapshot(view, size: CGSize(width: 375, height: 200)) + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) } func test_translatedText_myMessageIsNotTranslated_snapshot() { @@ -342,13 +343,120 @@ class MessageContainerView_Tests: StreamChatTestCase { AssertSnapshot(view, size: CGSize(width: 375, height: 200)) } + func test_translatedText_showOriginalTranslatedButtonEnabled_originalTextShown_snapshot() { + // Given + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + author: .mock(id: .unique), + translations: [ + .spanish: "Hola" + ] + ) + let utils = Utils( + dateFormatter: EmptyDateFormatter(), + messageListConfig: .init( + messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: true) + ) + ) + streamChat = StreamChat(chatClient: chatClient, utils: utils) + + // When + let messageViewModel = MessageViewModel_Mock( + message: message, + channel: .mock( + cid: .unique, + membership: .mock(id: .unique, language: .spanish) + ) + ) + messageViewModel.mockOriginalTextShown = true + let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) + .environment(\.channelTranslationLanguage, .spanish) + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + + func test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot() { + // Given + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + author: .mock(id: .unique), + translations: [ + .spanish: "Hola" + ] + ) + let utils = Utils( + dateFormatter: EmptyDateFormatter(), + messageListConfig: .init( + messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: true) + ) + ) + streamChat = StreamChat(chatClient: chatClient, utils: utils) + + // When + let messageViewModel = MessageViewModel_Mock( + message: message, + channel: .mock( + cid: .unique, + membership: .mock(id: .unique, language: .spanish) + ) + ) + messageViewModel.mockOriginalTextShown = false + let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) + .environment(\.channelTranslationLanguage, .spanish) + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + + func test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot() { + // Given + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + author: .mock(id: .unique), + translations: [ + .spanish: "Hola" + ] + ) + let utils = Utils( + dateFormatter: EmptyDateFormatter(), + messageListConfig: .init( + messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: false) + ) + ) + streamChat = StreamChat(chatClient: chatClient, utils: utils) + + // When + let messageViewModel = MessageViewModel_Mock( + message: message, + channel: .mock( + cid: .unique, + membership: .mock(id: .unique, language: .spanish) + ) + ) + let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) + .environment(\.channelTranslationLanguage, .spanish) + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + // MARK: - private - func testMessageViewContainer(message: ChatMessage) -> some View { - let channel = ChatChannel.mockDMChannel() - return MessageContainerView( + func testMessageViewContainer( + message: ChatMessage, + channel: ChatChannel? = nil, + messageViewModel: MessageViewModel? = nil + ) -> some View { + MessageContainerView( factory: DefaultViewFactory.shared, - channel: .mockDMChannel(), + channel: channel ?? .mockDMChannel(), message: message, width: defaultScreenSize.width, showsAllInfo: true, @@ -358,7 +466,16 @@ class MessageContainerView_Tests: StreamChatTestCase { quotedMessage: .constant(nil), onLongPress: { _ in } ) - .environmentObject(MessageViewModel(message: message, channel: channel)) + .environmentObject(ChatChannelViewModel(channelController: ChatChannelController_Mock.mock())) + .environmentObject(messageViewModel ?? MessageViewModel(message: message, channel: channel)) .frame(width: 375, height: 200) } } + +class MessageViewModel_Mock: MessageViewModel { + var mockOriginalTextShown: Bool = false + + override var originalTextShown: Bool { + mockOriginalTextShown + } +} diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_participant_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_participant_snapshot.1.png new file mode 100644 index 0000000000000000000000000000000000000000..c16e211b9482847b812dc1f09ca11ba8ee647f22 GIT binary patch literal 19124 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 literal 0 HcmV?d00001 diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot.1.png new file mode 100644 index 0000000000000000000000000000000000000000..418bef28c3c1f60d23d2268b6324ef3c2bab7980 GIT binary patch literal 35652 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 E0r!F4e*gdg literal 0 HcmV?d00001 diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot.1.png new file mode 100644 index 0000000000000000000000000000000000000000..afbc90ca54000da9f9e6d7acc61c1bfffaa8902c GIT binary patch literal 41339 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 L?-naOdij3 Date: Mon, 5 May 2025 23:06:25 +0100 Subject: [PATCH 13/38] Fix reaction overlay tests --- Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift | 1 + .../Tests/ChatChannel/ReactionsOverlayView_Tests.swift | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift index 196857f16..9f39606d1 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift @@ -157,6 +157,7 @@ public struct ChatChannelView: View, KeyboardReadable { messageDisplayInfo = nil } ) + .environment(\.messageViewModel, viewModel.makeMessageViewModel(for: messageDisplayInfo!.message)) .transition(.identity) .edgesIgnoringSafeArea(.all) : nil diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/ReactionsOverlayView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/ReactionsOverlayView_Tests.swift index 03c4f6dbd..ec19ab3f6 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/ReactionsOverlayView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/ReactionsOverlayView_Tests.swift @@ -241,15 +241,17 @@ class ReactionsOverlayView_Tests: StreamChatTestCase { contentWidth: self.messageDisplayInfo.contentWidth, isFirst: true ) + let channel = ChatChannel.mock(cid: .unique, membership: .mock(id: "test", language: .portuguese)) let view = VerticallyCenteredView { ReactionsOverlayView( factory: DefaultViewFactory.shared, - channel: .mock(cid: .unique, membership: .mock(id: "test", language: .portuguese)), + channel: channel, currentSnapshot: self.overlayImage, messageDisplayInfo: messageDisplayInfo, onBackgroundTap: {}, onActionExecuted: { _ in } ) + .environment(\.messageViewModel, MessageViewModel(message: testMessage, channel: channel)) } // Then From ab8f75831e8a6abea0ebe6c86bb2d68c3ace2a99 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Tue, 6 May 2025 00:29:34 +0100 Subject: [PATCH 14/38] Fix message container tests --- .../MessageContainerView_Tests.swift | 49 ++++++++++++++---- ...isabled_translatedTextShown_snapshot.1.png | Bin 35652 -> 35798 bytes ...onEnabled_originalTextShown_snapshot.1.png | Bin 34898 -> 35112 bytes ...Enabled_translatedTextShown_snapshot.1.png | Bin 41339 -> 41039 bytes 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift index 378768f90..4f9171162 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift @@ -124,7 +124,9 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) + viewModel.mockMessageDateShown = true + let view = testMessageViewContainer(message: message, messageViewModel: viewModel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -140,7 +142,9 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) + viewModel.mockMessageDateShown = true + let view = testMessageViewContainer(message: message, messageViewModel: viewModel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -161,7 +165,9 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) + viewModel.mockMessageDateShown = true + let view = testMessageViewContainer(message: message, messageViewModel: viewModel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -268,6 +274,8 @@ class MessageContainerView_Tests: StreamChatTestCase { func test_imageAttachments_failed_snapshot() { // Given + let utils = Utils(dateFormatter: EmptyDateFormatter()) + streamChat = StreamChat(chatClient: chatClient, utils: utils) let message = ChatMessage.mock( id: .unique, cid: .unique, @@ -278,7 +286,9 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) + viewModel.mockMessageDateShown = true + let view = testMessageViewContainer(message: message, messageViewModel: viewModel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -296,7 +306,9 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) + viewModel.mockMessageDateShown = true + let view = testMessageViewContainer(message: message, messageViewModel: viewModel) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -454,9 +466,13 @@ class MessageContainerView_Tests: StreamChatTestCase { channel: ChatChannel? = nil, messageViewModel: MessageViewModel? = nil ) -> some View { - MessageContainerView( + let defaultChannel = ChatChannel.mockDMChannel(memberCount: 3) + let channelController = ChatChannelController_Mock.mock() + channelController.channel_mock = channel ?? defaultChannel + let defaultViewModel = MessageViewModel(message: message, channel: channel) + return MessageContainerView( factory: DefaultViewFactory.shared, - channel: channel ?? .mockDMChannel(), + channel: channel ?? defaultChannel, message: message, width: defaultScreenSize.width, showsAllInfo: true, @@ -466,16 +482,31 @@ class MessageContainerView_Tests: StreamChatTestCase { quotedMessage: .constant(nil), onLongPress: { _ in } ) - .environmentObject(ChatChannelViewModel(channelController: ChatChannelController_Mock.mock())) - .environmentObject(messageViewModel ?? MessageViewModel(message: message, channel: channel)) + .environmentObject(ChatChannelViewModel(channelController: channelController)) + .environmentObject(messageViewModel ?? defaultViewModel) .frame(width: 375, height: 200) } } class MessageViewModel_Mock: MessageViewModel { var mockOriginalTextShown: Bool = false + var mockAuthorAndDateShown: Bool = false + var mockMessageDateShown: Bool = false + var mockTextContent: String? + + override var textContent: String { + mockTextContent ?? super.textContent + } override var originalTextShown: Bool { mockOriginalTextShown } + + override var authorAndDateShown: Bool { + mockAuthorAndDateShown + } + + override var messageDateShown: Bool { + mockMessageDateShown + } } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot.1.png index 418bef28c3c1f60d23d2268b6324ef3c2bab7980..e580b6c6b2bb547991c4f478a3cd7b4b4c2373b7 100644 GIT binary patch literal 35798 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 z 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 WWtZdyD)|cl literal 35652 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 literal 34898 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 E0r!F4e*gdg diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot.1.png index afbc90ca54000da9f9e6d7acc61c1bfffaa8902c..bde5f3403251a655680d8a1a6dd15b9dea2a6bd3 100644 GIT binary patch literal 41039 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 SQ$WleQ&oDPm@oh6_5T53T3U$! literal 41339 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 L?-naOdij3 Date: Thu, 22 May 2025 16:42:46 +0100 Subject: [PATCH 15/38] Refactor code to avoid environment objects in MessageContainerView --- .../ChatChannel/ChatChannelView.swift | 2 - .../ChatChannel/ChatChannelViewModel.swift | 26 ---------- .../MessageList/MessageContainerView.swift | 9 ++-- .../MessageList/MessageListView.swift | 19 ------- .../MessageTranslationFooterView.swift | 7 +-- .../MessageList/MessageViewModel.swift | 49 +++++++++++++++++-- .../DefaultViewFactory.swift | 9 ++-- Sources/StreamChatSwiftUI/ViewFactory.swift | 2 - 8 files changed, 58 insertions(+), 65 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift index 9f39606d1..4269a3385 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelView.swift @@ -73,7 +73,6 @@ public struct ChatChannelView: View, KeyboardReadable { }, onJumpToMessage: viewModel.jumpToMessage(messageId:) ) - .environmentObject(viewModel) .overlay( viewModel.currentDateString != nil ? factory.makeDateIndicatorView(dateString: viewModel.currentDateString!) @@ -157,7 +156,6 @@ public struct ChatChannelView: View, KeyboardReadable { messageDisplayInfo = nil } ) - .environment(\.messageViewModel, viewModel.makeMessageViewModel(for: messageDisplayInfo!.message)) .transition(.identity) .edgesIgnoringSafeArea(.all) : nil diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift index 6d71214ef..b25335923 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift @@ -131,9 +131,6 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { @Published public private(set) var channel: ChatChannel? - /// The message ids of the translated messages that should show the original text. - @Published public var originalTextMessageIds: Set = [] - public var isMessageThread: Bool { messageController != nil } @@ -225,29 +222,6 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { checkUnreadCount() } - /// Show the original text for the given translated message. - public func showOriginalText(for message: ChatMessage) { - originalTextMessageIds.insert(message.id) - } - - /// Show the translated text for the given translated message. - public func showTranslatedText(for message: ChatMessage) { - originalTextMessageIds.remove(message.id) - } - - /// Creates a view model for the given message. - /// - /// You can override this method to provide a custom view model. - open func makeMessageViewModel( - for message: ChatMessage - ) -> MessageViewModel { - MessageViewModel( - message: message, - channel: channel, - originalTextMessageIds: originalTextMessageIds - ) - } - @objc private func selectedMessageThread(notification: Notification) { if let message = notification.userInfo?[MessageRepliesConstants.selectedMessage] as? ChatMessage { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 96a117e33..3f9ac3736 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -7,8 +7,7 @@ import StreamChat import SwiftUI public struct MessageContainerView: View { - @EnvironmentObject var channelViewModel: ChatChannelViewModel - @EnvironmentObject var messageViewModel: MessageViewModel + @ObservedObject var messageViewModel: MessageViewModel @Environment(\.channelTranslationLanguage) var translationLanguage @Injected(\.fonts) private var fonts @@ -47,7 +46,8 @@ public struct MessageContainerView: View { isLast: Bool, scrolledId: Binding, quotedMessage: Binding, - onLongPress: @escaping (MessageDisplayInfo) -> Void + onLongPress: @escaping (MessageDisplayInfo) -> Void, + viewModel: MessageViewModel ) { self.factory = factory self.channel = channel @@ -57,6 +57,7 @@ public struct MessageContainerView: View { self.isInThread = isInThread self.isLast = isLast self.onLongPress = onLongPress + messageViewModel = viewModel _scrolledId = scrolledId _quotedMessage = quotedMessage } @@ -227,7 +228,6 @@ public struct MessageContainerView: View { if messageViewModel.translatedText != nil { factory.makeMessageTranslationFooterView( - channelViewModel: channelViewModel, messageViewModel: messageViewModel ) } @@ -282,6 +282,7 @@ public struct MessageContainerView: View { ) .accessibilityElement(children: .contain) .accessibilityIdentifier("MessageContainerView") + .id(message.id + messageViewModel.textContent) .environment(\.messageViewModel, messageViewModel) } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift index c99b087ec..8e52f5313 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift @@ -6,8 +6,6 @@ import StreamChat import SwiftUI public struct MessageListView: View, KeyboardReadable { - @EnvironmentObject private var channelViewModel: ChatChannelViewModel - @Injected(\.utils) private var utils @Injected(\.chatClient) private var chatClient @Injected(\.colors) private var colors @@ -150,10 +148,6 @@ public struct MessageListView: View, KeyboardReadable { isLast: !showsLastInGroupInfo && message == messages.last ) .environment(\.channelTranslationLanguage, channel.membership?.language) - .environmentObject(channelViewModel) - .environmentObject(channelViewModel.makeMessageViewModel( - for: message - )) .onAppear { if index == nil { index = messageListDateUtils.index(for: message, in: messages) @@ -612,10 +606,6 @@ private struct MessageViewModelKey: EnvironmentKey { static let defaultValue: MessageViewModel? = nil } -private struct ChatChannelViewModelKey: EnvironmentKey { - static let defaultValue: ChatChannelViewModel? = nil -} - extension EnvironmentValues { var channelTranslationLanguage: TranslationLanguage? { get { @@ -634,13 +624,4 @@ extension EnvironmentValues { self[MessageViewModelKey.self] = newValue } } - - var channelViewModel: ChatChannelViewModel? { - get { - self[ChatChannelViewModelKey.self] - } - set { - self[ChatChannelViewModelKey.self] = newValue - } - } } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift index 4b5a9a62f..9ee2cf15f 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageTranslationFooterView.swift @@ -6,7 +6,6 @@ import StreamChat import SwiftUI public struct MessageTranslationFooterView: View { - @ObservedObject var channelViewModel: ChatChannelViewModel @ObservedObject var messageViewModel: MessageViewModel @Injected(\.fonts) private var fonts @@ -14,10 +13,8 @@ public struct MessageTranslationFooterView: View { @Injected(\.utils) private var utils public init( - channelViewModel: ChatChannelViewModel, messageViewModel: MessageViewModel ) { - self.channelViewModel = channelViewModel self.messageViewModel = messageViewModel } @@ -51,9 +48,9 @@ public struct MessageTranslationFooterView: View { Button( action: { if messageViewModel.originalTextShown { - channelViewModel.showTranslatedText(for: messageViewModel.message) + messageViewModel.hideOriginalText() } else { - channelViewModel.showOriginalText(for: messageViewModel.message) + messageViewModel.showOriginalText() } }, label: { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index ee4822789..bacdd7502 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -2,6 +2,7 @@ // Copyright © 2025 Stream.io Inc. All rights reserved. // +import Combine import StreamChat /// The view model that contains the logic for displaying a message in the message list view. @@ -11,20 +12,39 @@ open class MessageViewModel: ObservableObject { public private(set) var message: ChatMessage public private(set) var channel: ChatChannel? - public private(set) var originalTextMessageIds: Set + private(set) var originalTextTranslationsStore: MessageOriginalTranslationsStore + private var cancellables = Set() public init( message: ChatMessage, channel: ChatChannel?, - originalTextMessageIds: Set = [] + originalTextTranslationsStore: MessageOriginalTranslationsStore ) { self.message = message self.channel = channel - self.originalTextMessageIds = originalTextMessageIds + self.originalTextTranslationsStore = originalTextTranslationsStore + self.originalTextTranslationsStore.$originalTextMessageIds.sink( + receiveValue: { [weak self] _ in + self?.objectWillChange.send() + } + ) + .store(in: &cancellables) } + // MARK: - Inputs + + public func showOriginalText() { + originalTextTranslationsStore.showOriginalText(for: message.id) + } + + public func hideOriginalText() { + originalTextTranslationsStore.hideOriginalText(for: message.id) + } + + // MARK: - Outputs + public var originalTextShown: Bool { - originalTextMessageIds.contains(message.id) + originalTextTranslationsStore.shouldShowOriginalText(for: message.id) } public var systemMessageShown: Bool { @@ -105,3 +125,24 @@ open class MessageViewModel: ObservableObject { utils.messageListConfig } } + +/// A singleton store that keeps track of which messages have their original text shown. +public class MessageOriginalTranslationsStore: ObservableObject { + private init() {} + + public static let shared = MessageOriginalTranslationsStore() + + @Published var originalTextMessageIds: Set = [] + + public func shouldShowOriginalText(for messageId: MessageId) -> Bool { + originalTextMessageIds.contains(messageId) + } + + public func showOriginalText(for messageId: MessageId) { + originalTextMessageIds.insert(messageId) + } + + public func hideOriginalText(for messageId: MessageId) { + originalTextMessageIds.remove(messageId) + } +} diff --git a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift index 94d6fa93c..0e8555f70 100644 --- a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift +++ b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift @@ -341,7 +341,12 @@ extension ViewFactory { isLast: isLast, scrolledId: scrolledId, quotedMessage: quotedMessage, - onLongPress: onLongPress + onLongPress: onLongPress, + viewModel: MessageViewModel( + message: message, + channel: channel, + originalTextTranslationsStore: .shared + ) ) } @@ -372,11 +377,9 @@ extension ViewFactory { } public func makeMessageTranslationFooterView( - channelViewModel: ChatChannelViewModel, messageViewModel: MessageViewModel ) -> some View { MessageTranslationFooterView( - channelViewModel: channelViewModel, messageViewModel: messageViewModel ) } diff --git a/Sources/StreamChatSwiftUI/ViewFactory.swift b/Sources/StreamChatSwiftUI/ViewFactory.swift index c0d9060e4..a05bbb981 100644 --- a/Sources/StreamChatSwiftUI/ViewFactory.swift +++ b/Sources/StreamChatSwiftUI/ViewFactory.swift @@ -362,11 +362,9 @@ public protocol ViewFactory: AnyObject { associatedtype MessageTranslationFooterViewType: View /// Creates a view to display translation information below a message if it has been translated. /// - Parameters: - /// - channelViewModel: The channel view model used by default to show or hide the translation. /// - messageViewModel: The message view model used to display information about the message. /// - Returns: A view to display translation information of the message. func makeMessageTranslationFooterView( - channelViewModel: ChatChannelViewModel, messageViewModel: MessageViewModel ) -> MessageTranslationFooterViewType From 654de7267b6092e03940c100884e1a82c0c29d02 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 17:26:20 +0100 Subject: [PATCH 16/38] Provide view model by default --- .../ChatChannel/MessageList/MessageContainerView.swift | 8 ++++++-- .../ChatChannel/MessageList/MessageViewModel.swift | 4 +++- Sources/StreamChatSwiftUI/DefaultViewFactory.swift | 7 +------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 3f9ac3736..f33937350 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -47,7 +47,7 @@ public struct MessageContainerView: View { scrolledId: Binding, quotedMessage: Binding, onLongPress: @escaping (MessageDisplayInfo) -> Void, - viewModel: MessageViewModel + viewModel: MessageViewModel? = nil ) { self.factory = factory self.channel = channel @@ -57,7 +57,11 @@ public struct MessageContainerView: View { self.isInThread = isInThread self.isLast = isLast self.onLongPress = onLongPress - messageViewModel = viewModel + messageViewModel = viewModel ?? MessageViewModel( + message: message, + channel: channel, + originalTextTranslationsStore: .shared + ) _scrolledId = scrolledId _quotedMessage = quotedMessage } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index bacdd7502..2d8c4af7b 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -12,7 +12,7 @@ open class MessageViewModel: ObservableObject { public private(set) var message: ChatMessage public private(set) var channel: ChatChannel? - private(set) var originalTextTranslationsStore: MessageOriginalTranslationsStore + private var originalTextTranslationsStore: MessageOriginalTranslationsStore private var cancellables = Set() public init( @@ -33,10 +33,12 @@ open class MessageViewModel: ObservableObject { // MARK: - Inputs + /// Show the original text of the message. public func showOriginalText() { originalTextTranslationsStore.showOriginalText(for: message.id) } + /// Hide the original text of the message to show the translated text. public func hideOriginalText() { originalTextTranslationsStore.hideOriginalText(for: message.id) } diff --git a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift index 0e8555f70..4aed51521 100644 --- a/Sources/StreamChatSwiftUI/DefaultViewFactory.swift +++ b/Sources/StreamChatSwiftUI/DefaultViewFactory.swift @@ -341,12 +341,7 @@ extension ViewFactory { isLast: isLast, scrolledId: scrolledId, quotedMessage: quotedMessage, - onLongPress: onLongPress, - viewModel: MessageViewModel( - message: message, - channel: channel, - originalTextTranslationsStore: .shared - ) + onLongPress: onLongPress ) } From 2adc09b529dc70025464c8430ef1150e2dea77dd Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 17:30:40 +0100 Subject: [PATCH 17/38] Add warning about thread-safeness in the singletone store --- .../ChatChannel/MessageList/MessageViewModel.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index 2d8c4af7b..560392bf7 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -129,6 +129,8 @@ open class MessageViewModel: ObservableObject { } /// A singleton store that keeps track of which messages have their original text shown. +/// +/// **Note:** This is not thread-safe, it should only be used on the main thread. public class MessageOriginalTranslationsStore: ObservableObject { private init() {} From afd7e0eccb9c9cf9b84847a15e9717736a183372 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 17:58:45 +0100 Subject: [PATCH 18/38] Example of performing translations from message actions --- DemoAppSwiftUI/AppDelegate.swift | 2 +- DemoAppSwiftUI/ViewFactoryExamples.swift | 39 +++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/DemoAppSwiftUI/AppDelegate.swift b/DemoAppSwiftUI/AppDelegate.swift index a771cdf15..c7e1e0c76 100644 --- a/DemoAppSwiftUI/AppDelegate.swift +++ b/DemoAppSwiftUI/AppDelegate.swift @@ -64,7 +64,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { let utils = Utils( messageListConfig: MessageListConfig( - messageDisplayOptions: .init(showOriginalTranslatedButton: true), + messageDisplayOptions: .init(showOriginalTranslatedButton: false), dateIndicatorPlacement: .messageList, userBlockingEnabled: true, bouncedMessagesAlertActionsEnabled: true, diff --git a/DemoAppSwiftUI/ViewFactoryExamples.swift b/DemoAppSwiftUI/ViewFactoryExamples.swift index 751e2b75d..46e298ab1 100644 --- a/DemoAppSwiftUI/ViewFactoryExamples.swift +++ b/DemoAppSwiftUI/ViewFactoryExamples.swift @@ -19,7 +19,44 @@ class DemoAppFactory: ViewFactory { func makeChannelListHeaderViewModifier(title: String) -> some ChannelListHeaderViewModifier { CustomChannelModifier(title: title) } - + + func supportedMessageActions( + for message: ChatMessage, + channel: ChatChannel, + onFinish: @escaping (MessageActionInfo) -> Void, + onError: @escaping (any Error) -> Void + ) -> [MessageAction] { + let originalTranslationStore = MessageOriginalTranslationsStore.shared + let originalTextShown = originalTranslationStore.shouldShowOriginalText(for: message.id) + let originalTranslationAction = MessageAction( + title: originalTextShown ? "Show Translation" : "Show Original", + iconName: "translate", + action: { + if originalTextShown { + originalTranslationStore.hideOriginalText(for: message.id) + } else { + originalTranslationStore.showOriginalText(for: message.id) + } + onFinish( + MessageActionInfo( + message: message, + identifier: "showOriginalText" + ) + ) + }, + confirmationPopup: nil, + isDestructive: false + ) + return MessageAction.defaultActions( + factory: self, + for: message, + channel: channel, + chatClient: chatClient, + onFinish: onFinish, + onError: onError + ) + [originalTranslationAction] + } + func supportedMoreChannelActions( for channel: ChatChannel, onDismiss: @escaping () -> Void, From 4584aa78f230adeae254c9a67a2f04783deb7821 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 17:58:58 +0100 Subject: [PATCH 19/38] Revert "Example of performing translations from message actions" This reverts commit afd7e0eccb9c9cf9b84847a15e9717736a183372. --- DemoAppSwiftUI/AppDelegate.swift | 2 +- DemoAppSwiftUI/ViewFactoryExamples.swift | 39 +----------------------- 2 files changed, 2 insertions(+), 39 deletions(-) diff --git a/DemoAppSwiftUI/AppDelegate.swift b/DemoAppSwiftUI/AppDelegate.swift index c7e1e0c76..a771cdf15 100644 --- a/DemoAppSwiftUI/AppDelegate.swift +++ b/DemoAppSwiftUI/AppDelegate.swift @@ -64,7 +64,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { let utils = Utils( messageListConfig: MessageListConfig( - messageDisplayOptions: .init(showOriginalTranslatedButton: false), + messageDisplayOptions: .init(showOriginalTranslatedButton: true), dateIndicatorPlacement: .messageList, userBlockingEnabled: true, bouncedMessagesAlertActionsEnabled: true, diff --git a/DemoAppSwiftUI/ViewFactoryExamples.swift b/DemoAppSwiftUI/ViewFactoryExamples.swift index 46e298ab1..751e2b75d 100644 --- a/DemoAppSwiftUI/ViewFactoryExamples.swift +++ b/DemoAppSwiftUI/ViewFactoryExamples.swift @@ -19,44 +19,7 @@ class DemoAppFactory: ViewFactory { func makeChannelListHeaderViewModifier(title: String) -> some ChannelListHeaderViewModifier { CustomChannelModifier(title: title) } - - func supportedMessageActions( - for message: ChatMessage, - channel: ChatChannel, - onFinish: @escaping (MessageActionInfo) -> Void, - onError: @escaping (any Error) -> Void - ) -> [MessageAction] { - let originalTranslationStore = MessageOriginalTranslationsStore.shared - let originalTextShown = originalTranslationStore.shouldShowOriginalText(for: message.id) - let originalTranslationAction = MessageAction( - title: originalTextShown ? "Show Translation" : "Show Original", - iconName: "translate", - action: { - if originalTextShown { - originalTranslationStore.hideOriginalText(for: message.id) - } else { - originalTranslationStore.showOriginalText(for: message.id) - } - onFinish( - MessageActionInfo( - message: message, - identifier: "showOriginalText" - ) - ) - }, - confirmationPopup: nil, - isDestructive: false - ) - return MessageAction.defaultActions( - factory: self, - for: message, - channel: channel, - chatClient: chatClient, - onFinish: onFinish, - onError: onError - ) + [originalTranslationAction] - } - + func supportedMoreChannelActions( for channel: ChatChannel, onDismiss: @escaping () -> Void, From d5a51f4501b6ab3669bdbfeadd6d87d2c28a63e6 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 18:15:14 +0100 Subject: [PATCH 20/38] Fix reactions overlay view not shown correct translated or original text --- .../ChatChannel/Reactions/ReactionsOverlayView.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift index 7d20b5e1a..8f599eea4 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift @@ -10,6 +10,7 @@ public struct ReactionsOverlayView: View { @Injected(\.colors) private var colors @StateObject var viewModel: ReactionsOverlayViewModel + @StateObject var messageViewModel: MessageViewModel @State private var popIn = false @State private var willPopOut = false @@ -50,6 +51,13 @@ public struct ReactionsOverlayView: View { message: messageDisplayInfo.message ) ) + _messageViewModel = StateObject( + wrappedValue: MessageViewModel( + message: messageDisplayInfo.message, + channel: channel, + originalTextTranslationsStore: .shared + ) + ) self.channel = channel self.factory = factory self.currentSnapshot = currentSnapshot @@ -225,6 +233,7 @@ public struct ReactionsOverlayView: View { isFirst: messageDisplayInfo.isFirst, scrolledId: .constant(nil) ) + .environment(\.messageViewModel, messageViewModel) } private func dismissReactionsOverlay(completion: @escaping () -> Void) { From c54da27f9fac5216f322eac0c4550acc2f0101db Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 18:17:53 +0100 Subject: [PATCH 21/38] Open `ChatChannelViewModel.messageActionExecuted` so that it can be observed from channel view model --- .../StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift index b25335923..b0c639943 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift @@ -490,7 +490,7 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { messageActionExecuted(.init(message: message, identifier: "edit")) } - public func messageActionExecuted(_ messageActionInfo: MessageActionInfo) { + open func messageActionExecuted(_ messageActionInfo: MessageActionInfo) { utils.messageActionsResolver.resolveMessageAction( info: messageActionInfo, viewModel: self From a4a2763f107ed9f8f4059143d1aebe11345274a5 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 19:50:23 +0100 Subject: [PATCH 22/38] Rename originalTextTranslationsStore to originalTranslationsStore --- .../MessageList/MessageContainerView.swift | 2 +- .../ChatChannel/MessageList/MessageViewModel.swift | 14 +++++++------- .../Reactions/ReactionsOverlayView.swift | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 8afd15f09..123ca865e 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -66,7 +66,7 @@ public struct MessageContainerView: View { messageViewModel = viewModel ?? MessageViewModel( message: message, channel: channel, - originalTextTranslationsStore: .shared + originalTranslationsStore: .shared ) _scrolledId = scrolledId _quotedMessage = quotedMessage diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index 560392bf7..b85aabda6 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -12,18 +12,18 @@ open class MessageViewModel: ObservableObject { public private(set) var message: ChatMessage public private(set) var channel: ChatChannel? - private var originalTextTranslationsStore: MessageOriginalTranslationsStore + private var originalTranslationsStore: MessageOriginalTranslationsStore private var cancellables = Set() public init( message: ChatMessage, channel: ChatChannel?, - originalTextTranslationsStore: MessageOriginalTranslationsStore + originalTranslationsStore: MessageOriginalTranslationsStore ) { self.message = message self.channel = channel - self.originalTextTranslationsStore = originalTextTranslationsStore - self.originalTextTranslationsStore.$originalTextMessageIds.sink( + self.originalTranslationsStore = originalTranslationsStore + self.originalTranslationsStore.$originalTextMessageIds.sink( receiveValue: { [weak self] _ in self?.objectWillChange.send() } @@ -35,18 +35,18 @@ open class MessageViewModel: ObservableObject { /// Show the original text of the message. public func showOriginalText() { - originalTextTranslationsStore.showOriginalText(for: message.id) + originalTranslationsStore.showOriginalText(for: message.id) } /// Hide the original text of the message to show the translated text. public func hideOriginalText() { - originalTextTranslationsStore.hideOriginalText(for: message.id) + originalTranslationsStore.hideOriginalText(for: message.id) } // MARK: - Outputs public var originalTextShown: Bool { - originalTextTranslationsStore.shouldShowOriginalText(for: message.id) + originalTranslationsStore.shouldShowOriginalText(for: message.id) } public var systemMessageShown: Bool { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift index 8f599eea4..978862f16 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift @@ -55,7 +55,7 @@ public struct ReactionsOverlayView: View { wrappedValue: MessageViewModel( message: messageDisplayInfo.message, channel: channel, - originalTextTranslationsStore: .shared + originalTranslationsStore: .shared ) ) self.channel = channel From 2aa26c999ef1d79582a54f1e1f83fb6dbb19e468 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 22:56:40 +0100 Subject: [PATCH 23/38] Make the LinkDetectionTextView change wheneve the translations store changes --- .../ChatChannel/MessageList/MessageContainerView.swift | 1 - .../ChatChannel/MessageList/MessageView.swift | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 123ca865e..7450c8040 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -292,7 +292,6 @@ public struct MessageContainerView: View { ) .accessibilityElement(children: .contain) .accessibilityIdentifier("MessageContainerView") - .id(message.id + messageViewModel.textContent) .environment(\.messageViewModel, messageViewModel) } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 304c6860f..2a73c60ea 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -263,9 +263,9 @@ public struct LinkDetectionTextView: View { var text: LocalizedStringKey { LocalizedStringKey(message.adjustedText) } - + + @ObservedObject var originalTranslationsStore = MessageOriginalTranslationsStore.shared @State var linkDetector = TextLinkDetector() - @State var tintColor = InjectedValues[\.colors].tintColor public init(message: ChatMessage) { From be6aa996f9575eb0b405705cf789da911aff7e7a Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 22:59:15 +0100 Subject: [PATCH 24/38] Clear the original translations when opening the channel --- .../StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift | 1 + .../ChatChannel/MessageList/MessageViewModel.swift | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift index b0c639943..8646ec62a 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift @@ -498,6 +498,7 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { } @objc public func onViewAppear() { + MessageOriginalTranslationsStore.shared.clear() setActive() messages = channelDataSource.messages firstUnreadMessageId = channelDataSource.firstUnreadMessageId diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index b85aabda6..7d453854d 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -149,4 +149,8 @@ public class MessageOriginalTranslationsStore: ObservableObject { public func hideOriginalText(for messageId: MessageId) { originalTextMessageIds.remove(messageId) } + + public func clear() { + originalTextMessageIds.removeAll() + } } From c114ec55401aade63c3fc7ff12ac6ba33594ee86 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Thu, 22 May 2025 23:30:58 +0100 Subject: [PATCH 25/38] Add TODO v5 comments --- .../ChatChannel/MessageList/MessageContainerView.swift | 2 ++ .../ChatChannel/MessageList/MessageView.swift | 4 ++++ .../ChatChannel/Reactions/ReactionsOverlayView.swift | 2 ++ 3 files changed, 8 insertions(+) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 7450c8040..8d325d797 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -292,6 +292,8 @@ public struct MessageContainerView: View { ) .accessibilityElement(children: .contain) .accessibilityIdentifier("MessageContainerView") + // This is needed for the LinkDetectionTextView to work properly. + // TODO: This should be refactored on v5 so the TextView does not depend directly on the view model. .environment(\.messageViewModel, messageViewModel) } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 2a73c60ea..11bb4efe9 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -264,7 +264,11 @@ public struct LinkDetectionTextView: View { LocalizedStringKey(message.adjustedText) } + // The translations store is used to detect changes so the textContent is re-rendered. + // The @Environment(\.messageViewModel) is not reactive like @EnvironmentObject. + // TODO: On v5 the TextView should be refactored and not depend directly on the view model. @ObservedObject var originalTranslationsStore = MessageOriginalTranslationsStore.shared + @State var linkDetector = TextLinkDetector() @State var tintColor = InjectedValues[\.colors].tintColor diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift index 978862f16..948fe7364 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift @@ -233,6 +233,8 @@ public struct ReactionsOverlayView: View { isFirst: messageDisplayInfo.isFirst, scrolledId: .constant(nil) ) + // This is needed for the LinkDetectionTextView to work properly. + // TODO: This should be refactored on v5 so the TextView does not depend directly on the view model. .environment(\.messageViewModel, messageViewModel) } From eca63b111d8127539181ef93ffb96211440687bf Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 11:03:22 +0100 Subject: [PATCH 26/38] PR Feedback --- .../MessageList/MessageContainerView.swift | 12 +++++++----- .../ChatChannel/MessageList/MessageListConfig.swift | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index 8d325d797..a34efd10c 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -7,7 +7,7 @@ import StreamChat import SwiftUI public struct MessageContainerView: View { - @ObservedObject var messageViewModel: MessageViewModel + @StateObject var messageViewModel: MessageViewModel @Environment(\.channelTranslationLanguage) var translationLanguage @Injected(\.fonts) private var fonts @@ -63,10 +63,12 @@ public struct MessageContainerView: View { self.isInThread = isInThread self.isLast = isLast self.onLongPress = onLongPress - messageViewModel = viewModel ?? MessageViewModel( - message: message, - channel: channel, - originalTranslationsStore: .shared + _messageViewModel = .init( + wrappedValue: viewModel ?? MessageViewModel( + message: message, + channel: channel, + originalTranslationsStore: .shared + ) ) _scrolledId = scrolledId _quotedMessage = quotedMessage diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift index 7026d8e97..3604093e1 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListConfig.swift @@ -148,11 +148,11 @@ public struct MessageDisplayOptions { public let otherUserMessageTransition: AnyTransition public let shouldAnimateReactions: Bool public let reactionsPlacement: ReactionsPlacement + public let showOriginalTranslatedButton: Bool public let messageLinkDisplayResolver: (ChatMessage) -> [NSAttributedString.Key: Any] public let spacerWidth: (CGFloat) -> CGFloat public let reactionsTopPadding: (ChatMessage) -> CGFloat public let dateSeparator: (ChatMessage, ChatMessage) -> Date? - public let showOriginalTranslatedButton: Bool public init( showAvatars: Bool = true, @@ -168,12 +168,12 @@ public struct MessageDisplayOptions { otherUserMessageTransition: AnyTransition = .identity, shouldAnimateReactions: Bool = true, reactionsPlacement: ReactionsPlacement = .top, + showOriginalTranslatedButton: Bool = false, messageLinkDisplayResolver: @escaping (ChatMessage) -> [NSAttributedString.Key: Any] = MessageDisplayOptions .defaultLinkDisplay, spacerWidth: @escaping (CGFloat) -> CGFloat = MessageDisplayOptions.defaultSpacerWidth, reactionsTopPadding: @escaping (ChatMessage) -> CGFloat = MessageDisplayOptions.defaultReactionsTopPadding, - dateSeparator: @escaping (ChatMessage, ChatMessage) -> Date? = MessageDisplayOptions.defaultDateSeparator, - showOriginalTranslatedButton: Bool = false + dateSeparator: @escaping (ChatMessage, ChatMessage) -> Date? = MessageDisplayOptions.defaultDateSeparator ) { self.showAvatars = showAvatars self.showAuthorName = showAuthorName From a7224424cbaa7eaf2405372768ff55473fbba082 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 11:23:45 +0100 Subject: [PATCH 27/38] Refactor using utils --- .../ChatChannel/ChatChannelViewModel.swift | 2 +- .../MessageList/MessageContainerView.swift | 3 +-- .../ChatChannel/MessageList/MessageView.swift | 6 ++++-- .../MessageList/MessageViewModel.swift | 17 ++++++----------- .../Reactions/ReactionsOverlayView.swift | 3 +-- Sources/StreamChatSwiftUI/Utils.swift | 2 ++ 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift index 8646ec62a..9b1329196 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift @@ -498,7 +498,7 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource { } @objc public func onViewAppear() { - MessageOriginalTranslationsStore.shared.clear() + utils.originalTranslationsStore.clear() setActive() messages = channelDataSource.messages firstUnreadMessageId = channelDataSource.firstUnreadMessageId diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift index a34efd10c..d7cf9c77f 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift @@ -66,8 +66,7 @@ public struct MessageContainerView: View { _messageViewModel = .init( wrappedValue: viewModel ?? MessageViewModel( message: message, - channel: channel, - originalTranslationsStore: .shared + channel: channel ) ) _scrolledId = scrolledId diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 11bb4efe9..54ca58035 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -267,12 +267,14 @@ public struct LinkDetectionTextView: View { // The translations store is used to detect changes so the textContent is re-rendered. // The @Environment(\.messageViewModel) is not reactive like @EnvironmentObject. // TODO: On v5 the TextView should be refactored and not depend directly on the view model. - @ObservedObject var originalTranslationsStore = MessageOriginalTranslationsStore.shared + @ObservedObject var originalTranslationsStore = InjectedValues[\.utils].originalTranslationsStore @State var linkDetector = TextLinkDetector() @State var tintColor = InjectedValues[\.colors].tintColor - public init(message: ChatMessage) { + public init( + message: ChatMessage + ) { self.message = message } diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index 7d453854d..d5db445a6 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -12,18 +12,15 @@ open class MessageViewModel: ObservableObject { public private(set) var message: ChatMessage public private(set) var channel: ChatChannel? - private var originalTranslationsStore: MessageOriginalTranslationsStore private var cancellables = Set() public init( message: ChatMessage, - channel: ChatChannel?, - originalTranslationsStore: MessageOriginalTranslationsStore + channel: ChatChannel? ) { self.message = message self.channel = channel - self.originalTranslationsStore = originalTranslationsStore - self.originalTranslationsStore.$originalTextMessageIds.sink( + utils.originalTranslationsStore.$originalTextMessageIds.sink( receiveValue: { [weak self] _ in self?.objectWillChange.send() } @@ -35,18 +32,18 @@ open class MessageViewModel: ObservableObject { /// Show the original text of the message. public func showOriginalText() { - originalTranslationsStore.showOriginalText(for: message.id) + utils.originalTranslationsStore.showOriginalText(for: message.id) } /// Hide the original text of the message to show the translated text. public func hideOriginalText() { - originalTranslationsStore.hideOriginalText(for: message.id) + utils.originalTranslationsStore.hideOriginalText(for: message.id) } // MARK: - Outputs public var originalTextShown: Bool { - originalTranslationsStore.shouldShowOriginalText(for: message.id) + utils.originalTranslationsStore.shouldShowOriginalText(for: message.id) } public var systemMessageShown: Bool { @@ -132,9 +129,7 @@ open class MessageViewModel: ObservableObject { /// /// **Note:** This is not thread-safe, it should only be used on the main thread. public class MessageOriginalTranslationsStore: ObservableObject { - private init() {} - - public static let shared = MessageOriginalTranslationsStore() + internal init() {} @Published var originalTextMessageIds: Set = [] diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift index 948fe7364..e4a08a52d 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift @@ -54,8 +54,7 @@ public struct ReactionsOverlayView: View { _messageViewModel = StateObject( wrappedValue: MessageViewModel( message: messageDisplayInfo.message, - channel: channel, - originalTranslationsStore: .shared + channel: channel ) ) self.channel = channel diff --git a/Sources/StreamChatSwiftUI/Utils.swift b/Sources/StreamChatSwiftUI/Utils.swift index c36970e32..8a27c4391 100644 --- a/Sources/StreamChatSwiftUI/Utils.swift +++ b/Sources/StreamChatSwiftUI/Utils.swift @@ -59,6 +59,8 @@ public class Utils { public lazy var audioSessionFeedbackGenerator: AudioSessionFeedbackGenerator = StreamAudioSessionFeedbackGenerator() + public var originalTranslationsStore = MessageOriginalTranslationsStore() + var messageCachingUtils = MessageCachingUtils() var messageListDateUtils: MessageListDateUtils var channelControllerFactory = ChannelControllerFactory() From 33520f90c790b631266188cbe9bef41ea1ddd72c Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 11:24:04 +0100 Subject: [PATCH 28/38] Reapply "Example of performing translations from message actions" This reverts commit 4584aa78f230adeae254c9a67a2f04783deb7821. --- DemoAppSwiftUI/AppDelegate.swift | 2 +- DemoAppSwiftUI/ViewFactoryExamples.swift | 40 +++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/DemoAppSwiftUI/AppDelegate.swift b/DemoAppSwiftUI/AppDelegate.swift index a771cdf15..c7e1e0c76 100644 --- a/DemoAppSwiftUI/AppDelegate.swift +++ b/DemoAppSwiftUI/AppDelegate.swift @@ -64,7 +64,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { let utils = Utils( messageListConfig: MessageListConfig( - messageDisplayOptions: .init(showOriginalTranslatedButton: true), + messageDisplayOptions: .init(showOriginalTranslatedButton: false), dateIndicatorPlacement: .messageList, userBlockingEnabled: true, bouncedMessagesAlertActionsEnabled: true, diff --git a/DemoAppSwiftUI/ViewFactoryExamples.swift b/DemoAppSwiftUI/ViewFactoryExamples.swift index 751e2b75d..794bb3462 100644 --- a/DemoAppSwiftUI/ViewFactoryExamples.swift +++ b/DemoAppSwiftUI/ViewFactoryExamples.swift @@ -9,6 +9,7 @@ import SwiftUI class DemoAppFactory: ViewFactory { @Injected(\.chatClient) public var chatClient + @Injected(\.utils) public var utils private init() {} @@ -19,7 +20,44 @@ class DemoAppFactory: ViewFactory { func makeChannelListHeaderViewModifier(title: String) -> some ChannelListHeaderViewModifier { CustomChannelModifier(title: title) } - + + func supportedMessageActions( + for message: ChatMessage, + channel: ChatChannel, + onFinish: @escaping (MessageActionInfo) -> Void, + onError: @escaping (any Error) -> Void + ) -> [MessageAction] { + let originalTranslationStore = utils.originalTranslationsStore + let originalTextShown = originalTranslationStore.shouldShowOriginalText(for: message.id) + let originalTranslationAction = MessageAction( + title: originalTextShown ? "Show Translation" : "Show Original", + iconName: "translate", + action: { + if originalTextShown { + originalTranslationStore.hideOriginalText(for: message.id) + } else { + originalTranslationStore.showOriginalText(for: message.id) + } + onFinish( + MessageActionInfo( + message: message, + identifier: "showOriginalText" + ) + ) + }, + confirmationPopup: nil, + isDestructive: false + ) + return MessageAction.defaultActions( + factory: self, + for: message, + channel: channel, + chatClient: chatClient, + onFinish: onFinish, + onError: onError + ) + [originalTranslationAction] + } + func supportedMoreChannelActions( for channel: ChatChannel, onDismiss: @escaping () -> Void, From f37f1148140da02cbba24540351effae8361527f Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 11:27:31 +0100 Subject: [PATCH 29/38] Revert "Reapply "Example of performing translations from message actions"" This reverts commit 33520f90c790b631266188cbe9bef41ea1ddd72c. --- DemoAppSwiftUI/AppDelegate.swift | 2 +- DemoAppSwiftUI/ViewFactoryExamples.swift | 40 +----------------------- 2 files changed, 2 insertions(+), 40 deletions(-) diff --git a/DemoAppSwiftUI/AppDelegate.swift b/DemoAppSwiftUI/AppDelegate.swift index c7e1e0c76..a771cdf15 100644 --- a/DemoAppSwiftUI/AppDelegate.swift +++ b/DemoAppSwiftUI/AppDelegate.swift @@ -64,7 +64,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { let utils = Utils( messageListConfig: MessageListConfig( - messageDisplayOptions: .init(showOriginalTranslatedButton: false), + messageDisplayOptions: .init(showOriginalTranslatedButton: true), dateIndicatorPlacement: .messageList, userBlockingEnabled: true, bouncedMessagesAlertActionsEnabled: true, diff --git a/DemoAppSwiftUI/ViewFactoryExamples.swift b/DemoAppSwiftUI/ViewFactoryExamples.swift index 794bb3462..751e2b75d 100644 --- a/DemoAppSwiftUI/ViewFactoryExamples.swift +++ b/DemoAppSwiftUI/ViewFactoryExamples.swift @@ -9,7 +9,6 @@ import SwiftUI class DemoAppFactory: ViewFactory { @Injected(\.chatClient) public var chatClient - @Injected(\.utils) public var utils private init() {} @@ -20,44 +19,7 @@ class DemoAppFactory: ViewFactory { func makeChannelListHeaderViewModifier(title: String) -> some ChannelListHeaderViewModifier { CustomChannelModifier(title: title) } - - func supportedMessageActions( - for message: ChatMessage, - channel: ChatChannel, - onFinish: @escaping (MessageActionInfo) -> Void, - onError: @escaping (any Error) -> Void - ) -> [MessageAction] { - let originalTranslationStore = utils.originalTranslationsStore - let originalTextShown = originalTranslationStore.shouldShowOriginalText(for: message.id) - let originalTranslationAction = MessageAction( - title: originalTextShown ? "Show Translation" : "Show Original", - iconName: "translate", - action: { - if originalTextShown { - originalTranslationStore.hideOriginalText(for: message.id) - } else { - originalTranslationStore.showOriginalText(for: message.id) - } - onFinish( - MessageActionInfo( - message: message, - identifier: "showOriginalText" - ) - ) - }, - confirmationPopup: nil, - isDestructive: false - ) - return MessageAction.defaultActions( - factory: self, - for: message, - channel: channel, - chatClient: chatClient, - onFinish: onFinish, - onError: onError - ) + [originalTranslationAction] - } - + func supportedMoreChannelActions( for channel: ChatChannel, onDismiss: @escaping () -> Void, From 90fd7d9c1e682857af54d8604fc77072174898da Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 12:35:13 +0100 Subject: [PATCH 30/38] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4c9915a5..a1ea8dcf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### ✅ Added - Add extra data to user display info [#819](https://github.com/GetStream/stream-chat-swiftui/pull/819) - Make message spacing in message list configurable [#830](https://github.com/GetStream/stream-chat-swiftui/pull/830) +- Add `MessageViewModel` to `MessageContainerView` to make it easier to customise presentation logic [#815](https://github.com/GetStream/stream-chat-swiftui/pull/815) +- Add `MessageListConfig.messaeDisplayOptions.showOriginalTranslatedButton` to enable showing original text in translated message [#815](https://github.com/GetStream/stream-chat-swiftui/pull/815) +- Add `Utils.originalTranslationsStore` to keep track of messages that should show the original text [#815](https://github.com/GetStream/stream-chat-swiftui/pull/815) ### 🐞 Fixed - Fix swipe to reply enabled when quoting a message is disabled [#824](https://github.com/GetStream/stream-chat-swiftui/pull/824) - Fix mark unread action not removed when read events are disabled [#823](https://github.com/GetStream/stream-chat-swiftui/pull/823) From 10a46e2cb96b29ea49666ee4116f416be718f10e Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 16:18:09 +0100 Subject: [PATCH 31/38] Fix editing message not working --- .../ChatChannel/MessageList/MessageView.swift | 3 +++ .../ChatChannel/MessageList/MessageViewModel.swift | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift index 54ca58035..d99591ec0 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageView.swift @@ -285,6 +285,9 @@ public struct LinkDetectionTextView: View { .foregroundColor(textColor(for: message)) .font(fonts.body) .tint(tintColor) + .onChange(of: message) { message in + messageViewModel?.message = message + } } var displayText: AttributedString { diff --git a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift index d5db445a6..103b3740e 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageViewModel.swift @@ -10,7 +10,7 @@ open class MessageViewModel: ObservableObject { @Injected(\.utils) private var utils @Injected(\.chatClient) private var chatClient - public private(set) var message: ChatMessage + public internal(set) var message: ChatMessage public private(set) var channel: ChatChannel? private var cancellables = Set() From 0042189c1d6e13b99048d3f74dd468d9de951f61 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 16:32:22 +0100 Subject: [PATCH 32/38] Revert "Fix MessageListView_Tests" This reverts commit b3b00efe43d723b416578690058a64a690e03303. --- .../ChatChannel/MessageListView_Tests.swift | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift index 252d1e4b2..d11c2fc42 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListView_Tests.swift @@ -5,7 +5,7 @@ @testable import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI -@testable import StreamChatTestTools +import StreamSwiftTestHelpers import SwiftUI import XCTest @@ -22,9 +22,9 @@ class MessageListView_Tests: StreamChatTestCase { func test_messageListView_withReactions() { // Given - let channelController = ChatChannelController_Mock.mock(client: chatClient) let channelConfig = ChannelConfig(reactionsEnabled: true) let messageListView = makeMessageListView(channelConfig: channelConfig) + .applyDefaultSize() // Then assertSnapshot(matching: messageListView, as: .image(perceptualPrecision: precision)) @@ -34,6 +34,7 @@ class MessageListView_Tests: StreamChatTestCase { // Given let channelConfig = ChannelConfig(reactionsEnabled: false) let messageListView = makeMessageListView(channelConfig: channelConfig) + .applyDefaultSize() // Then assertSnapshot(matching: messageListView, as: .image(perceptualPrecision: precision)) @@ -63,6 +64,7 @@ class MessageListView_Tests: StreamChatTestCase { channelConfig: channelConfig, currentlyTypingUsers: [typingUser] ) + .applyDefaultSize() // Then assertSnapshot(matching: messageListView, as: .image(perceptualPrecision: precision)) @@ -90,6 +92,7 @@ class MessageListView_Tests: StreamChatTestCase { channelConfig: channelConfig, unreadCount: .mock(messages: 3) ) + .applyDefaultSize() // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -101,7 +104,7 @@ class MessageListView_Tests: StreamChatTestCase { channelConfig: ChannelConfig, unreadCount: ChannelUnreadCount = .noUnread, currentlyTypingUsers: Set = [] - ) -> some SwiftUI.View { + ) -> MessageListView { let reactions = [MessageReactionType(rawValue: "like"): 2] let channel = ChatChannel.mockDMChannel( config: channelConfig, @@ -115,12 +118,8 @@ class MessageListView_Tests: StreamChatTestCase { author: .mock(id: .unique), reactionScores: reactions )] - let messages = LazyCachedMapCollection(source: temp, map: { $0 }) - let channelController = ChatChannelController_Mock.mock(client: chatClient) - channelController.channel_mock = channel - channelController.messages_mock = Array(messages) - return MessageListView( + let messageListView = MessageListView( factory: DefaultViewFactory.shared, channel: channel, messages: messages, @@ -136,7 +135,7 @@ class MessageListView_Tests: StreamChatTestCase { onScrollToBottom: {}, onLongPress: { _ in } ) - .applyDefaultSize() - .environmentObject(ChatChannelViewModel(channelController: channelController)) + + return messageListView } } From 8e0b1f81f4c1edd88434895b35b272a24df6ff34 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 16:32:26 +0100 Subject: [PATCH 33/38] Revert "Fix MessageListViewAvatars_Tests" This reverts commit 43df71832d86296de489993b772541e4647f160e. --- .../MessageListViewAvatars_Tests.swift | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift index 0754eb39f..930d099d2 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewAvatars_Tests.swift @@ -5,8 +5,7 @@ @testable import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI -@testable import StreamChatTestTools -import SwiftUI +import StreamSwiftTestHelpers import XCTest class MessageListViewAvatars_Tests: StreamChatTestCase { @@ -26,7 +25,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockDMChannel() // When - let view = makeMessageListView(with: channel) + let view = makeMessageListView(with: channel).applyDefaultSize() // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -38,7 +37,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockNonDMChannel() // When - let view = makeMessageListView(with: channel) + let view = makeMessageListView(with: channel).applyDefaultSize() // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -50,7 +49,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockDMChannel() // When - let view = makeMessageListView(with: channel) + let view = makeMessageListView(with: channel).applyDefaultSize() // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -62,7 +61,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { let channel = ChatChannel.mockNonDMChannel() // When - let view = makeMessageListView(with: channel) + let view = makeMessageListView(with: channel).applyDefaultSize() // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -78,7 +77,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { streamChat = StreamChat(chatClient: chatClient, utils: utils) } - private func makeMessageListView(with channel: ChatChannel) -> some SwiftUI.View { + private func makeMessageListView(with channel: ChatChannel) -> MessageListView { let temp = [ChatMessage.mock( id: .unique, cid: channel.cid, @@ -86,10 +85,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { author: .mock(id: .unique) )] let messages = LazyCachedMapCollection(source: temp, map: { $0 }) - let channelController = ChatChannelController_Mock.mock(client: chatClient) - channelController.channel_mock = channel - channelController.messages_mock = Array(messages) - return MessageListView( + let messageListView = MessageListView( factory: DefaultViewFactory.shared, channel: channel, messages: messages, @@ -105,7 +101,7 @@ class MessageListViewAvatars_Tests: StreamChatTestCase { onScrollToBottom: {}, onLongPress: { _ in } ) - .applyDefaultSize() - .environmentObject(ChatChannelViewModel(channelController: channelController)) + + return messageListView } } From eb69af2fa7b495bafb74eb2099337879c482c568 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 16:33:15 +0100 Subject: [PATCH 34/38] Revert "Fix MessageContainerView_Tests" This reverts commit ab0e5114380f61e9b7251dbc7440a62b19ff2b36. # Conflicts: # Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageContainerView.swift # StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift --- .../MessageContainerView_Tests.swift | 193 ++++++++++-------- 1 file changed, 109 insertions(+), 84 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift index 667e432bd..ff66406d8 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift @@ -212,7 +212,6 @@ class MessageContainerView_Tests: StreamChatTestCase { width: 2 * defaultScreenSize.width / 3, scrolledId: .constant(nil) ) - .environmentObject(MessageViewModel(message: message, channel: nil)) .frame(width: 200) .padding() @@ -238,7 +237,6 @@ class MessageContainerView_Tests: StreamChatTestCase { isFirst: true, scrolledId: .constant(nil) ) - .environmentObject(MessageViewModel(message: message, channel: nil)) .frame(width: 200) // Then @@ -265,7 +263,6 @@ class MessageContainerView_Tests: StreamChatTestCase { isFirst: true, scrolledId: .constant(nil) ) - .environmentObject(MessageViewModel(message: message, channel: nil)) .frame(width: 200) // Then @@ -355,120 +352,150 @@ class MessageContainerView_Tests: StreamChatTestCase { AssertSnapshot(view, size: CGSize(width: 375, height: 200)) } - func test_translatedText_showOriginalTranslatedButtonEnabled_originalTextShown_snapshot() { + func test_handleGestureForMessage_whenMessageIsInteractable_shouldLongPress() { // Given let message = ChatMessage.mock( id: .unique, cid: .unique, text: "Hello", - author: .mock(id: .unique), - translations: [ - .spanish: "Hola" - ] - ) - let utils = Utils( - dateFormatter: EmptyDateFormatter(), - messageListConfig: .init( - messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: true) - ) + localState: nil, + isSentByCurrentUser: true ) - streamChat = StreamChat(chatClient: chatClient, utils: utils) - // When - let messageViewModel = MessageViewModel_Mock( + let exp = expectation(description: "Long press triggered") + let view = MessageContainerView( + factory: DefaultViewFactory.shared, + channel: .mockDMChannel(), message: message, - channel: .mock( - cid: .unique, - membership: .mock(id: .unique, language: .spanish) - ) - ) - messageViewModel.mockOriginalTextShown = true - let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) - .environment(\.channelTranslationLanguage, .spanish) - - // Then - assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + width: defaultScreenSize.width, + showsAllInfo: true, + isInThread: false, + isLast: false, + scrolledId: .constant(nil), + quotedMessage: .constant(nil) + ) { _ in + exp.fulfill() + } + + view.handleGestureForMessage(showsMessageActions: false, showsBottomContainer: false) + + waitForExpectations(timeout: defaultTimeout) { error in + XCTAssertNil(error, "Long press was not triggered") + } } - func test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot() { + func test_handleGestureForMessage_whenMessageNotInteractable_shouldNotLongPress() { // Given let message = ChatMessage.mock( id: .unique, cid: .unique, text: "Hello", - author: .mock(id: .unique), - translations: [ - .spanish: "Hola" - ] + type: .ephemeral, + localState: nil, + isSentByCurrentUser: true ) - let utils = Utils( - dateFormatter: EmptyDateFormatter(), - messageListConfig: .init( - messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: true) - ) + + let exp = expectation(description: "Long press should not be triggered") + exp.isInverted = true + let view = MessageContainerView( + factory: DefaultViewFactory.shared, + channel: .mockDMChannel(), + message: message, + width: defaultScreenSize.width, + showsAllInfo: true, + isInThread: false, + isLast: false, + scrolledId: .constant(nil), + quotedMessage: .constant(nil) + ) { _ in + exp.fulfill() + } + + view.handleGestureForMessage(showsMessageActions: false, showsBottomContainer: false) + + waitForExpectations(timeout: 1) + } + + func test_isSwipeToReplyPossible_whenRepliesEnabled_whenMessageInteractable_shouldBeTrue() { + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + localState: nil, + isSentByCurrentUser: true ) - streamChat = StreamChat(chatClient: chatClient, utils: utils) - // When - let messageViewModel = MessageViewModel_Mock( + let view = MessageContainerView( + factory: DefaultViewFactory.shared, + channel: .mockDMChannel(config: .mock(repliesEnabled: true)), message: message, - channel: .mock( - cid: .unique, - membership: .mock(id: .unique, language: .spanish) - ) + width: defaultScreenSize.width, + showsAllInfo: true, + isInThread: false, + isLast: false, + scrolledId: .constant(nil), + quotedMessage: .constant(nil), + onLongPress: { _ in } ) - messageViewModel.mockOriginalTextShown = false - let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) - .environment(\.channelTranslationLanguage, .spanish) - // Then - assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + XCTAssertTrue(view.isSwipeToReplyPossible) } - func test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot() { - // Given + func test_isSwipeToReplyPossible_whenRepliesDisabled_whenMessageInteractable_shouldBeFalse() { let message = ChatMessage.mock( id: .unique, cid: .unique, text: "Hello", - author: .mock(id: .unique), - translations: [ - .spanish: "Hola" - ] + localState: nil, + isSentByCurrentUser: true ) - let utils = Utils( - dateFormatter: EmptyDateFormatter(), - messageListConfig: .init( - messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: false) - ) + + let view = MessageContainerView( + factory: DefaultViewFactory.shared, + channel: .mockDMChannel(config: .mock(repliesEnabled: false)), + message: message, + width: defaultScreenSize.width, + showsAllInfo: true, + isInThread: false, + isLast: false, + scrolledId: .constant(nil), + quotedMessage: .constant(nil), + onLongPress: { _ in } ) - streamChat = StreamChat(chatClient: chatClient, utils: utils) - // When - let messageViewModel = MessageViewModel_Mock( + XCTAssertFalse(view.isSwipeToReplyPossible) + } + + func test_isSwipeToReplyPossible_whenRepliesEnabled_whenMessageNotInteractable_shouldBeFalse() { + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + type: .ephemeral, + localState: nil, + isSentByCurrentUser: true + ) + + let view = MessageContainerView( + factory: DefaultViewFactory.shared, + channel: .mockDMChannel(config: .mock(repliesEnabled: true)), message: message, - channel: .mock( - cid: .unique, - membership: .mock(id: .unique, language: .spanish) - ) + width: defaultScreenSize.width, + showsAllInfo: true, + isInThread: false, + isLast: false, + scrolledId: .constant(nil), + quotedMessage: .constant(nil), + onLongPress: { _ in } ) - let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) - .environment(\.channelTranslationLanguage, .spanish) - // Then - assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + XCTAssertFalse(view.isSwipeToReplyPossible) } - func testMessageViewContainer( - message: ChatMessage, - channel: ChatChannel? = nil, - messageViewModel: MessageViewModel? = nil - ) -> some View { - let defaultChannel = ChatChannel.mockDMChannel(memberCount: 3) - let channelController = ChatChannelController_Mock.mock() - channelController.channel_mock = channel ?? defaultChannel - let defaultViewModel = MessageViewModel(message: message, channel: channel) - return MessageContainerView( + // MARK: - private + + func testMessageViewContainer(message: ChatMessage) -> some View { + MessageContainerView( factory: DefaultViewFactory.shared, channel: channel ?? defaultChannel, message: message, @@ -480,8 +507,6 @@ class MessageContainerView_Tests: StreamChatTestCase { quotedMessage: .constant(nil), onLongPress: { _ in } ) - .environmentObject(ChatChannelViewModel(channelController: channelController)) - .environmentObject(messageViewModel ?? defaultViewModel) .frame(width: 375, height: 200) } } From 959962e11625940f48c3655925163c72042f9ca5 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 16:34:37 +0100 Subject: [PATCH 35/38] Revert "Fix existing unit tests" This reverts commit bd695bf9a1379f362f82af8d72d504e64c23db2b. # Conflicts: # Sources/StreamChatSwiftUI/ChatChannel/MessageList/MessageListView.swift --- .../ChatChannel/MessageListViewNewMessages_Tests.swift | 5 ----- .../ChatChannel/MessageViewMultiRowReactions_Tests.swift | 7 +------ 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift index 495d1596f..e23398867 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageListViewNewMessages_Tests.swift @@ -5,7 +5,6 @@ import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI -@testable import StreamChatTestTools import StreamSwiftTestHelpers import SwiftUI import XCTest @@ -102,9 +101,6 @@ final class MessageListViewNewMessages_Tests: StreamChatTestCase { channel: ChatChannel ) -> some View { let messages = LazyCachedMapCollection(source: messages, map: { $0 }) - let channelController = ChatChannelController_Mock.mock(client: chatClient) - channelController.channel_mock = channel - channelController.messages_mock = Array(messages) let messageListView = MessageListView( factory: DefaultViewFactory.shared, channel: channel, @@ -121,7 +117,6 @@ final class MessageListViewNewMessages_Tests: StreamChatTestCase { onScrollToBottom: {}, onLongPress: { _ in } ) - .environmentObject(ChatChannelViewModel(channelController: channelController)) return messageListView } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift index d36cda73e..c6211848e 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageViewMultiRowReactions_Tests.swift @@ -5,7 +5,6 @@ import SnapshotTesting @testable import StreamChat @testable import StreamChatSwiftUI -@testable import StreamChatTestTools import StreamSwiftTestHelpers import SwiftUI import XCTest @@ -46,9 +45,7 @@ final class MessageViewMultiRowReactions_Tests: StreamChatTestCase { ] ) let channel = ChatChannel.mockDMChannel() - let channelController = ChatChannelController_Mock.mock(client: chatClient) - channelController.channel_mock = channel - + // When let view = MessageContainerView( factory: viewFactory, @@ -61,8 +58,6 @@ final class MessageViewMultiRowReactions_Tests: StreamChatTestCase { quotedMessage: .constant(nil), onLongPress: { _ in } ) - .environmentObject(ChatChannelViewModel(channelController: channelController)) - .environmentObject(MessageViewModel(message: message, channel: channel)) .applyDefaultSize() // Then From 4d7aa6a91668ff984f13238c4bc16e7a7699290e Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 16:35:54 +0100 Subject: [PATCH 36/38] Revert "Fix message container tests" This reverts commit ab8f75831e8a6abea0ebe6c86bb2d68c3ace2a99. # Conflicts: # StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift --- .../MessageContainerView_Tests.swift | 47 +++++------------- ...isabled_translatedTextShown_snapshot.1.png | Bin 35798 -> 35652 bytes ...onEnabled_originalTextShown_snapshot.1.png | Bin 35112 -> 34898 bytes ...Enabled_translatedTextShown_snapshot.1.png | Bin 41039 -> 41339 bytes 4 files changed, 13 insertions(+), 34 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift index ff66406d8..d6abf532b 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift @@ -124,9 +124,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) - viewModel.mockMessageDateShown = true - let view = testMessageViewContainer(message: message, messageViewModel: viewModel) + let view = testMessageViewContainer(message: message) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -142,9 +140,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) - viewModel.mockMessageDateShown = true - let view = testMessageViewContainer(message: message, messageViewModel: viewModel) + let view = testMessageViewContainer(message: message) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -165,9 +161,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) - viewModel.mockMessageDateShown = true - let view = testMessageViewContainer(message: message, messageViewModel: viewModel) + let view = testMessageViewContainer(message: message) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -271,8 +265,6 @@ class MessageContainerView_Tests: StreamChatTestCase { func test_imageAttachments_failed_snapshot() { // Given - let utils = Utils(dateFormatter: EmptyDateFormatter()) - streamChat = StreamChat(chatClient: chatClient, utils: utils) let message = ChatMessage.mock( id: .unique, cid: .unique, @@ -283,9 +275,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) - viewModel.mockMessageDateShown = true - let view = testMessageViewContainer(message: message, messageViewModel: viewModel) + let view = testMessageViewContainer(message: message) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -303,9 +293,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let viewModel = MessageViewModel_Mock(message: message, channel: .mockDMChannel()) - viewModel.mockMessageDateShown = true - let view = testMessageViewContainer(message: message, messageViewModel: viewModel) + let view = testMessageViewContainer(message: message) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -494,10 +482,14 @@ class MessageContainerView_Tests: StreamChatTestCase { // MARK: - private - func testMessageViewContainer(message: ChatMessage) -> some View { + func testMessageViewContainer( + message: ChatMessage, + channel: ChatChannel? = nil, + messageViewModel: MessageViewModel? = nil + ) -> some View { MessageContainerView( factory: DefaultViewFactory.shared, - channel: channel ?? defaultChannel, + channel: channel ?? .mockDMChannel(), message: message, width: defaultScreenSize.width, showsAllInfo: true, @@ -507,29 +499,16 @@ class MessageContainerView_Tests: StreamChatTestCase { quotedMessage: .constant(nil), onLongPress: { _ in } ) + .environmentObject(ChatChannelViewModel(channelController: ChatChannelController_Mock.mock())) + .environmentObject(messageViewModel ?? MessageViewModel(message: message, channel: channel)) .frame(width: 375, height: 200) } } class MessageViewModel_Mock: MessageViewModel { var mockOriginalTextShown: Bool = false - var mockAuthorAndDateShown: Bool = false - var mockMessageDateShown: Bool = false - var mockTextContent: String? - - override var textContent: String { - mockTextContent ?? super.textContent - } override var originalTextShown: Bool { mockOriginalTextShown } - - override var authorAndDateShown: Bool { - mockAuthorAndDateShown - } - - override var messageDateShown: Bool { - mockMessageDateShown - } } diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot.1.png index e580b6c6b2bb547991c4f478a3cd7b4b4c2373b7..418bef28c3c1f60d23d2268b6324ef3c2bab7980 100644 GIT binary patch literal 35652 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 z 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 WWtZdyD)|cl diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_originalTextShown_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_originalTextShown_snapshot.1.png index 5e6c360f247efe180a49d12f0685abc01a41432b..3bfa6c8906459b5ed5aaa353e360eb762555ab73 100644 GIT binary patch literal 34898 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 E0r!F4e*gdg literal 35112 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 diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot.1.png b/StreamChatSwiftUITests/Tests/ChatChannel/__Snapshots__/MessageContainerView_Tests/test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot.1.png index bde5f3403251a655680d8a1a6dd15b9dea2a6bd3..afbc90ca54000da9f9e6d7acc61c1bfffaa8902c 100644 GIT binary patch literal 41339 zcmeFYbyQW`7e5M!f+zw~(g@Ne4bmVW-7TOXozjg+NsAmnIu2b&x1;<=FlB) zd@1Ls!_V&2;UUSYh<1;^NoghVdNpv(qGz0_$bg5S_l@Sn-jSvu! zG*RyXpL9;^-~$&#du2&cgrXkeRp1|fMw(K_a&idtz&$F$UBt%-cdmy3e-RJ~5$^uJ zM?jE9B>Ho&j7aGGD5G#WPb-f9TjD@&N%62^kfWT=<_G+byJ#B=<1-XMaBV z=jN3tLDWB^{`rjjvxqQl6ryhQzus~EziFYoe+Kezef`w`>_%9sY(5> zGMLb>cm7uopNB}IaSvDW{%__$HR}3b$vz0*Lrjys=b-lZf0glLTl!zggvotBC{o|4 zp}+sX%7_x!|F2~KnfbOw|1$7m3PC1}PeIpjs)Fq~I0^DuZJC*Pg58duH1SNVAfKW1QHS6W+F zS7v>kXcaoFUgLIPUQQD;jD3T{`<#K!sDa3iWJ}_W$+CIPwRHe0f6; zz9)w7x3BTZwRonSp-uFnUr`MyMhVUC>4YgVG$k~*k$+68qK1b2GS0*re_dTN)cu(+ z@OD*OW+n&mI@{sKD7~@YlcxNj#r)AnGqaf6g<$j|T}Y?kQxGnpg+(l^t<8Acyr6G% zY>dt@)_f{U6SuU!KFMH`83M_UjxIN7RYn%vL@Gn=k|27jfUJi#Xh~G6-HVY#`Nt^~ zae+=xO+uQ_ogTB2ycPdMv;1*BL;O?ONdp`PZG-66#m;r4*yOwvo3~h#mU`97lLmNi z(;6OUGvv_<@lc_LJSsV?8RlzLnk!n z4k;zQAGAz*0CG6r#NI1h7zP97(4wtEC+3*9%77I;S}`KMD&-38nMijnq+80XUjXpVJgCnNdT zjwGMFAec920WOb(HQu^u8B2KffU}w4tjA$sSMb*K*;ts+M2X(=Ozck=qVWm}!4ryp zteHgVP>vOCp3;(9J8CZfaP)MNTlpGuCHjM6mc|!o2mLpg=G1cmc8vndPZJ92L}z|H zsQaSi*1jPEpA3d%C($Y=HO1#|Yy^No7Qo!~imDRoJ_l_9^|1kvDf7n>g5fOvkC5u| zMknh^&RViuENfhcE#5BPSa(GTSoNzg*Fra9_x9IMo-kXp2I<5SBljqiTbl*bxVGlS z{b);OKaA&|m7GRE&`ZPDouqBC^BuWkbDcZKEoJqB=Dg6wO;vkGb>xrMCiHL~ zGlD-B@hN$LY6KM&9Uq~4lArJiSG|yE%D*HmcyCs?Z(QPJ$SOZwW z*R0DXxTE9a@?y>NtxPfu3|xENFP_jV6dUAM|JZ+Lm=f2P@~@{Hn8-n^@z9{^yG52( znKEIX{LGIY(VVp}kfI;JaZR__*;xsGguXL|gw5PyDpnYQr!42A9^Y?4i?i_QdKG-Z zPmBzu#!QfJFO)5Ak9?D52?h(?EEklH97MNVWjaLaGb%=Htrd*Rh7>38+>0sc``myu zR#yx4;J?HorUF7)`scFNU4vE;%QYf}>i3<>!)c1Hu}IxIah8`8R9|5?#Lj*(VBrXq zMl@X;!9zErp{xeACoEQV)XzBqr}(O6UXb|yR&f(fjRJ;8g&vhY;5b_Os=qzDzTumO z*#7tvuAU*bN-G)!-JP7Iv!~-m{8K4mT9^V@H?5&_ZlCe3<>=7_R-^5Euu#KydBf-*nX|=h_~XT8o1Ggwh`LIIJ_li877Fj;ahPL_ z6*>I=qypg}z%!``AIeozKfma{;IZ7WkQfw6btRexDga3h7~@7J)O|%jC^1>_Bt7zv zUu|9!OS6~mWwXfMN0uh<^Y}RWJu?!gl7sigN|@w*IG9ils`D=9zA6hk^srF;N~X;X zj!Rq2oS^SZOVJdTiHY&KQV|ZfQj?D!K&`o@<%A}qa@g!?>efz1?c#{0$|3=!Nc?%} zv?lt}zak45-Q}x{+5$71I}9)0$yF|sq(t4<{xwcaCP!%)RnM&LdP@aWRbg6{exH1u z(u90eF2aZ=C(NAu??CM-);2bBEG*I;WVvP2@TY)N+>24^l^|Egd`(O&g&lP`!9(;m zGe(@8>w<)kl;u#KUM8XJw)h@ETJktFzs&l6-lSaY_MM(UC7ld;u77mLub9)F=AhYj zo$@B^#P0gB1@0bi7u=l-lJSj|*rc)_?t`*~2^Yi!@d}w=WekJ{1>CsOPryq%s36m# zFwcd|zHK1XdEm0j zh=ug75HF`Y^Fi*7?;`l@-UqT4H?=1$-33W*sPXf(T_@A(`v~{RhLO2BgWk67%QN_l zhSQ+qh_3TN!MPsJGZ1g}+`?eF&R2Q8j|{gGOil?9qEN8LY=sR+@(XMQU2Sc>LR%JP zw|SzOs#?*EYVCJ#)12KGCf(unOpD&<^JFa1af(X|&Bc>nuXen@&EhpgQP$k>!NUH) z%HopN(Q|vgH>*Bob2GBYhfV>}AfZ5Oze`tFU$1*k)YjV?L)!LIK#frWvyNHpr}Ujd_g0PCs*HU+)n zwHh?<0j06OS{}MyAHXVH^&o^sR( zmbCERw9uD{Wl6F2mw+TUa0m(}le+x!aac}r&f?puqV$}7p#N$|kEE#7P+q9PvM6t{+5kT(f{viW_3loOi%ipF+!Z1ua*5LuyPU!kw0JD(&o z){AP379B4RMzZl6w*6O|{2xdjp8UF>ecwp%sJb^3zwX!FRTQsZDB9zLmdn^F$1VG{ zjc2v1Dk-OfKk_X0oGm>B1X*}?h1SKNU6kyF7dpmWEyK@g#ROcf{9eJR{(1OCk z%$dv08Tpyh!kKZ_ZPR;X-6>e(lP>dNW^OfSAAUVc>+0)MbUQ3fnR2X+-#lB?zg)z5 zsxlRR9ozgblq#)PF>cKw2_(gEgx&Y>yUY(CW>=rIPU9!0wUh*~QBqQ_(s<3$gp;^& zG)K?~oph|q=$|TUq_?9RZ8ct9?t9K0dD2)eGw0GJBwUA1NZkZ2>YyZ$ zLQ{$hUMf^nLafYd%IcJZ4oQc8vIVd;H#e`kHy*i91d#4rvYa=u;8Z@mxP)JMxeb>l zM^k(-3t)Bk7F=SDkUE-jo>4+xFD84-kqL@TIvdYB8_UqyiuCH^t?Lhl_veK!=b1(X7U>kEig~x+ zw!asR(?8ABH_xRk^4|V|GNF!T<=*Q)4ddc*n>m{vIgF=o;AQ7aF(}o)jb<-^OtuQy z>6xA=FF&9Fjg9i0hj<+ZIE{TM@n^GfpP0}VjX>4O%E}7gP}&fIG55K4$mrRvlure) z72|hNlAZkY+&nwbzd9&NF2Yd=a@z-!)x*bAPU2E{%XHOFZJn&sjvI576Uw7+MJ5b@ zZ1Ofaeuk)wkODk?!ODt?@b_x23Rd{gNsqnm)s)NC6t`Wsoe=#xmQMgapHmv%4By<` z+!vVH6FBSfZo*FfY;00Hqspt^dj2!w{AUB30r*!lbcGA#dUZCFlDwZmv)SOa66m#} z>E3*PotGP&#J{V=>U{NM+cYjax~T+%`hZVdu`;V+;N!)HC>jIsM0N9pnc=uUoBNRw zZ^#UvKikgF72gB#vvBuGud_|2#YrGllZ32tfmStzW6366my?(_35kg}cGv7us6li` z$EGBIJld!9F#y-23+yJ)T2x{U6yj=#jnItrwm;%;JYXU{s%p=SDtZ+x=X`XJ|Gkb% z_I#aaoJ;!PG*>J9XwqIG+gNSQGfg%#K*sPUaqi0kScYBtt|O(bl^872TE4J_7kFn; z7A^KUMlI@5Lr z1v&F?TrmXp6(@EdRqVL-y6a8s$)9B@E|q;Ox}CZ#f%lh$z3QG|XXT9w2xzx}bpkJM zY7*@|b%xg;RrpbEipHg-rN!(S*nEv5#rjVC&`9uNRiTn;t1PYS_}JwXa&-#X?{RKm zuU}JxNVB;0hYakcT%F_04zs76bnOpj3vym;V_ey~4T4FB2B;Z~#vcW7-n)i}^ZQ-RFzrzf3fJZYSg6A~=$3r`<49F;S{pQXueVA#XtxHHKv z`pK+vm)|^b7@cvvZ&Wlj%sn|gl5jhv0G))&Ofi#D?=`#dYF;fC%$U|?RXH{M*!p#q z?QBcejzfX(+n+?!+W{4eBs8F)cBjTAPKeaZNz%-i^5u`ynv+`Qw64Lf*MwE7DHEsT z@;ElPHbwg=$U$aLciObjTIl06nN)ti-b8ROF6Q&R4+<#{>mGm>WL)81N3|0%&WVak zm0s(W+E9Tf4IU%To*Ff?0Yt%S9K9}W>;qxk(_fR%CYQ5jj>Be5t1Ez67X~eBI5>v? zPbvjSw84&B9Ox#TzDNMpB6#w|^giQO-Cj?WLvGa)(af=gj4Mz*XvSkktZ4VfM;a{So$_NNA|hH1Qt+5-U?V#l zZO=M`H#S8VM z$d88qt^NvD<$2=1ODlt3F{D7V|8XTpIbRJ>DbHsy;0!F*T5fRnnTevRaJc8iy1oq^ zn7NWgmzY={#=b{#wsq$gu;)&@Pa?m$ zJ_gX~;l|;i(`iS_c}EPw{B^}X1!_i0xZzba#Dhv;U8~o;dMkj)`jw1KAlwl!C2VU| z1}m>_%Ml`@qoZRrf%~-oI>h&xW_FpFHqDD_a+{^&Ty_UWk5zT<+zx0(8^9y$+bbRF zYx_`*jE&d#Kyg5&W&Ndpxf=@ulU=M-h)DRcdmjgSe>Iq&GCg~sf84ZRDs)!LL4+IU)=en%1fJiVXAoq3H0UybN{Us#io z?tN{~i16Gnto0tD0*#sbnR1;7*ah?Y{D~7`D**DBlZ@Lr$Ekz&OtO=XJ@`RZE11w z81W0CTe)|I6400o-HD*ajR~YhE2iQ$5WrRhGIO#tFrc{DSGaPJ`TSm0cn_4#Pvv=# zuWyBCztC$f7DsDpWyMtP9;}?rC2+YDp#XOqsSV~DWCg_~#uuk_MY4C@zj4+z2EcjX zqcJ5W@AKO>5*4#1e(#_BEZrQ^sJtrz1ADS9)N*5Re>G;jvmu=?_$A)rr z)?XY>z^tI5MvozQ{HA8JVqzd+=6uNjdrHTqp3@URF|r{cAT{x9e^%t8q zEL<01G)w~fePSfsR{}1c(N}u9^{*#u%4&u$C_D2f^{sAKP&J_Bo6jY&1EfUa)1q_+ zs^_e(o5Pug%(8i^WSlX7781dy`MNDXJ1%PnYA&fSebE=BiLiE0{U=YPVVrJ{wWv@; z!8dF34i7juMEb!iUyl}MLs`_gi3}v0A^}G;m`d#UiOWqQ1-frkqf?^{nE{0~S*d%X z>?QYG?ll5kKWyb#wSp_>>n#cFfT2*5}4ntEDH>Kz4Rzbbt{SKiFN z9|06)@3tBo0bD4^;0XsslyJcp0zy&+G0OQk?NsesxdHkN=(k~}`yx7iY@W}5){H8> zF*D25q$(|`8QvkjT~GRi0L3o})|K~FX;p&X_I-MY#1}@xjLvcRg@7QTOR@I$DI!`h zAVDZtd7kUOkvV@=jZ@C|$#VmMKk)RN@7wcu^@p|yc{x9v8Ch0eZ@*G4cI!Kt{#&LASW11sy!dG56Yyq=v#T_gzE;Ogtw zz4<5@m3eg5t&*yU2Lzm!M7qNGQ_yOZ&v5sgdghO`eg`vC#?~l+gS`R2m^`!qO+-5f zXU7E`iw@ExLxFkrGZcVG5AHOZ85)*8D;#)udl{&KWtjLhSSJAVq8Q({aFJAC_N`Vj zGBOM=Z@rbgPYLkX$Tk#{YZmH(no*3@8*8s()OW_qc+f#ctEV^EGu02!=J6xxq=aXn z+`W~xiMav0-$re^O_hC*1V&K?CHBbxnz3+3t5N&-w*p)$08WAhjQ*{WG(aYTKKHuQ z1APr$c9S&4^Tuzg1)t--CSv^ry_4m*v8gaFV0pDCnS|v^v?|~qgFu@X7hheG3tv!0 zW>fr^KJ|c~xHFg>0!Qj#cV3EvMBli((}Z!6x?9P|8t`y@{Nw(@RKO}l6IZNpjpL85 zg(t-bF@9?(j$}p;`)yKJ*MnJ%bBP$69wwZ(U9CT`Dj60D?v>v_&YVm@*O+GQY5Ds`P(Cj03Vm{GHGoo* z@)ZM%le2RQBpBHLtAj*#yKW()Gwf=BR>z@rAtMy2`#Ck&ZrI5S{ugiIUqk29%x`?i z5lA_Mt`0Jz+-b7+QN*Lrdu@mz zbyMuuh#kTzjxWZ>%dlt$oeT7gqg&ySm=CamudCIlfuoQ;GUP~KyBRbF05Tb?DwK=V z#PjVN7w%64W|PS{vt4eK8UNzR$pe8Sih*uqBXpqE`5*ANBb2sd)6?<^2^zuCEDQ`5 zW^dnDqw2TOWW)M?9ycIRlNymQ7|!(%zpwq0O?zPb97p`dC%y*(K17pcKP!by0U|If z(EP;Gu6JSboV`{NndW_dpF^GT(tv7R*7Cr+`AArl3VZ7%^E@`p%+i3qbu9*fuuo<9 z(anAhtTcS1T7pfFyqVvtq9)ZB0OA1oxwX`b4(~jRTSn%=Kuqg$rOh|gcmu~bZG>as zoc@?^`mTtT*JAZ@Cm5G;Cs;t2!WP&DmAl?H?b~+Qpny`3d{29x}5` zCxiIP<4Q8|?Z^2h{|d;QFMvNugEI?n8TvX|30nctS56>Jaw{ABwm}|{>vIQ8&2AXs zzr0`Zn&h<#P?o$U`*o7=p$8T`k3)N0`o@I6y&hyNK)c zFdl(#)xwKRXbyt^#5aOZG8(YW0?qwqjT{pbGob4{H3S#d`qP3we|I?S?FABanheHnurbkX8zB*z#(!^RF2f7??6k`I>oZ`-U2p0u3ZbO8xaH4 zS$*!$mc3`s`KMs`cmbGke?CVewO2H5j|`w=SG)dS4WU6d5uuE$|(|b!B zn`{=(RT(<2h_HI;%O#u3tmBL40adzdo%)w{r!6#sk(U5L$XS2gEM51aFs91MFV?l2 z6%MNdna#{I7X`ZRbIqm`-j~bXS(SB*Osh74T|!cJj!cBk#>%RztKB^-8yOiHaXjk) zupYuC;SQck0lFTTFNWY(E-tQc#hs z3ht*hIl?(b=2zOPoyN=m;)abofSjG_J4@ZOU9`}CloA#{|+SM4(Z<#udGrr>Js?3I0_ z2Q=B)nVFg4@+e|)D5Nf_>$?$X#s=cu?f`WhvrCbBa@~Pez-K&g>B8USxP zFf7*D+)F zb>;2u>dJt49ptw%vAQ=VUhN58?fpo1x|$|}wzy(_t((Jz&|2#T3$~eu=H}+ksekol za7({TN=lk4d30HFgf-BgT%~K~;lXcZWrbV0)&egMHilb?umHriGXIylss7*E1qB6h z@bkZ}n?C7r-a2hBlk$}uA3*R9q|(hwXc$R#m2{%U{J1#tl_TF?_kkp zu*Zm0k7_jcz|N2SXvX_0((@C`oO@$cd+dhOQ{mFo(W}gpyZl}f2z^_l*V?jppLD{$ ze;2M*2|-wT)A#t%X1Hb&_N-_rIzR8lOTfo`lcDB%9y8x1e~8M{j;Rz`_}uL;)fh{Fs1 z(Pa6vbPg76Ev+&9N3B^+o8hBXPBymBd3ndS%BGGCSfY)uaT`z=;9DneN30ni-BW`VFpUj7d zgo1oYhJbK&rHetaf`A~5aQy|Mjj8)pxI;;B&za?hN_f5J-XSc>VTpJ3SyD!nymP?T z*Nn{!K3^rU67f8L#QRY8PvlXkIph?anf!N$gqqRR!+yCjaS>7NY&Q?+jDj) ztE0t+QYmIDB1wGCJxLZ#e)n^`Th3rby0wFbU-(j7=7L_=dYt79-#I4jjAVIjapFFA}(IM${CdA`$y#2ZsSQ?w%&6Q={ zTBk99`;Ot;DsCq&1w2^jU{u-J7z=3caZWYlY1!=-eomIpyl*F|aE4F!$^IB2U^iY6 z9I0_!zY{(Lmqoo}(|F-DQEJkQ*q*WJve(URp8{LHZ!`cJ4MadfCI9gEFDXRPxC~UG z5kFxn(KxMAW3_W_!Sih~SWXhacui@SnMS%}vQUBI_+9O!F5=jXq>HB9x2kF2CT{yH zk$mzZ!hw%SEGMhpqmy!~+nEMWCt$yJNl=D1Dyv2Cma#Bjp&AC@4eIUp2%$hJwaZmXqC?os&h=x(+ud3T0xMs}1Kp2T)1w-l+)y;-&Ig zpi7^U<*71NnCLR}z7YU|8r((--Bq9(ldonNUWeGc@AbMkZJnV%_2hp>38I6xBHmaB zmHZcyAKN+MV1}@YKO3ZOSGpbxqa*OxLx@|P7EF}=MxtB^=heb`LKd&UkV&j*N>%;yqNyyHsF*c2S!I54u*_=uWs!_1nj^M4eKz;Q= zF<{0w9w*0%7Q9L`-yR|KOGMu%KqB81$8W7-A3ie^fKG%bhaD`mz^z7$ZJoT<(UrtE z;&!xU#iUcg|LcXQzGUc=w>86Mg_^Wc(Ml^aylGv)CaW%-Pz{m|f&j%?Tw-?AYNFz| zG)`(0*@<#i_e@0N>=tQP)lbU{3 zqFlb`UBmx}Ip;72(R5S`Dn_%k*=L{Di_b#S4`NY|{+o?IDIVSwXr(%70uPSXSZJKyO*}Mh3VuEL#EMETBzM_gJUyXNeb$ zLyF88jz_C^AgYnH()^R#{!0#;bxx(en@0dObxc3La{!ze2#N1X;D$__t?$Kx5({@ex-G;jEOL;P$XgBA166jA65<3N zllB5>UI-IPp%OK)_}wIsz+>}3wjE4iPo-B%rZVA-uAAi}k9g`7X`?cgR(|^3$F|F= zobjsN94)4-i$2XuZ`(l-Z)Er93d`zO&E6&`)Q+xbwYa;gIfgr~ipf((pm*O0Eog`I zwlgCGnT7m^h1`8WhJOEc3((3Bx23K)ltJD8PpC{NNfk9pi=}pc(s`*Qft`L@nuj}9~ABkMkan%Mnu-=@E54X+qu;a$O51O;C-L&BlUmC%^lEh{&iy z!vVtOVgzAcQUOfbXzsth`(znqaJo?l#!Fz#?_l8q5rBiqzy1AAH6}SSD!pIjT8fC6>Lqn)ZR+*3rG4& zJTg168_MaY*WUT|jAzx}zv4J2X`5gy7xUX|PH9R156$j`a^OhrSs)%oYw7}p=kE># zM{_p}?P}-v3xY-r!zKQzDL&db!1_){V+cK;*o09#)f*ia;fr}%<&F)VlSeTll=mqDjy}ur(rxa0|?B~v_JgOx%eyzq@^f7Ar#3zN8nSB^omlkVgu*@ei2RvwyA?dGGMZNN+`mFul)$rLK%zr1_rrT2ldj2C50tlTMy2%ACcK|-(@Nm7Quf8+ z4J8wr2GCXgg5-nCf{)OST&t(4{jV|s=Ux<4pp63m^xPZPv5CtXH-osp@;6 z8V19@2xLv8yi$8bOnszlMpM0{EabOy3w!xAvw)OncN_48pVg$R9_xm0JCDkHT zvb8of^7(13VIiYx!LiNGa4=b9c|WjOY?DW#V*WKf@KvEirhArJ*>ItbMx^)9$jJyq zpKJ(6Sy3gIsw(6GS)!!rvry6JLnlE(!pmoRut5$gMM^U?EB@zr1G$s#XtuZu=4d7j z?lF@PvyU}_9pf_5>uS0(+5${o*8XDXB(6h!4MU=2gyTmBDf2c3Uoqi-dxfh{GYx2L z6Jy8*a`5@x<)!VrtUxN#ucjF?4R5HdymQlJ$4wlWlk7`VbP&T%(*<*FEP*2M{V91W zxg1P-4x=a2>uS3h1D|oL>yF`JBRLumhxWHY_ZWV8$3$s#B_cacG|v}K8(-H`%)Qjy z^Zfh@OjFB#PM?Mq-Mn3wND0kCF-!$9_kLokee@~9_?Pm*$&9+rPc zr~eau;c$g7puM z=H5yb!x?a)Exq6de?jy8(90U2r6L0+K!T~>cC0nK(v!4-RR8moC9 zR=G^OvoDnIRKZf69rzPCeb2IA&=t_Bx94fr*6Dj9Ubf}g^blbEhQT~7q694OY79dZ zFm~TiYS>nGtx5qoaPy2&G|rYZEcyQ307vv1ygdtp-?Jk59OvA})nG0^442S1eJO|P zKe?fO!ydH6Qj-a|IcU{~ zLG&__ewc}SyS`xzDO>Ob&@~AYD~TxU-FFieRtzV5v%uIrz$3M%n=T2~LuWEXBCkxb$&Ssr5 z&$=9xvL>k01BbB6C;F^T_g4?b<9T5ZCYHw>yqh>p9oenu(-~@MQalD!J0&Qc_B}md z2LZii<<-jEa?wOD9C8lUhB{w3uHg(d_xEZK@Cgp(f!sCB$p(s)E`|;S_qy1X$T$vU zz+L;LbvR$5OE)L0*|n{#fo80KcTu;-At(k-!;{7zyf`@Bam1}I@BIgFLa}*r#NtM{ zm=2X#?GGWwsXWcME5&BxqfeFTCYRc3KpE_@wu&UllbpP#ytr5@Ol2!aE* z3=-6n(b_Hiq>3{$Q64_|%;(jYD$*Lya_n_=d0}rg1+-MIklZ(vXETE(`V@gQC^{9F{PFc()wjLV-?vYDBaxQ$vA3*uabl!Mm(Lw& z^#-iPt@U?p7?1AF{G+8Y5{f=;se5h26W9K&>LX;bagV$R#KWh%Ps?)JEK~y6h>XV% zx+BV-UO*18L)Jbnrn8DztU>~*2y-6` zf{m(yh6_uMVZbCRO(hqsy6}ZqJiUTbSE}(r{2{oXHQpS5D>@igXr~3cx4~-ovXpi3q(i}Bhn{%sfpewH&fJ}t91Suw ztDQzxe~WAVuPglL`tLt*p>;=DfmnhgUY(2<6FWTmtFzk=jEeSvV*n}nU3z<0w$lq> zzjsXmzypIHK1leMSx?nWH>YPI9&Ao<=eefQ$%l>2VT8^iHYi@;4qc$OuR3mw7P~5> z6!@ppiJXvr!u|D-h^s(v!VG50fli;Ok1=~vas2a(ZQaKdkA#m=wuz(*M5R=B(w_Tg zvszKFKQJ>_9>>Elau7gcTKF)0rzboXhSvrMgSBGk@SoB}P!5 z-5BTrPTfC?*|69Cn%xLKMr93qMvv3A>dfM$>#sf(d=-WTZSfX6CjH%(`fMOSN>*H& zk~3bf`#O8?N}DfC(bzWv^NYXiyXL=i{Jsl({Y~I`8`-@B^4xK}`L?i-OYz3Zk6Ak? z66N_#SwQ((So7iB7r~e^OOU8;X?_+q{_|*?^vc7dCQL%;nHWu&D(bSl{EwhYFqZfW z`MbfmNPfKw375Fuwk*b&LJH$YXyr{O`|ig{_?zLO?e!E5Jbj%@LHQ)1gZX zEux%8@s#)>lO_jN|3Ya&PXb*a;>0=4^je2Mn~W+`>%z%*}v624VNU5O0W=dkB%>G>| zKYm#AHY0?7GOL-`unBu?K2wE`^qE!b2QSFYVY<1T5u@#EamS;+ZKc-{~ zY#-cai6+~0a_}qJ#zC=q`4b8=p&F>7HKLz0x+eNDv@4#I!CAMaL0J-kDqByD4WuL& zt6XuspDR6h+|N5d`!0=~<&s;1Rs}jW_jkWc$f5{K3%#7TJ^0emu-jKa`>A6n{3+;! z7BohtJeCz#VL3Y*e1YOP?_F++h=?4oEbP-|7$Kkz|DlSJO>ayXL)KH`O=y;`gh(j& zh0%aW^uuw!M4oAMhA5>f;Mf32a+aDJ$@y^Xy6|Ok4i-2#Qg-^hqj$yRfK%_8#$AJ` z1kr5U%Xd~dB>8UCvz~GmN=lR4rRw6+)`ZG&B*2{y>u>8DInm_68OC#x*`_3|Q2=y~2} z8#*039NBT47#CaREwOKC?EwwhL(XwrR@z$^WmuFodY*b<7ttp;5)QzrNwU!aI71 z;p#SYN4wz{n9%e^Wz*ve8ISWH{QF9jcLyq5XjRr4=O940cJv|t5C-hQh`CgY1e&}1 zd1cG}=r4=g_F~(PY$iEd56pRDH_B1}%!8UYPl{5y$vs+=j*fIUN4Icea8#}>Ey7Lh z$6^_i7km%*j{MncI)G8?*cN^IQu|DcIVj1gVWGiAQJoRg5C7~X$uVdC{R5(sE`?ka zTBF9!8D;~^LjUK+;&)dk1izOV5gCe|)2&ENzqVek?C~;GG@w{4enKhxqCAYqO;UH| z`>QzGP*$?1>=`o$hn+AX<6fb4u@hYF4p~QI+Dn~jeI!Xr+fVmRRi#}}Wg5&?CG3zT zRCF8E!-7zV*7CC=OsTRLhCidUDFesbc|JpEtx8yCmycgP5kSqh+W8<1i)zAy>+rwn z7jvpIiK3Q63zUQ;y>NuqA6;`??vSTKEoZ6rz^+Qk)9%5uP;)f@%XLnxyH7pIxAayO zC4RhI5ldTaU3c`j!r1wh|Ao>>y1q?WjDQJT*tlq$l-ckYnla^g`1E%j>T^IU$A@n0 zduOWTq(YwSb~Fbn`P!5k_FnkO5sh)789!R4Dn>Dt+F;tVYWbe9S+yr<)Ej0E_X)+g zc%=73AqFUDwwh?q9>lbfjjFyX8|J!T@UDw612dGM8L6gFC-TkECVA-X#51B10PDSy zfwKC|%qYor8i;M~jd1g!GBX&pn?kv8Qx+yQaf%I9uB~M*1lTAtE|M$PH67blo(K&@ zGiTRlonr)4pd&2+m{MKy5%Bz6N@1&_M0x1k-GXLE`mVvBgoUJ8ZpwL58FcpAn~cO@ z4d9r)7YWakzaqEmt~mqfSGoDw|2!d!O*4By0+{__Fru zQpIyI?IIu3f4;=)pr4j$g2d{`!TPY@A+Mm9VEiaodW2hujgVxoAW*g4{13bo`*x{>V zr6xrwgvDPVF7`2LvgZv84?0D?=ONm|{CZz&@Wcr2#>^f`LGt3j6#f2L&y-iVy<$)P zF23WBbCML7ngvLik9SjaIPOZS#40y%^#*;6oA13UOL7|1D3m-Z^%(3T#xTxuN0^-r z4aDpJgjH{zGLHIGJX5dqkdP&8X6dV?guN(udqjMk}l)jET4`KQ#~%p0;EsW)zM_snLP~ z^6Ilr&z(Brd9dYf*v~$k!f)vcsBbs~7!p+|3BKs?f4C2}n9F~uW)QE$W8$G@d0@6V zUOrn`qF-q}6<@1f9<4qJd@It3Hj20qY*3kLX@`C!4k>>EZHaxUG5Q$oC4NnV%hWRo zD9)ETfxj5mJQhWE;EPyFx&`ZZvbD3BX%??)j-IWLA2{&M2Sdg%!ugt*YqnB0er%bH z8%Df-7eBzhkh^X<`a#F?yic9WyUDZS#2?Yor}YH}2adU^YM9=Li_c_007o>M(Xh*A ztV_y%{fO__^Tw3!gMJpnz>0l~>alxA^*yIT@1qagj*-^4M%>nn^efLsee*uUtg14&KGT;NlC_G79u%quNQ z%{h#1ZBCjQJc)VQM5R|?Lblmbi{S#^Uxqv6G>rHpXp`myTcTi!N2Uco!{4DlDSSQH z7cWL=hEpU1@oxe%ip3od%&r9%NrB&>Sxr>hK=4ae?aT21+Pk0%663*AK_!`n1;xRh z_x#*sxkT`}m8@r$XRZ?$|$Z=7fBJt8641)ZKW6I$Mv0ZFclLYn!9jg<*Hq(&pt zhj6D3{ma&#no~ZfL$#T*(yMbhzQq9+tx}l=)8*qM3;~x40q(r|`rX$G6ZMlSoMT14` z^f8Om=H``k<)ka9e9Ja8$#&Lc1DfDvs=FnW`3dGF$sJu7`rEJt$X_V2@mTa;59fa2 zv@N4owCkh?NePzaHOK*F*G)66|H)22EwC}j#iu zw>cjoa~S0UZB;dj#1P%}{)6<3D0L#`ZA?-wopST&8V5)9w9pp>5Rr5*+BdXiW`3e8 z5WSG0bfw}6+q$f$tAq#kX;f9Xp?5A z-)laoQoL9W`kPigwd z)HxW1kqYN@=+hGngG2gHJFBlE_W5UuYEIhqz8=BBZqMt8wMwt6Gr|294T^#06jIXi4EqK%%5g~G ziOX9xPx*42feN4+`b)>-;gC8F(FhdKtUH=&N5r^4QFb|z~R9XS; z#7IgXOFbT8WE7-O`Ov~a`JDe$?=7sv=;X>fFpDNPMt;{GmVI``!cbyF0$te$Hed_6 znV83Vk9%t(&`{?oQ_Yz`{hSA@unIqIGf+Nzm(Yt z2yEOYj9D8p1w~RyN`S>w$*6D|(c4$mRP4Wqy!z0|2I}Xt8-4Ac~8fj4~Ku)m9sS;BnR_yfT(InT=At}39JHHdB3!W1Ov%J0MvhA zJzmx^UTLEbccz>SJkIy>F2jPpe0WawmnF@WQ&&afHWNG-B$DYwpZfhgT0?CAcF8@) ztA{$`5w~$KkoaJH1VjT@;P7AJ)p>CdN&ANP@?)>tt39y<-b2!fY&vlr{cqQMQSwO& zToZ@s3eNEcu$1}<=EfcU&5V%7g>q~8(xFl^2vPL^)!uu@v)R6J|6Mw`TOCGGqE)+S z6|EIY(P1aJ%~V@^wf0sm)mo{&1+iCZ*GRM!rS=L^tF{P&7zy!QdiUPn-|ye&`Q!el zue{ol>pZXPJjUmEAIFu!e_tylQB=9H9}n4eg4m5G@@F6UIOR>&8RiO5s6E(CC7SZy zmh~<5Y5nd;llZl?(Vk_u!IHlF z5?w0IMvD~n4-+>BTXGqH*Zu z!-hzj4HVh)eK0oeja=c?dU|mQf$C&Cq)0|Hn>%Sh4=)>S?W~aA!w^%G{QB6T7^$uF z{&0?dnD35RpJPvAjhJP3+PsdO$gl4?4LE9aQF@SBsEs)wjA!fEGhAAj+s+L(Ab4?8 zvKB;Z^jJ%>7aj@-7f^CWqy!!rEw9bREEzJ{1BXdaj&l~QFZU3nBnuovWE&%m7YO60<3KV zL;-_NYw&7ob%96ehFeNs253H;3m7)Wn>lffdlp z4R#T1a!fYO40nyXY8XRUSv8}{l116mq({puo{4+A)BD(P+fBKpbPhlx-;*1X@a!4W z##zlj2Qylad~pRUEv|1;X<-SOH!7?$dPIHctuaixPC?#0EY@vl=-i%QX>6xXMEBFfT8te}1=ZxaLZAT$P*;{u+7Xp=ZO}sz zJZCKx{I~lBePFf$DO5LElU#%Sq@oC|-=)?U^07w-=*?U)v&aWBUo2H~CqBJC5^2ut z_bEH{LxFwt1I5Ph$A~_@ORzjEf975E>d4B-4%QcE5+&`Q9An-4UYFx85Q%Ca6*!0S9P=h(MA!GPMO&rlSr?F;+1=Ulm%-l^ z?}U$-7N`NB!bqLS2Ccs~O*t)8=CbX%9rg&s=z&4Y{a=FezRL=X17yN&VM?Y@^r zMu>%_WH8bvf{nym!)5nxN?7coW9WRGMVvMA>#VA~Zaite3nS~bt%5!u5Ih9>6$e~p z(W4b;v{v9n3JK4AS{A#O&gzqasL+11SOfL!Yhz09@=UqWsKOpoV)fRd$ml%A`E;vY zZ{~f;5E33cH>Rt0>~yPMe3oD9KxrXdj_U4gt7rq7pHvk5YI*9B(0;yz3k-Tw#UGOA zVzfrm-}9SIu*fj` z{aZ%kHu_dY0y>NPV>*>?O={bDN{;_ zvRg2Y#ZRH|UB0<>s}|40lW6eyY@4c^OCQ$d?8>|YdDS2S{6;+|SrLO`pYWL7tq3N$r^r|ON9PLs2cam4;ltP%Ys6N)t zZ>dKOAF9q#3O8-81_v+2l2;L)rJvPlxQI^XT5j@<_(sVMRNY9q*am>zrQkqg^e6$b zLK`8A>97%1FZok;uk~ooI@A%B6*8!BE1y&Vs~n@|+wBQQpD*Qup7PO33Y4I^U3#)5 z2c2KpHBu3Hw6$DQxgOs7vV*wkViFh*7$!~J5!yz^i-K1*=$dV6w>HlF)E&=o`!5EH z){Yg^-4Z*`Ep(RO4H3jC9T!%yj@qeI+u*!PtI=l1WkT)!Z9NosQk%fTCV<_2llNmo)Et`(KNp3W=1c< zUWSAn>k;jvjrtA%{yw#?gryX>u~x5yR&f1l108o2>{>iOceK`O_BriVyryQPgv%X@ zc%r~~>@Q{qaEU|Sw`q^>KuMF~50~>>RH2&YnckiRo_XXHm@ORm&b04REoLXe#CEH$ zS#5!MPB@AAmr^=!7jDL0pC^;=n+NQOJ>vMet*Z6nop589b$UXF-fJ(f)2AW3={+i| z<<*pnHhq&9>4VMngrg&n%Ws#}7^^yxZmB#}!e7>dI5afc0yTF>3Mmy6x&Jbc`{9(5 zD@k9iqNlXau+sMJ;vw778gYYI13|lhN>ctKWz)Od5^DIjRYeiZWM=FGK&Mqi!W44T z_#cX(HzKVJ;eVu({MSbY626%GLMw+SGt%GeA}zUrl_?1gFE zcb~!Mw6ahy6-Z3Kg&L?E-4hIH)l{3))9UmFYEY_m;E3h0Y(XHP<7bu39B1=EX^Bbc zeQ*nmtqThhT|^aYv@k6=$t`Q_Sj6V?%#OHkCR-QS(@eu zjVOKQGLPH)^`#|rlSqh^)TB?EA0_|^boHgrY1I`3in zN)2z4$?CX!y^7lVCQv401_Lfz17WflDkU;4uDx%?5v|@+i1O7TKhG-CO`<7c&j1U+h6IOq~Mp;q1~9#Q6n|M^W-f!2L1!_uyu#lwMJ)@^agFAdXm3WEbhfds#!0=X$> zo!?#QNm~3yieqidJ?ogRHko#$_?awg#E)|9&muoyycy2ts`HgK=C~9V$X_0N`ftjdT{(wq9>#+yN6}+8?ClLMWKz1 z?H6YC&y+&)%`96D8RFgIdZ2Tll@jqFNYq1v!HY{$J3G4O4$;aq(Xsh=*YsQP`(vH! zuQial8~s^lrQFYbQvqSR?QM5Jl_H6*&;|w``dbq9x4)>MygN9Sd}G5nyp#6UHsAw7 zX2!YZ55@97AN{2$mjSb;mY~g9)_jx&#zVOayKLRFp;AZ~ZBYt*JMQgr*Q)OwgVc`p zP~7;oBHNAC>}KYhXUtpmM%hM@JVOB9UT$P{@)8u4*-yR>&=BVUO;Q(4dVCdWB z$MP?<+3HUqHO--}3=d8+d0%a7Ws8vci1 z)|uf?Rk$v7>Nxmu^S%qtulUwuWk@2!p!>bG*@8yfuV1@{1_KqBiuBO-ff^#gx>nkc zE|4>)#1*n}2=CVAu93C`xJrv96s}xn6MO2t#V6XS0>u?OL==^vYgSXl?c;P zQ&0#yVo;f%;_Ps6oCE=#lQ~6b;}F7?Wwh3f&&sC1(rS(Tsv9T({r-giV_4;oeW2ZHLEmnm< ztm*X>*u~H6kyn{6kK=bV=ayGTor z0OE{|40rbnBLf982=BGld8vvTDE~o0eoxR0VvN}KIQ35!{|xNMCc2VO(u-V8GRvKq zZ2HKHD*5U_Hl5^GHBp(R7F!Ip#(B4z^p#>+XU@~#l!<2{ZgjZzTkU`4IqkqsBLkGJ zpZeY2hxDusj)G)bnB=g1l^&mreT3q7Utql?J38yu*anxriwtL)7VX~bD{6UVfjhg z;cch7_a!gi03cWPnTK{QuL2&AW32(15PBWCU=^sqonR9kSzO-@a2NN2w*G8MIxC-c z{>X3;5Gw}13|4IjIIFpRGP(mCn3n)I(ihz`r8m@$9UHrTlh#O#(Xv{^KZOl_e&i&I z&0^$(g~8AQ=1P?Er)2zBJ2>&2*a~X(tbE`L#_0f0QS#Up;a7>lVC1C)ZlwxpqV zwMB|xbzZDm9jD!VNCRz{ZjTtJTEgOZyE4!G| zrShdtv?z$(i^^-aye;e^{wNaBwYLO`^_~tplHeyb`=&-q0B3UTQm{K;=Cj!`ibll> zmHH;v{k`4hAzrL`+ev1*mJgSOmTrRr%N%E)oH%})wm~tzuqZbjmg!pIt-DC=Fhoa5^ENY zExAvp$#8^*4xO*tm9JBX@HQ+nSA!nAebJIO?q$-nGG7$K zq{Z(_%8%+qx%_5&`(T_bbaf&l@~{G?Ql{?1;w(tNE2wji&zm@bgv>=P)!^Xe^g7U6 zmCW$4ko&Wbk_mR= zu83u=3xyw{>U_w@<&$>|P+3g21CFi4E~_R)vn}yiE+j|YBd2~^Iw+gI$tE?k=p6(7 zZLzhi=!v^?UOO{!cw>Bx3rR(eFov!jqa=QZ*ggzjk{nWGFQq+9PHu>mcjwruXVkx^?i zE2HoI`K^W*D`}(1H4z&%jB$51CR_yQm(2v}r7z}wW>0p-^97NZyZ-I#CbzfCYs^rM z0uRA4Rt3z52cdb)ykoH4B+SBYIi@ZqxQm2&#zn1UwZH>`pePyK?1yTkUjkEkrbnM(*4+Q&%B$EIeOubr0VmFcB3V+WAf)j?A@hx$?1CBC{N&^n1wj(l-XKxT~KBnGWG z+Vo^r6a`V;N0|n452~@fXJj8CViCIA4CMZN9l?i&5|S)!^V>9ZOqaS%yjvg|vN1M# zEd?K*J3{XDWhjMwd)^f5Ie0P>IF7U7dbI}(1^#qiy_KLrlhBVGF0pqRl&)$Ny7D(O zOLt&q2TbG#Rs8OX>qFzX@u(t^p#pG2<}f$xy_c+5HBg-%DQ3Ko5g}Clj$4S6sQGwn zjp&-EABWtGo31cx3%H!;Tll*jBV*2}YuA>P{8sAs#cBcd zFa#T;1@m_9z=bG}SjG7@EiZh#X7JLBkc=@m^x>Z_L@Q8gRBH5e#>5_6J;vZkz@iXV z!D<*a|9b#0>4eaFhm5$?x*(f>ZVhNd9-z};P|lR~o|D!~-y;qr_d8U`TJ>I~OuVAk zmdoDDU&)|0qx90D2S}^}Uk1Mh>u_YDU&ewypw$**iC_M;=w zIkBPPhC#mA$9z%OOuhjgs_rntSA^kpAbw%EPbD)85aIdxmK6Sa7=vk_a$=ZK#EFYhK~LudCE(4l7vDMDecwj2yvNPTr} z!%GbCZk99L9t&;)_5&CnFI=66Q(E2@5R=1Sf&Ll+aUS(=S4;>8uT9y*@@ouW?9wTg z?8}m4zD|SVLlM0D^j=hb6eRLeYowI6c_O;jG9cx7lb&5_Y=?TW`*dIM<_`7(TKH}D zwY-a~&J_em(wUQ|?SM)$3|GJ15Z6l06j||kyrCm>D<$Vi zoH@&GFr$O0{>NL??mEk!jQ-=XLWa5y<%+vETUQw6r)_vEi09n|;(HtiTGwON%D{0B z&@gony%__Kl~|~7N<-Q~q}zd`}9z^UT!3@|xqazi$WM7g1fb&hh%t+oyL&YL8ZAr1q&_ z&sh0&o~8AkYX(9K%}n+0P3Tkfu;W8s6z||3pDlznZ^hAAuS18fu^r3;AV+7B)+xi$ z=iG)xd~~v(69KQk-QiT^(=t`07Br4klcS}qqdgCm?_}iwX(@c8u3Hh&g>7n2>tA~mCjHvq;I@2SBSkJ8iEfx%R(w8{p2GZ}- zS%@`UwfDOoAUav2Tlnia$sjA(r+X;J0a?wn@z-8n0)v1))|banf7vX~cQFUfUkcTs z-L{e9?XM(B*^>bkCO(cETRn=OYx3E0A4*^G+Pqy=-Xm&4m;Du;Geqjpd5R4gTl~g) zc?yyQjMU!XyQVKO)dOU=Y(7~$pkc>;D^Q58MX+`K-4-vqM8*q*?`#+gIH~4Cxn{H8 zBWo=2w%kfYC01qZ8=hndkRZI9=_l?Cl$TZbc8I^vV+w8v1d4B{%rU+~%_0^W>HO-9 zZbiAdBvz<4^7QR{Nd5Aw6|vt2-<%fOD$?64yn@a$fvcx5wSBHF_o28#w$skZ13D%D z?L{7HwfDGSn$}4!=?b4*TY*bO{Lc)C`M(m!6=xEw|JGA{+x-~e)beYtZvNus>+A(P z0t_*6S}4;xTQ#5sn*?^vPINg2dLyJ)5OwVBiDv zZr;uSG>9NO4qphW$ftWG^T@-+fSxic397=HaGVd6I-%+id_oPQ-4}X;onR^F+hGK& z#5JbcVKO&w%=tFpC!Gby=G+a#b}(;aKZD(=(0p9q<8)OQug0Gw$sc1EO3!`)M-P)r zu@(usw-z&Rq~9s&BJ;6?Sypc}gMJ-vLGAL%5Xr)$9Jd=)ig(M+cipkiXC@-3e+q{kwSrSMxEc8-%0e*oHXk-9{R0K^Jih>hCK{d*QaPVn^e9Q zCgHF^mW3s34%Sy3z;TAVyNw*(4BN>XlC0oW9_h)3u5Gc*DMDRAy`94~;MGemDO*My zR|up-xq%`{KCP$6w?0~a2V~?rdO-^?lTaAinankC%G?=l0(0a8rk(a<75JPq$H7wY z->>zD5sAL~&WCS(`8Yjes>r1P=#@0$`>c-9mS3^OIeuafc*^mR;8-uA_^HnQXtj%j zrO#5B2kMFMW;$K#%N%xRPvZB!D48eC_0w>HV-{Y#Q<{Xo^#Z| zVh4-!eAWD<7@kuX-d@3x%8+b6jnwB@_Ar4$-9~q*E(e8$bgk>uft@jP*E$VF198eJ z5J41MNrvWnt;jX`t^~SuVHVlIqw}{0si{*)Zj^(=9*pCdk5Hod#;W2R4#&|w6k9D} ze$R;lhwN9$N`Kh#M>={RYu5%VqvYh1Zdg0AHHATukH?8BD zlZg!_VLk&t50>||IxMbm)moDv9xcVvJ4-jJ*KM!& zKzY|A1hh_OZ0&i`2y-3(Hf`DtT3S};y$fTPNoLt^XRmzH8ej8*_m~Eo`S2V6s-Z58 z9YHp^jZXMW7SN}%VLe^)R3M_vt0wtFJ!&k+Xy2PbZP$xF$rJ2cjIG>>Aqy{+JbHpD;d%#Tm`SAZjd{MwxlP7=)z`JUctAkyvyK)S^5HC+s#h$*D0tC!Yj zf&EUz=(jbw#fCEu$Rw;P))~ zpdIk9*XPfv3EXpfr=$ z`Yg6fv4}1C*^*w|J)2wAT{fMeERMB%SeAW6*d^zJ(doZn*iwW608@CzlR!pD15wooiY}T9qu~j_4#hAC)fbDX>Byz$W4@wQDCW0 zy`|?_f}_RWB`VbBSFL?U#?8VEYN8)Cyh^BI3VUDRu=5t4xT9itt1Is7CSx?~C0~F| z&${V}1BsB6;gLHUxaxkJFVWHpJYx5+Dvq>vd-wY9cCS}lG@KoPHl9De z_P0-I`9}um0M66+R%DhoB;Gr}cQdQ&0GMe>Wg8e%j8-mQo`$%O!6aLk7oUahEib`w zArOvluqWA}tim-CsE0RwY*kQ@^;?4_>u)#Hv!UXy52C9iA5V1jyh*D8p6!=B0Rmwj zI)0=quYc5`4qTTGW3CBbnF9*G7O!U#fm85*1-I9~P5NXh)>a#$B4N9zUAkAnk>*|t z#HSy_!ITRaNA2~Rf%pe`I>;{a8z#m})X`x-3m;Hz#zq$pC1Q72Ww>xHCSARH<6))e z=7lgemkSPtG(rD=i+9#{K#AkD)A?1wqUMWlBwPVAu^z$4A^f@VwX)9&mr5N+dw+x- zVH+S9QfkD?jK8)hnW~LBxx>cvW!enNchsQo+%|{QDLD`i!?4A#DqN4t#Wq30+l3t* z*ev0tyt}nE%r(4!08D?lZcP{e#n+;srCdR1ffjezX-4n651CPAz1fW=F>I3OSE88D znSk*`OV57bbagSQdZY$gz*4qmBA7@@zb5v6~u4=~&A=>waEJ7xA0``;Rqev@H-tXw|oBvdYXcqj1$E1)Sv(D=!1qli`U~R5)TM%(DW1c6wvif1tg_p#2=xug+T~3IE>Y5F@nxd23FOoD zR?2lNcR`fkdQ3AsT1(D_-dW^-JmvR~<%8OCbC;TTs51}?R@OB4JEP)dl%a#lZmimh z&Mofzbh{X`q>vI}j^Mr0x;b?r{5@zVPPzMT0eENe-f2v%cGpT@UMgtxQ=;)MjhBYF zJ?n)-ttMM9j?}BIskGextA=uL#@-!(cPTEE?B+mGaFONUkk`_;f_gJ)Citd8J!7s` zl*lEbQ^JWWHnU)}A{^++K~ckX$pcY7C9++f;!K>A&6I4CKyNsY-eVbvZ^f!V0bbx! zfNt(s(DUwy?Q$=F-W0~zHqY_DHu#j78ef?kJV?}ujiY@VnradB&D6q}Bt*}fy3U#D zSa3-xJy<#Yu4%iomzjZvjn~$xOE)3a{uw{JWGh9=xaFM5y0M6^bk1&9P7365uyV~dG*ecPcf=O-)=6<4;W4ph zRl5+5lu2IDx+P_XryDFC?QzwZGdHKA71HB!oU7`^_La(?k_c{lRcNv5Bm%^1tcy=9 z|DOC!aqIO$!FsDFsnuonPt`|U7;wB!!#_y;zb2C}^82g%uD_!I?K&&dd?|#+~snV z=%n&R6IYNDoA7*nDP$a~dxKYcrc`8D2_v%!9H5d4aH%<>GwTV~bG|SBMKgXR*@Xne zu`di+T}N5Dxty$9#TG#9ynja+&dSRlQDbhKUpiojWZF&()HQ#NLW{taOQX?iz0{uT zte;A4cH9kblkU{6Q2T%`8NX@LW3ZjjGP&Y3$h{0rZ0oMcyVojp1K`HNqGl;U9Bk%8 zcsfK$`ceDxS+MmioY{A<7){6-L{s#&w7ze}X?zL$l9%K;^s?)^a&Jk@-#ZDiyS$uG2{$W@B|>yLHs1$QX~LChu2P&xt0c9iQBe} ziY543l+`_2W-3Z%pt?lvOdaXklYZf$H>5k3wWR+Vk@Z8O7ouIcp&ITvGN*(B{k=TKX- zYc~JB1G%UCv+2!}O-DzViqb*+gQ6IKQmgf1B+FQY3d?$RZ%|+R})XT zR$^aD;@cc{XqCp-vXJ$Q4|V-M!6~K2Ky}{s**M;I@Plw=TVo<$fL3?t3V_VLJ< zN-ee6N_M#PHN^zHOf*aPT)t&M`$Y+9Fa zdVTfI&cBnNzpwQ0v36^z=;2y7RFTQ|^jGlsx7jlRXJ1B$f)#j}+V1w%nU9p}H7B(H z50|+~1N`LMZL#?&LItKR5`O4ZlOOQvCR($nSJ+r?$Y*cvf1khnR~7l-xunoo%SE56 z5)h!`Ctt;S0x#*HGkaRnSY^*`blP(z%NS{@WMPZhlzq+d6 zWK)s`M8L^2l8QJ?Z|{$hF-MC@PW8W9oLj#7H!b%^T=-1$)Fp4=Dckb3R8)2?F`-8| zR5q!E1axPxqSRR0Y*TE6M)sO{)P4Jx8tLitVPaB$*Xs@zPNF%O(6cXIS7}uOzevfO_2o_XxX>1 z^eO?E$OwSbNyS>&|8X>e0zQ5MwFTf-sW@{(Sg|38ClYlpdH|Yj9Vl9JT*#%!rnlnX zPu9oF+|T9%M0@OpEh>TOTciY7mGh=D$gDKGp)axY7qfmnlKw+uJgc+NEcWxi&tp*X z$IAftRWIkY6_2iMJ$i;-Vo-hEN)4kBWg>XPlP5%zXH12p?}HWpcU<`Kvfwkz*P@fI zI|6Ez>n?~R8^IbhYv=e3%?H91tlH-j9t4UmzEb|2tFf3w&c)<+{X1iM_J!`!2+*p& zNf@)=+%y2m-t4kXVeTBTR%Y`#rdEAe4HzP7=^2TD%;|!F(RLR}_kEuH`}8+Hm{>h! z)?haZOb^5wViJ2E(5rZRSQXi3E-2>DWLT*S6dPLRL-Nu?M>GwsA$E9+l!tTu)dMF; zf&cawXC5BR)_Xf{9(cveb*DTXE5oNh33=`l^raZzK0y&ZLBJ^7x+kIpF3`$;Q7?cVhL7S+6}M2(;~- z!EU~Sw%Y9UEW^eP(g^mH^M<)6m=-OA2c^c{@=u6R*QNG*y=Y<1g7B>F#kJEzn!c9PSbC;_dlce)6)LuoBs1ne=RNi7ef3DH2w=A{tF@g zh|>>j#D5{ge<8$gzT&?S;%{=)e<8$wA;kadA;j)JVd(PVLx&DEyr%+SW=N6}Cy&O9 z-(TOzdF*b2{Ec&ezE4vA$3Kl7$!IqmlKacMyMDZ>^Z&~KKC03Etx?Q7`!=wKL-&=` L?-naOdij3YKRN;gO<-5>~vFmx#;F@zG*Dnkq%(%n*nA|XRFbP7n9 z#4x}R@8a6`zTn!={eF5rJYP2an6((rS?AI5KTbk5)D&+M&=6d^cJ21Fr*c}?uHk^M zUAu08e*<`@YsQEQxL~7`o*ehCB{JhN0)y~YmQ<6pzYx^oTtVhQkl4U6U) z?qB!Ut|?*B{(Y~71^S;g*RNd*vAKrxKWhwu>&4d?@B@7Mf3Dc+SeH*szy9ylIN)^b zf8Sp>xcFE{thN(yx#|4$xy!X{_k=Hgu;k+&zXaZ-vyoHR0j|J?7hhPMzzgVK*Ngi{ zNih_h&w#7dGr1=^Z?QI}?W~LRPkH{-=$#oBa&Z}ORZ+^5hrPQ$^bQ0sGa=%_<@pf* zZa55bk6lNToIP_TU}2U(w^2uvV}k0wVRf-?(J}gMQFgKQfGxWBRItv}<8z8dDPQxm z$|MU`u^5ZbsBXSAyx<2e&*S?HJs+En81_Byl=r`ebsYzvgh~3}H_pGWThV()vOoCy zoqyjvm7$LL_o{!t$Mo@uG$;nkIQAdUxcF;Egvj5E{(bY4i3!^2U!wHS9i{#KHQMPe zDfpk&79=DH3u%3p|DaD=8e~p%h2DRy=EcVc^QISm{!eb0ppWsca`)G2YMek`>VDm4 z|H%vqA_4n9`3SgmT?Te*rQrV%2R^v_KPmHG^k&VMo!$h-8Plu0wa_t#*> zu4ljbpUlWmyZk3*{}uC9iT+p2SB>ev)_lch{~I)}M3eu<=6@$1AbR{aX#6*5{I}A$ z;t+s2{I}A$k~;od&|OI#|E-&^c*=jR+p?l z9xUgIp4o5Rc_SI+hH_k8-?42LqHB3zU+;})t7k^(eyaQ9dxjDX4TCCk><+)E;HUP7 zIfK84R1#q+%6of+Hm_f^rM!6lELSaMV&SQm*wsdMmjEBUdtBI*e%;P4cQAA<{&W>q zXFJ9l8?2yUH>ZRH5({D_eI%FHKdH|MlGEUOL0yPT7;EdSogYj{`Y0kwb)+R3-!(H8 zpAK>IL9ztxRxyHpgddJrY4u9i6(A_YH@hDZ`m)fEd8{DVkaQ;5=GOhO&^|d&(y4A; z*`%0<`UIj~{Na}d7obK(f^a>))qkG&ZFjfR_8OlN;f+_Z?MuJ1*Y~MTcP7FT3^K~g zobPjSaplIY5kyv33xp|hk`%tu)7RIIm<(-e;}@#cFe)bxP|v!?b-gmc_9t0@K8`?P z`^E=F6}KzOfBdxjo$!#@moXRiZVd>%>%t>t)4uz_f(4Bg;pwA zS}xlyf3~nmP>NPzdY3pBM`@-K$gke>{%oR#-6$o>9;7382>?jz0)Ph%)P$*qstpkz zN%44xuco~9fLY&)uyyJ~I(KjRIKK5fXVTHy0YBAMMG_fFgIva15Phs9reDqF<&q!X zG5xxr^69W*lUrgu_)9-UsZL*B=+T`JfexS02C17?1QHfBihu8%zKI*i>mU^vZRv(b|;ZY<4TrJ zrmA?2{xTMPKZ0$Fq+0d;$PZW@lEZ3VV?~&0;wk_Ypm!4=Y{-(ITy))Tc=&dfIazh= z?ebF#xR=_8aA^*lSF|sZpO6chjiq8b*T3ou{B#H{TobJ5eER9@2?h!fS$gBhD|rRuruj_2#u$ zb-5_V^(T|CFflblg-dC!060=+^v8qYo2_Prr|+4orCA-#Htv6veOX|jaML9F@jET7HI+2hgOZr=}xd!FcufOd-MJ2=5(*9w1{9H^> zn?wYy3t=+g;u6Cy;!z%GmgSD$47X8Elw-nHmTw=tqwegsq-`eqTM$fTmHrx*Rc!1f<}KiXVTA8*1w zmNUbljE@`H{>gv;1!s4i3*97z2j?1 zmA7T6)O0Fa?VxODH!Sr6N9lf9qfZ5;V3ba~(jfEnrKY9RDF9Q{1F>hZT&JBBU!qd0 z`XU}g0{Z-|^|vcm!t9k_@PkuNls(YL)II ztmTIkmMZ*#f9D%%Zou%kJy9b#^Y)Pj0>7e^S>+zyOg5pf*|?RhM&kit`MWSIGX^Z$ zxOG;M{gLpCXVXpCY8u09po^+joywBYjtQHo!BXJ`N)C<2D{ zIwRCo=v9Mk?`bdv2#<+6V)I0E_NQADT-pvZB?*G=@z=G~I|)ffv-MRgf@A6#RdY@r zGoDuUs1YM|Dc^(2v}!Y+D0t`I-b4FoF)w$4OZXWC_1DPJ_%ZN2lA4;nw1m9OEq_|^ zRMp8#TXemsQccRSai`sVd+<}0RLw?P@h?U81x2kirAsF#0i^;DcxyiRm@7=IzY0S& zD7N*L+4${TkP!nCiR7aF5yI&ER(V`=6q{JQzhc)&^P`64c^Gpnic1B<^Znr!@3FQ5 z1S=M8LR$;T_Zo$LT_5b;@S#QD&n|^*+U4qhurH#7CE89?ix5j5zBE2+KI(BI0JB2J z&z-yVmiEbM8r>a__q**kyH+}5W8JrcHF89~WMHT2bHl^K z6X#E+?oVDxG1AL`?T9*c6Amm0tLHR$l#w`yJY_C|k|O9V&RVU!F(HG$G#1m_4#odg z0oHYg3#a_?ghMuFA$-LdB_8SC9LOsJd*3^U!Y;)S8%Fe9iKG3&7gW(zxjXGnOyp0* zMdshJA16WJgNcsMg(aHcu})wxDqa5Q9~-a&8&qO($hxR=au3VE$R1Ko!o_5$GrFHV z+?kI#Ck8Z2WC;DoHkKFL(3bJ?dw5xvP$G(oi>o0Xf03m&e<<}q?2*U@I{mYx`egz- z1^jqZ$kJhUzI-QtXqd16;PeAgl@X}&MH9u*&O!$gP~pe0 z_U+r*iVU6)rv1)OSK*i~#$`6$;_tUc(eyPd!W2?dS=P(ihn8r?68gd*T{MR zB_s0Nucu=CZli)VvLHTQ-p`WfM}4_eO)K)N8ei)izlv@h{#yJN|_ymEenRm~|+v=lARQJ}UboD|PqL@pA1;6$ir>h3~3*%VjZVYbC0F z2Uo23u)h1sz-DGLenLY2Thv}PRgXbv70n>C12nHa}{pNeplRLOdfE3!jJJr zJkCXhJgO>cweVlJSSSUctJ~Y^r9O)sXgV+ZKt}x+ujP+1v*$C=6%$z);3~or0Q<8Z zliUp(6@$2ZKyf~V6dQxq3S9}f8VrD=c(zw?c~#Wc`{u27Z@e(7@~Bmyd<MhL@1B-17fl$wD-jmp?n z^T)Bt*=~HU2YfGO)tnJyaNHjvsl$QB<$3$$2igRJ8eaX~8PiZxY&@euodoI;QQmx2 zl5!ci!hkT%)&g?Xpp7fQ>uFE1q@*Nr|7x%KGwd#+aVOHLh>&-_JC5<>7vAmn5!$(G z*$vxpv8H*7(mc#mtiB0s-uV}wvG+~z%<)L=$S`S|-$r={jUK53W+2*k=#g;!dPxI~ zZw`GL9c`M*>#@=+RZu`LP?WolytUfiY-xGL1$}NPx<_@oaoeE+OP&x6u(LfB#6Vi3 z!yaqwO>WiCPv9zfx~iVGQ`r;D`X|~Q4wBxwq@pwSXK{usw)0-qAC8-p0^y2yR@gKQim=T4HZim|GI5?`< zsrvU$zBPfk;iu@9PKLDy)22Y3}JXzY9mY%&?Vp^J$!Hi}QZ+Vcd zH;An8J;M1W81X3V`0peu{c;z%)7f{>GwMrgP&t!1-5&Z9|L*ennv zZ-u>E~E6x7Pd^hfCYvr9GOtO1te_8?VQCBT4%tPqTNL%{+)+DkisLG?y__a`&P zGBq`|gkw8I>cs5F?!g^I<2Gcwki*0KaCgH>O3c`O99*r-f06rFg-;p!+Y(Cv|qKz8`JZ_Q4udbxKvQJXX*zXj@R-+(sypm;OW|m<_zheO-KBlMR z9<71X;|&mA#yfm_Kq>Zfe>%(v_W}4tc%zn6U-Kd{s}12Y%wlHH2R$bMXBj1p9Sq(@ zW}ZEPyvoYTtDlv*$F-Jlsa||!@I9Oh1`B#sbZ4lHw;&W2mPM}04(O~=tf?Y$0b6U7 zk#k`hInU=6@D2s*F{$+8 z?T|Wqoi*?7vn6$Yq;5!r##Ezs5Bg4ov_AD8gWrrmX2Y3sp8MwYH z7AcIc3XWJ6NUcT0K29S3b-JeCT)&{0coQsn)T!>s#-oSYKzRYVtui~p+LT%b*4CD7 z2;ysYepUKl=CX(Z+6zLUz3{m_Bwd>x};XJeEoW|+ohc> zgxsLuu)FX*F0h<5-=ng<&BUae;QK@4bi1wFR_rd`-V0k=%c7E#-6W6~U@0dA46u~he-XOfzPB08?8fE1gN-Td1rYnBZ|w<9 zyCSJ4CjmVH;w&hc>hoFRv*PqvXiGakSzd+p`B+XbcU5RveyM-MsrRw&GR%|w8;2NS zVBBUO4akudxy}LtEJ=+f@*w;Ovyv@!C_=j870&X?6 zVDxo{zA%{Ad||P!OJzU?cK46p$pYglkS^`+TF43S0g0Nw?R&$(fstb!OViwKr#vxP zR+(sg*)1T|8!v0{WvGx3T2rVGxwKK}e-UO7oaGTKw~? z*e->)<)dj-FPxuf2dE4I?oC$swxnUJUZR$*CBqabacq2i8n-Gp;aZmN?r=&3Cl{B~ zt(2=RnCnO2;qPxW;2RqggLA_Ap>b6iA2`5*qJrY$$tLLf(P3Qb23&r96HhQe6_(6SVQ% ze)w)0(DI21V~p7<>rRA~mx5^>pPr*k&#TR)$qF@JQ7GG!hKW7eT%1q_RcdZEp=Xjx z>Xs6NJ#@nSm#F*RDmd5;4-IL%WZP$`2m=K#bL{TaeP45*)5}IkI$Z>Cau>Ck;rjs< zLA+eAL_WWI6^k&BmWbP`TTb1Nbn?k^|FAXfF`IIBP}`iny1L42^W#9Ny}jLb@(Ua@ zy*)y78Y#vladx;M#&Fhfy0>|PJ~;`U7|A{gT5@_m(|bDX{=Y@93piw+y}lSHSaGD5 zd-JuKmJv$R{7TO!41h{Y-I68_<$%oF(!=bO1BTZ&;n8lWoPj&jp+#JHGFg|)Er4Fv zg27*{&;*3EVJ>No#9_^~9NDg~+9*+u^bx^pPh`XArk;8WZr*q^6#g%qU;}#&A$L$&BhWDVW2^k{;^f&6Z-v2-)zVnHa#lUGf?U zcs@ucGxG`SJnH~P9)p8#o)~6RUrExJrCT5`3**b_!kan@4{ayoEG?HlTt*Wn>6eOt zrAG0a2m{8@ZI;Jg`Sdzj46<6<(&tsd)1E=fE2<>`dVRKE>Cn1oGBDog61Zw#_sDhF zCxq~=D~s?q*a6;Sf6^MV0gZchPDR**M*>X@KX2WR&Josbzk)Yh3z!B>wc(~`Q#PQ5 zxHs%YOxI(y`Kl>+e=wV0hrNpkwY((M8V|5lu?Vfu2@sTR;N_YUmw$dlG2@z;R;cui zOH2r`u0%lQ{7#E0To<7CHBHhW5(8snW$fWelO$x&U82ZKu&+N3*tdqR=D?wfr)*Qq z-S7GBT3tHQ;nb zZ6sqMfSMVtB`f>@eVlFj@J34q@+^>PS3g>M>(RWa=_;S4xAY``1GRj(Q8Q6SO zWSj%VhhinZN|y_qmhz_#&=b&Yt>3?_MEs=-0ht$n)=|?2c+W{_WXt-daF-14sNH9i z_O83TO8bt6z~3$!zzd{!gm^vfMv_L3|NG2m0s*nH!~Bm$AYNdVz{h)p4_7WV#3cQz zA9!|%Lg6n3;Mof7sa-52%Wd5~JYVKMl}{8TB&1=>QkbcfU}^GP?mz@|M6P50%UdNH ztY~~!_tSELRXLR4Ncnx%miUC|ot3p!bzu4jbl|bQHwL}07+RDL;0Ir(*vWu{sfsKl zSlz(f$p%1;DZk#*ak7FG6>htdAWf%J$>+LX34D2d)s>h48MB6X;f=CESATtXG8<)f zer{~63aG}8!*pqhau66ha`{lxP^$v*&FFf<*I2irh)^S=4tEw0P20Jbps-7$2!H@G zI#6AHk0Je_k<(oN>K>fV+cow3*r5)WaA>hi*3R9er?GD%)V_RLUMsi)l22EJ9{>JSq;ZtKCF(W5+VZHgfH!%P4xK{^j#6MGdUpJ zEDgO5n}8nE^i#Ni#tKffxp7mq21^ZT8?#TI0ZN9 zpxjHcduoB6q+h$cdxvG>$9&1ZD;K5yLo(?pfC@MH4JVW?`4&45nkv#m~U+mSln?rcEgKd~epN5Wf69H#HjF>b=0XGY(=#gz;u= ziT)!q0MSRfgV5CkM3(V$&{Y5=k~;WjwjiJ@CPNvAO?Ei;(dn=T%k{XeSs`D0Vz9fH zDU=i}57Tr%p?8x{(e$W#B8}WR_rG?fJO*^&f-CwE`aD(HroNWuv-pXH@a}nm*)xGh zp%jnAa5*AVodlsa`{Q{WYjh8Z7Diz8_pTqR0GvXYJO zmwJgj8vA5PXOHN~7{L&hNMET44a=<5iG!TA0+_Y;{=MVR1(1Iv$O|U2$w2BLGQ8z> zhx`TS>F;ai%q!NYz8|;1g0%w2B#=-^`Pu(t&wQLSDd4{k&d=Q%`%|x7lfHKGF9#db zcnS2wur2Q`mo1n}FWs!C<;LsYgE59l^JptN%ZN?04QjkwcW>QK1ij%Mu)uu)CHX9U z=Q9aDmJI2$r=aC)2&_P95vx#8AjvZyw0B{(;BfXtzPCQwao@BLS?QraYNCrOq+Iaw zE_R{^t2Q;A*Nk)6^$1Ei)R;$&x5LJL9ZX*qi_zJkT^%f!w)vz|OP-D9*bP+=l1N{} z!nykLi}{|jjy60j-o0r5rA5YguP4KcZiFP0<}YM_MnqJ;9a3P+z}`qmY82{3y&QGz zIzE&C)t3;QL`#s%9|)~TO%lqxtZtl}7+k?XPqy9sSO(^NG96w74w)URq9(@V!O%x6 z3jeYFwE$Mm{(Tvk$HCEuPga|$-s%+$5^6$|qUfJD!8JXVw1#vJ%pot9ncY(bVsLN& zlXl=)iC?6V1mGF3>YS*qlA{s$-p!FF%qJ?ui|vf=k68LiO;uw**ce$JkkR}n;rRR_ z0Xbxd#_}KbU3`|4Cw6=GGB5{8nWvPzpKkvz8$qQ}A-s$}FApYI({jFCYtg?KMlgE^ zksw3;{HL5C?;H02Wry1V1w>#X261az{hmLuAxnx`=5KHz)NBh`7DPe3Au{ZfkNZYA z(=2$i?rBg3*dTMp0aT3v!e#KQs|ks?lOX2d*y}XHY5F)a_^QnD$w~9pG%QaMtL_^| zes&ANvnJZgtVJ?%AZ;<|xa4fGgl{qZ>QxT$(mY8K%Pgd(z?V`ouf#JDhlUo+}1~?e%Rq-tzjl=946V} z^Et0=0c@s09eCMWKwdE;y3p&x)Cf6wNRwVz2oC`@YoxtdNAk|7pr=k@Vt;@JD}i~p z;?D>=pZBM`-O=NGWLqUSi!E|Q`E*~L!~;XAb8X~UM)#LzF-3NxB?J1}bT%>|?Ud%x zWQr>~ALi76040&WtxS-{kiK@DxX)dod3Uk16ZNr;^3AN5OHWPic<05n&Q!Oy-)d-6 z`}#}!VE-`clV-_M)W$wb7rT8a{J0>JPNd@3=zC&G13UhnGP559TT;Meg}rew$4x1c z9&w9NQrx4@dw*r1>d%S&O>p8A*FqrarOR2n2CMkL8SaBcQc}^*%soJvXEs->Gg=O0~?>% zO1!E+FL6b8a!3)MjUAQf2Fh}YDtYM6RWIl;S@+Y?VNbbX<#>C%Gv23{QWYhwFq&qW z?N9;Dw@)%)hT0s`DuA@5Tx4L!M>{rG%q&VSpa8%oBiAh@wxp)(UBy_=N1JjDq8Y3v zp6mPe_&T>}y6>RQEt=s9h8Kj3{r?jV9FK7D9;io)cWrIG`8*Bj3zdhf zRXCzkY?n`tXx$HV&tE!-p3OMgKq8DiFwK+Men(Vd%Zb}#b^3nD-qSsy&8jZAMGyCB zX3Fw5;|ioiLZT$A>5r?ax78+;SaHl+?wQCvRbyFddgh3CI|E#JBPtb(m5gQM3!(<< z%?FjGXTd3J%U^L4% zM_}|+9e|BzSnD{w0RWGc0D}IrJ(|%eNzj3Pe`l(1uvbxPs7~VOcg(>zY~nEq^b}ds z8pd;PX^?Nq?hnJIxntodky@WC7D9 zl!yDs=XgsbtWNZ-*KZiU;4^-v9bZLP1@|HEw&RJYS>*E`-_PBucr5EwGdX#NP^;VT za^G!Bt0gSOL>bTSS_!^xrLO_+yu`d*h)A?iH>|TZ|D?&k7|5$hvH&@T77z<||1rN^ zQLa9d>3vpEoW#f3j-iI4)n`r=ed?VO4aR|CYQ+;*=D_?&QTMe9eHgK z$w3dgz<()LpMXkREj2ny#JoM?9fae{^JZTN94Tgx;p-DO_n3OE_+64hj_n0#2yqk4 z4*p`-vz#;qf7KQ?gw$UVbes~l8!piO4ky=fnELv-I=U*7p#C#%Zp`wR*bxg^hvU5Rc#&f4OcR8$>_kFC(avHEL9VNF|nBRsYiZ)A-%wCO|5VK{dBORYgK3&IDX($k*4HwxQ&V43DT~}TLX|ks< z@fJ9a+t~2UdD}bc$UJKCw|~q|+0yIwdd0MB`w|z=1$V2oWME3P!$MFI=U>wN?^tF} zpE)`WWCn2=)o@0C3rP}S&js8igqjtDL|2TQ1@bZ;?-2dN5Xr2kG?u=t3%Kd>XFf1Z z_*gTo=zq)WcbGLxCg|tW$%nIoxC{hRjnN*X>XnCbRRog8Msm znVSLvrs5Am(YhdLsBLTaPW_|zjYQpP5T#*t2*GfCmZm5+V-w;)Txe>>NUCY+P&5SO zvy=XC#xDac`DSUJwt2gdXWGCQ#B83D)}16>C@*A9>A_scwsH7 zU7-r&WvOjus1Zm}nA9sa1UohE1Op>S<(fB(2x}#kletE}^Rv#9H?tkG)SJ2Az5t1T zV2H&yOTm0&rb#T3Ack%rYk^Vx?W0lsT~(i(HYw3L9Ghe1KW4nQo2(0>X6(pSeGL17 zDBx)LS-d#*4nk+bdbu~H2HX|5vOb{5*mGpJra8u7GV8To{6h`%Ns*xwqHv?W?~U%$ z-Q6ypBn4%*uVK-dpPt;Eeq#^=YF zts0wk?;j;>8x9Q*^ynL-pvRGEQSC#SXqgPTLl_>-560%+l0Osd1GdU$-gTvQtMZca z)?LV&_3?))bDgn5=XN@?*$WbWRm%_p9aXNojGdXMF#uTae%R;Z+U>%(RZEnjUd2~> z7-sB^X&(RZL`aU=CG(M7p^VLb)Bz7#{KuJO>@xwER2p}?=@O$6-groCtx_Pbm$V*! zg+=G*O#MQ8Qj|Nc*F&4GB%P3+g6+U;m4V5;rM2LVX4AN?0OOfs&n4v zpZj16qBP0|3tM<`jcru1dI0Ge+xbC)HCR={9j+8AO#j7JLaFt8J;V+(U%WT4RoNz* zh73J~N9tWAhVA<*C8uq2dSK4A#;=jh6KwH5op#g7X0%k|hJ5Vu+MhE;1;7!(`EF`E zeLWS#f<62c*HSl-r3i+5BB#=>}RJl zGlX#(R)J3PM(lQdc8BF}GEUSwnHD=gl@CHD5{$OLe{bC2p1m12nPbR4cMPOK3oyA_ zMY4v1ytkP9Mgrf;Oq2J(t9C+4&Yzn+4OQNsZlz9C+gX)1o4j=$KiHhiD&z8%!Uwk) zFH&6fYl55nY9N>X^R>ol!u=62G@=EUSdCS3T$BK0AM=i$SXpL8ztLnzk2ROwf$j+Mu(Kqr@aqB zypqGKJ+bDSKBey~U%rY@?9b)y_*l2$MqKb!_dZnf^(1GK0x}Tqb!5q3c7n1}vWb>B zFesVD!oKmv_sf(9YjsR(`zvPford^*2R4O_tT!^$#l939r~(^}?5aa@=3)P5g17=Z zz5;H=&>Y>$`7~xIn|vhXYSWnhS_TFYTVwbM`tWB0MEKAnGA_#3Jg8Jhr+ffZPVxYU z!N|4+77r1~g+qGLHmas&rfGXZ2a_)6Be`r4fyAvUr`TxAetg=xIG z%9c(E=%=Sq*)J8)>0w4JGSpl_$zbH0k+~-?3eUe(zXiqcynN=Xru|8#xd8lmMCX^F zq?V$#htl%{(c;oFE}+0A&vHI_BLgcp?^uf9-{hRt`O@$4HU(&-wp@U;bvwzW^f=|_ zLE>?o(}dO*cF0Vgn)+d~$xZNQ8K3B@9hS}Y+l+|3)K2%(9nDcqUIH=kld*d1^c3Ht zc!xzK#7>X1z!m@VhI%2Jr$oY*L~mJI+VT0sK+jo-ME|llki`TiB|bjeGF{zvdffh z_^f)nQH8^yyVY;+nWuz=^{SKrGO#z1Ek{r?L~EZeQMTal-c7Vhso{6_ znR(@x%Y?1-m=JWL8inajmeMCmw-kk721_^E%|`_X7N z4}omw2rU!HgWmlC2k{TbO0JS9f&hzB?{sg??BY8a5qdNE%E*-u#YVM>3c9!GMThpC zOY#+IK9TyRM>q4ZK-o|}e^q_234(YFq>#Y6DfrIb06sk~cKwZFI$fo3Jo+q!NcO`| zN;E;(u>i;V&_TEL8R#yB&>+TQGyQ9>o&$Ssn=Ei{@XhZrs!MkaVAfBclZBETi0)3e}qAPk)OEsk#ilLDtvE6c1_S3@Xee1BI84ztAiy zuF|;6p~J|he!R*CIWNV2EGdZ!)yM%+iCsln{0aGi6Bk=a0@{)6n%M2KFb2ukJlzIU zj4LZ6O4IhP=9(|VK4;o=NBB*@A0-V7)<(_!ge8u9tB-aD9@P`g*3853Hnn&Ty-TR( zj765`>}BpZw}+RUKQwh)$+vsSQD}JjG`u(2+V(Kfq=4wNUU)5_ghm$zSEeF zyC)kwwla{FWh1i_a^6k=ZYkE5pf0{P-0bIPH(if18zt>^1FD7`J5{?j8CX$7OC4aH z58^ZQno_mk$EbBG>L3VuW1NhLv8f%yRn`5rn3(=p0dm7i2F8D{=4wKg)=D>%g^da& zZ5C*pQV^?JdPc@-^I+b9WntE~ed4rY8+sVoJ@pCyvv@^iO~q>SU0hKHlBP=Ef)F{Y ziJMeDgE8q!=k(-B0Y2`uMjeqR26>hAWtfcCg*{x_S!K_j{B{bH* z8y4>8ojuKvDa|G?kBn~2+uzUjsa2JCs&$yOthDNjYWYG!9;i>zd6l#MwP6mAW<-i5 zc~txX&9*)YjIc4>+jib$Ztt+%VOg{aJE&D5;aVh;LNWoeCw_$p^?Ad3L3jK#wIr%2&MUQ1jOD;`{ zDPK?Co#jRCcpcymU2y9pDhU(Vs&d6h)7V^>xxU%=SwMmF#6tu|Iz=@G+QqOxBr{{o zV1kswxM)4nU(O}$Pm^j4HOnA70~rmIW{Ptger!^@DFtQXN+1;%$uWNjiGC9~$>4Jwv6KEH3Z-{?&X) zp6^%lo(S{ zlLn|mOHeRCGlEVt_OwEd5%7znp_$8=pz^%$QrH#8`O^5U01EU4Hg+!PSdgfv0+)!QtrK|!k^p^3u3otkvsKB}meONeJ zI5Yq_*ODogijvMK`5q|c9K^(Wwq}MnoU0x896iZus-4kS8ehRuI9bkaM3-4izw6lO z=4iI17d`)O_v5XUQ7U(H+VAql*-`z7N+UzYg}Lrphpx}x-3Tpx9&`m%$85@(p4!Yo z9b=Q~$$RzD79CpW!%un65_iRrOi6&+G_fY*xQvz<3c|VYiZxj`Cu{pQOG6GXjPss< zulzmvj5xaIyMxLhJRv3^Xy+g(89kJ*?UDoZrXfv7mUH)q*lp>EHTK1{^KAGdb3}vs ztcMG#C`&26K*0KW`Ap6$e2sSy*^jq{cqtZKn>L_ zLX7gSvB1gShEsCccYbEcNBQfOnmA0?yLF*Tb*tSsCt@d1K;5Y-MT`}G{eEPG(g^in zoobq-#DqG=b*29v8aUXcV<>q4N@F7}lWryh6FM#3HEJYrEcZ{JO7l+tGt*8jDZiq4 z@KZJ(s*l~S|Hx44{IS@yzSHs1U&yZQCbI&i-T|G&ucL3+(W&S(@VVQ_?BVXjY?T8+ zGy;aGG7oTT*yeA@ALiM3|3*?jDtjw(OOvAdB5fSAP}f+qZJ7NChQ)mvSqVL~rjdx~ zP}Jdf1!ejFI>T)D1zo!*t+8XqHC`MWuMkCNBjJ5eRILsinsfkKzI=~*15iw?rZ9En z!Lu1`*m|NX{rYGral?`cMO-U3xrp`ek8wQuku=4b6vWE!VkGtR+7vef`+lkg`7ah| zin8O-`Q{Ap(|D4>A41u_boG(sHA@?o?;fKKO^An`i562Hdo%w_Lec^R{J?24L_I>? zm>}al)py9@_wbFJk#jRfIb@VlLd);D_Fk(H%t~zO^KFymu|v|@NuItFgC4DsAln+b zEG6-8{b5RT9J5e1T;3${k2~NB^#h7by>8E+6SEK*orJ?-st%~&?PnP=JVB5)RjI1S zKO9T^9xuF%^BE>*oz7yn1?*#G&|_oF%Ums85Nc+4b) z&Tm@Pth2Bn-ie2V%qZH4sXCWElfEztjuyvi6J5rK)JqRaC45R_bHi|XGhBxAZ>DkV z7py7+Nc$7+^TN0U{T++bt&wciBtb62aixsWceo~|;UmAUC*Jr9bnQ2!98df!EqlUR z^dd=A2<;XymMAz)@4axlg;@j2g8k6HDo1IvfZ&^8cdotMy1H2UpgZqy8AB@|s~TcQ zpZms3tU@T#W)?8pMglY8$G#nQKa(~1z@3U&DtBLpoNf%AZ!%kM?YpRwBZr}^K>`e) z8;|F$Cs8LcHQq;0y*K6k?(VJ153s8e*tdw-_(gtPJ$h(bfvK$Voyi)Iq#4d4j8uilG_`X{A+~yU9A=zM3}sR_DA} zHJm@_?6ZdU0H^kgfhIBkNf=#@3hb3r6H0G43%6PS$>Q&!8j^nNFN49iY2Tzhgm!BF zo@qRou*=DJPvoUalX)nMYjG^}B`v-lp_|{FRY&$qwF!s+j@F) z1f8B#HHVovB*pzWNN-ad-Y|aL&Hy>Aum-b6dL8wM_|ZaA)|9Pg=asFAY2T*M8}OA| z8h&P6NcSt5Z0hj|>|SbzKYgN_9rvrGRU)rllK+mvy@a)s zR>t(brcr(Y)tf_46J;Xt+GRvzF|g||aO)CVVB4uIwRVZ=TV@ppT8q5}IS-3dDWz&! zGU}rm3)bs&e~1jBrotgne&%g~ha&&NFJu1_?P!PyhCkK1ULEr8y-XVF&#SS8(FqEn z^RhqWtfkDzrjF1- zTf-P}qa#<-$pu^wRJDEksmb=@Eip`ilR>32+ybdsyVKWQF4@#q9m9PbQ4B->2?iOq&f5+;l6^oNK4UC3+}pe~DR>ZS1d$4oV;Hj7$^NE@UYTwwoYpxT zjbu8u@vwaGfRm}N5f^XCZW8QE2@?qoaa_Y6C?@r z!o4YJw!Q+cg~2XA*AkC};$k^Z|CKgAnlfPkRMJjU@&VyF*NagsWiDCzGK_O>81bYN3uQ5+zQrIYVGmNb87ld13FvgEp9c9; z{0{Wu_1d1CdBN8iObj15a~+l%)2%&e<*uJ=sPPR@`1vI{Bx+%~!d}k_lY+;`*D)3A z%Y8O}L?$+w9}gKY@&2CsEQnNMPMqU(&FnM%TY+;Y0;wm!*f$K{IxvU%pjlegoKS9rt)pg!!0$(%z)_Yp@l#1Tgp?3Ko7RxXWoU@D;VLs6Sh;QDr?(9EOA zyGV&h^@UsLri-EBhiXLf@LZF%T&$kmB+!P_f0e-mgcgjz z#JEQmkC=y@{{92Z9!Zu7w?Kq#` zk=J28;W-E8n!_QAgM|{lP%Rgov`99&dw^aM@Ph6Wgj6s#Y zGt41)!VH`jGb6<;$L_xKvc89y!fo{A2}2V+`;QZ$lsq5_0(|Sv!#^)e^d*uxKClh# zzoch8O7F{0t7^wKPgGj0VNv{h_)aG_=MNE+b?YFzFhu@Eg9u0-cK0jqo?gr>kpzWdWx= zeNx7t{l!!3FA;I243aBeVq3s06(}z~HDW+#v-Mo8*jadu~Z0H7U`KN1wTp zH|CC#b2S6k@SMu=|1ngU*F|fumgP{o^M~HxTGrJ#L4Go zhx6YR<4bbKP#$y++l6^0RP#N4+?5-fK*7sTteXl9p<&S(DRN3iwr(*)0Aj zPTp|0ce`;>DLMS5@IJjXnG{%{^k6J^XXp< zN8bAg0cGhz1gQvQ#FO*X6G+aBq8~jMuCwE>UyNPM%FHfKOBz6)t;l-_arrbJejrOb z;NJ?J+_+Wxu+k}8N+ZubBKjk2--1J|e%y3i&M$Hev67(4v=>1|B$;J7zFvm-tPY;o zl=m0VT^qNV4rfI6dDcb$5$RQIlM4!H8Y@#cJ~^0buBI^25w4b0J4xg~nV_vFGusd8 ze<$EG{UIgk|KaiW?r5RjHe0R@Yz}DTmf(Y7ZA;!ShdxAwl08&F+4F;ylm!X}BlWNc zE2i9RMB#Dk4B~IgP^-v?iK$tn;>W%tMb9-Il4VXM&rkLSL{=Mh&c7HS`R{EOmf{ln zSXh3_Ip#L=OR<6^>amBA%gE3@{^>O5+lJFBs`9R2^x;BulI^&4 zYt&3fQi+g{T47J@1i!B1P@d*Usj1ZZV79UjvEr=Vv+YBjLai<1{N<1Ck)o!?+cD~r z)G60uDo{Be#ZDX<=p#CQT|etlAN}#@U2)22^T>xdVxKQvJ;mqD ziGxtW*968{Ay1mTQXKSWc4fUgFb>EawEGWwsmk{QRoOQPs$8R8ORWLJk*3F~vQui9Mvg{k(C;% z*rykB??&amWHLpP*E;tQQgH);MgI>)O^`mW!%j~By%YQP2dSL{ie0gBm{w8|p>WX*aa&*1Kc=aCRM?JyiA#*?WQemr0>YF@F#orGdykOyYqP z=XUSOzr>D(!+sxdj>>`acgtB)nTebQU7t~-TiFMh(T{B0SE)8kh*h~8w;F)Kk1c-% z3suDz+y@Lwjg{_U#!JX3h1*BrA;O{a^}e?k6s8=TMfc7pkPD(?S;VGm%odXRWIx~L zX%#y098Wf3s7DH>OT$NF2kH)25`mt&ny=(AY#Lepyb1@s6olR5&eJ)=F-1JhJk4=& zkVr!@;PA&+1_cfYHN({igHjq3MimN0Tt;2iWEVbl+dMw8ia^Q2}P79EnuNnMT&$H zLLhXa7(lwxn{)_0(t9Vg5O|xT_j^6}-S-zff8nQmHfygv*IILqImTFe)ixLD+^jtM zHzs5cWOY6P*(WP|ct2dF%+2R#sG3rX=wCmO%go|N#_DA;`##chPYraC-n3JDhuzOS z7Xm(!3oUGp;y(?4qK=m2MOK~{(#u`=vQkM-1<0;TgG}M${S{s>@PFg6y|p;VH;uu@ z*qsnXK+^Zn?62^x;O&fUe=PkRsOF&b0H0;%K^MF8Nt2fWXRB}W4U8bX^Vb{uQEXBqp3_IxWmHxQys57(t zkWWGv44G%F}bX|#ql`|k5%A^j0;SW;P{ebTZ-r;l?RvA;9pfX>TG zK7%gwpk4t;G*Duj^&z+2`eI;(bx^T;EX_OZva7g;JyVdTvF`0367xeDVyw)Y?q7v7 z51Gs!?huzKXYZ(;v#h798u4-I(y7$g;zoF^yvN`IoVuS&zOaj>I9^c(A|W#OCHM^< z=(hCLq+*Ysy>jicNiWc)cGl8`?#+8MrlMNAhFUsIry8x;IC%lVslY=Q4cHTK2*wtvp#6YjSjJQkO|1*@?2BDHbY@tqJ=^^EP0 zccdTAE#zEH@<_k9Wa^q}<0u>y?7M<7#zVU_1$@mZY+q8Qy=&SLWEz>e*-9Y2Ym%{q zFGPJ4b8a==QisLBoyvC{`+aAwFZAy!+7afqMY|)bx4dy|$CkX8gKhj;6%az}9Wxt6 zZclwtm3aL0##!?Wi&?YIqZQ_PD%Z5EsPBZuzPUDCRJOxykM+q}p}i?)k#N~t*)S$C zfu7B`IW&FG&Uwy0umeqmUKMQLdx08cbo*-NwI%z{usZI;`7g(GJz>dL!Zm5%N59X%z4)Hl-3F<;Q-Zx&XBRPxfS$P)A(Jtu zOoG#DRIibKBs;ojmox;?2!iyZ`^L$$NHvFaKjDp;_IA^_d|VHMTvL`|%-@!J-RaTH zC>i}=kgTMYRN_s>$-2XE0L^wP?x*>=@9rH{BqFm>{mx7AYpjUVi|vC4y%$oiTJ_$c z8(6Cx-V7O_V-zY~xYm}P!M^D!!e0FSOhrE$mzu__4rHukZ5^VrZQwnbQpInrT8NTG zIA*Bl>Da+-NL+b63Ve&~eSn;|yT(b4U!AVO-MBnb~u&wTzWa-MZt>-ho z)eB>rH+|aHD(5$nIX^8N;)2=eGp`?~7LJr!SIMJ+NGE20fE)STZRze+xe!j4sGPi9rY?yHrww9P7Hk6EIn7x!hwlA;SS6vPK6El$&c1-x zg|KmiD+p6=>jn-#E~I zEZ{2yC?!0try2+=-dURWq279`oC@)}Ct`Q-;^E2JilGE`koePwqk`0@Y;!= zwH_beQDQJ;=-)3)UM=M(ou==SxvY5`=@2)vdE)ZUtUh}Hw;3^ghGMFF2BY`_^ymq<5(oLQlZN!MP=O`N_7 ztCZT-2C+S;$$1?WV2_kR>)fzthzJjfuUC%rbEd@sJ|dav)ZCK9of8<^-Po=u%%d*s z$J#gVo!DRN-xW*rf+FGuK3mWDB#S*(B;>T)F>0LxAP-uBD0B-T=1y49qK;S?V)XOh zAlQ{an%7yY^zCWe{7xSzM@2K!S&9^-_ZR>@>Q3{qQWxJA_#W#iRNfPw_XaO`mdf$E zMt6O9Te31pXoo$7?rjTA#}J{l2R!e!!j^t+t|Ad~Tj*Bx9O=YW_}wPC)Gi`9=)HAC ztOkIM*m#M^*PV#GMX@0wgWX0&i6Pjl@J;n^&TE~*Cd_B?vZf^0GR%_W(y**=w}H$? z3XKT0%nT#~V9E0WTRlC!dob1had&xvj6Tk8_r z=Eyiy&7Mc3qPhhxdE(HbOPM&i#0@)~dP6KT6;UycCPBP9Zats!-# z(J)%fLvW0|qjE|5R7Rn@T*{m(x~^S-?c?mVd&8gSx-$YtFa$x<(n+797b~Ms*_;;f zHRq1o1RM+&_tX{v7WJ>*T@ZDkzJ|EEY&NG2{-$_0P`)LUAi1VMtbK!1ivXwxAoa7B z_^_e_fxv~Eq!?|krTou7ng6fqF92|>#43`8nI&>_m4Vyj;@JX#$)$Eg^MX4WT?L?4 z7aTbiD%4_4l92kMlZo!+KNu_{l=STnuJq5E7xxbs9=;KBpg_EyPE#sF-qU^Cno}(i zf-TJzGFdnrObWWy!4B#KOU6)(odWsc-2~dI%%nRWT+tjYM-^Su3uQfa+n*=YoVV)hRu_tHvKi4!&aLQ+xY14G(rC zu;KZQe891de75L~aas4Mvn$|v0x*I)RO!0VaLc4;!{Vdv9QF~my?8r<;9k7#D?cnf z*CNW1GwY*c77pOL+vaPLOl<~Mb;)6YwDWghx5sZPun6$70e4}nz~-}*$#t?O;pi}1 zmbx=WfeU&cvfhb8r8P)tdhb;r)A&K-er24Wuq8$EI{}$n^+pM89h_)NI~rxp85=GIAfTvYejK<(rouzv74)b%&N^(`rZD2?EJx)KJ}^766z7E3mko9;}YS!Fg(lEHc2N>a6IL z_S~+i`eAjD&~O~Uo*>7izocuL>mEbXtl8SFeZ5Z?0UuK_0N(zaUtk{%`{rD>C0_di z7}b6;I`gaJtS`WXC>gDx)u%lkC7^-U85=u6b52p#tjOLtALZ=|jiN-aBko4Z6SUQ2 z%~6#I@^l-7!(g4su}wHSm>B16ZhV)xlM^c%c@djmuMK`>xr6A+v7OFTaY6G2Gwy{G zEk}PYb#2q5mA+Cn@$C)vFfGh1OEKkRXH6(Tc^Dk>d5j4hjh30e@!|>!Ioa(u=pxl8 z_+@KI^jgS#B>-7j;#O7wwt;uk3?}PA$yc!K_A2;Q%LlZ$*QE`bva%M{PD5@wYpm2j z^XNm-Ph3Avf9o#V6|?Hk+uGt;SonsC z)XUQtyYU=F{l`e1yH?)D_DS8--xF#gn|(%rnr<1|YY2Tl(E*P|YdGN}LPlb{CPB-g zW;wT`gN1_gKXNh#3A!NGN>#(6d2iIU|D?IuxC0m=i|Km<(!e_%Q${*XF)#DcZlS}F ziv&c$PS6#)N26=0rG~^kj#GdsgJ>>idqp|AC|0WX9juL~A(P+P8~Y2dS!R*0vZ2(Xr2==h zLEp~%z9eKz>_RVvW1fMph1)jzwLcxi&wY%ndz1L_p$pHm9Lq0f!b9%ne!hM=O7s!l zNypUg96U|ui(myaZDhgUmgDMy3sNqcAZkb^(6PrEG-BKJO?WW9pT;Yp>lH@o5%K^V zkgLA^XC`lBbkrF%GoHaH31{<9U{u)v`NGI^f-gJBWBd^F#YlV1ydg(OhABK2?z_EK zxxZ;#xk#Fke(RC8DHFn~AiK>Vd_j5C9B45gT3ZAXt;D@fxlDaOv?U`%Ghg%H@voF# z)Cs?=*#f$~D!C%mu9xxA*A(XJ=o0x8prVfAxL}a~(AYq$33M0A#4}JpYZ*nCm+c5q zQ-46mF9PC_0a@0CFkv|>NY6%q$SOY`Wc$Vj^&m+yp6bo&tz;$5tKnE$%0gk!RKmoA zre`_*T?@tm!jd?5?Myq}@EC8+SDHp4Qp?&7=rF39om~MS_absm6*ZiYL&R!xDc4;7 znJi}i?6t$z;R!THYj?RkRgdHaQqR2c`}~ z)IJz|KL1&B8@wHKqzUWMk%PoS@iyN%0U}M-0<>NYc z1I)U?{8RT9bB#aSA`CFeAp*E0K<~r*xT!Z-&sPck!3TR4d><(vs%@wYnH?t?W(!1j z1_=wm*_R=o(#J&8KLRCG356sfAMagNXRrJZQk3%iCqW~WagPz*0|&^07m|aqf~;Pn z+_nZh>shLn)XZ$Hi^gKrZR8DcO%AJ3LdmSuf-}GZ_6%CbY8jWNlWx0>xe^Nr-YyYJ z-$K~AD`DtuljN=HuXF?Kg8O&^#v`?0CS$^OJ|^Gz*CZ)itvvsZ?O<~?lQU^U^Kz$~ zbZf(zoO$PL#QQ!V=o$IoP;K}AUWqw#X=9v1w*%{(Z-$EWwuDFw24h2%VP;b=Do zQR&}&>phz}4v~JWrRn+r&*@LCNBsAhsmj7VJyMLTF4!6vS`SBV3!eXS^=5uqsxntw6xE6mRe& z&0=1?&XTDz^BK;dJ}S74b6={w8PoGl>MTQZqZ&r3)NRSLza+r9FUN;%o~Y*qpgXDo z0;Lyg0?yvaTTXu`v(_m>3!cFEp0X_1zoSI$bi5-HdEW8a~)+2$h||JUQsz z!fk4ti=Q5v&}pB`n`AunK#VRV&yIHR@udVpdb1kEMz>s!kI}UJICKFeh0Fzm6q?2#{RLsOH)!Tuq&YDcR4k@}O`|M?<%qQn2`DNd^>vSh#YRCjfF}Jt;mJhYa#82ICa^v zJ2L(=OQi0l{09vKD{Yi7()T`Zqd|8pd!BU`dYB?5-b;EVA*(*MnQ9eni>7B+LQ>1y z0eVX?_+)QS3_zb7D__{i-sp{6KAUGo1)ZA!h?c>ztPf;5=I$#UzA=(D)K=ivlIxZq zr(?;cbkOGs9+y){G=xY5#OfQM36ni(I~6@%l!vY|j3*iGTuZnC_C^kgys{Nlts+2_FkvHrapSugygg zEBMtK&8D~cqCNfQ%|S*|-4s)a0OQ@A+1RPip2`@VQ6q_>r;xZPisRO?Ix+(2+q*56 zpjKnvLwj=T_0;k}h(2X}=8sii7Vll&X^ctt74u+gT0umA{|m-4f28{Z^bQ79I^t`U z`p=92;$VOQ_i>6ojLu+f@BCU|%p_Uc0u$9T&^K3`&=CkIyy~EI>7XQS8xf^+!J~Og zkD%zxE7Q#%srKL{Hkzg&8E^N^?3FkH6J`NA(>y{BuXDEO=jRjPZa#6^h)smIo>F15 z7iYVAx1|eC%28%Hb7d$CK50~CpH2S;wP zL%i!;U+cNtq$~cS9?BUzC5xsKZO|gJrrz5Z-_isFu@DbfRs)Z3T4-$jL5)AEkotXD zub*_xtl_r&b{a#%!C-F5{$8`8_9q4{+z&MA;x?XB@BMv^!EL_etSSIyKQnvWh;;Kc z#+FM&5fE#hvW$2oCq_lvBVu~f8(yl#y9C(!W$Rxu;qp-l_nY* z&X?tw`GW&m>X8)VmK1>-ZhW^R;lVIgxWOKdRR&JuZTkTY6nVv5GcQXe`@#f9b9&b$ z{WET_^ax~h=zh#T|B#rax3+O=1wq?mDNYIXqu#o8?3iH1krzPt6&Hl1e7wz*$cwwZ z((qbr6*4eziA~y5WIR6lg$>2h2qIWrvY_96Ytv9a51U$bvubxbp%eD5&?P^_kLyfO zwhdRF$no%-x(s~)jVosB744!D59GLFsay&J^*98#S=oQ;9_59!Stj)GdtW2Ze{|?? z)8%RcgiE86+R4%Jo_)SL+GFTe0AecD1P!crWHJ(&slwDM_HK))O}~%yA2_KPm|uLTaB;x3m||iXfd+W~osD@} z0m4m^bf7uRRjf87g`Ry4eN~y#kqrTSpCnh#So_OmQ9-Hs*b@17U}bJg<}J!Ovb}8c zfZi;RQix>ukJ!EudPLZ#2zg|VacJm0Dqog&^_w& z(u|WO&ue7B4ww>_yRr3=UurTgAlmY)CT5D@V=s{@*kppf%-7|W&S(U*gKz=wHAedzR} zh@0@k=7?Wt19L8UIk8j9qfSh^nl;E=^$m`y&7r zWaq_qcO#B z03D`j0sn(@UtDT8n?V@Red8KG&7J%QA_o5OaCNMr!`f_67l(7ScqY0-rnO2N0A7*F z*0h@M)qKTpr1w}5dy5qP0N&9Mp_Y6yf31z*=sMdUag>wE?Ua zD*1CiKmuEC$PP}qwoChYGwz{43t%xB2`2XyZoOiY!54(Z9_w4j%|o`8M4cJ$#y}f5 zi4qI@DDU+q8{=mq?BT*)+och@p{xsRfy7|a0%1mKy`odM4!UMt?RUDuz~))t|vD@mc=A`Y5`e0uCE1laQVrrkCafL&@EAEyj?AGNxb`bdX%GA5{ZH{r)4v@nBJw&h7LzKc7I)_Tp$`167|C$>sy!T}0U@;-a*ZYAu~ zW2JdxTbJMinxfbbZQI5U1QkZ60RhsOEa_2jI4yX*p*3~+WdI@2Vis3!3kB@~hJ$Sm zbh30fK9O8I0qe=|Jq<6p(}(~=YI=Zzt|p(lRSchz0tCh7GdY!{GHtcSRBg`0(7l^I zj6WK$FQT@x2W1k(9R+(dMGCKZ8_?O=?jbao?az^C^&9kORTPfBnrGI&l>gP}ng{fj z*@$)fz^`TWRaq5~l(C#%9-901TDClmn!c{c0cDK|7=AJXBby2tEYRiFZ3#`y(CUbE z)n#0-DE2`LtiHPoNO0n51W`o^Cae=<8YpBZZ&@7lmsvvmu2)|D=69>T1oz-3?RbfDB24U24$so-dYPB zd%WVcwFu9i(apkEWd~UBg>^{i7jT}402uqsf1ju>nbr3_Ehu(gu|B0|;T|ZTxJM#Tyi+SF{1++V zpHK=pEn>!l@#HFt?RCJ1MMks8tU}Ayr`f^R)RGk9AJTvRIy!W#rf(OY0tnFX(*&Oe zr0E_tip{AgFMdc?+_qkf&&GJwoM&PM!*Dwg+?$&`)NW|A_ddyOH*WDUjExLz`U6(% z#v89*Gc1)2D4_OEikK0m6YVN30N@B(ywJzP5-;u~5D#z$!Rks2*9;+!)iw6OJ2?%J z?jSf1UuSWuPbj&Oj5P~83%Y@gJ!Jmak>nQ|3*~q4t0ZMV0-GyxBC(`ea$n;aN?oC@ z0NXR0P4!buB9?Q2ec~O>g|42Pc{^#xu1XAAHom<^tz`+wjtbjg0fR-hy?kC1;o_-w zI`q*Gw@kWS)(dwe>}37fvMVrIYLeEP>>U-IA&@3*%?3lAHgAB*%VmaA*#>vV0EQe4 z;a9p=!U1J*cm&h3DVo!90@(fx2^kco{hLM~ua?q)q;Gr%NWxQldPERf-+tb-($4bU zPn_~sjw3-84rn=cUPeC5Y|&%Kt*yHs@~6JLX^AU$u@MOaf4pLJuP(NI-eKESwkE%H zO4&?ky1Q>ZA2tN3dHTuFY;}%ysN6uM;DH8!=tU|HjH3g6r>Ca01~bv(#%I_?HyT1^ z>bP(1<+OTsDl%H<(ha+KL!D4r6@EqD zzUkI@$ikQ*s(t$wj%E!YH4+A^`g`IYH_*uvG7|uZqi@~>lErv3QzjI9w>P8i1mNJ# z^R-JfT{KB+{SI_oG;eMgT4)<{??tbYY5;7lomcPlOp0Nzo~m8bM2iJbY{ARG+c$ky zdU3B4yz`8B0B+S9TnRZCi-R-jNPUC=iejJ%R88U!Ya%f2{OaU;mld%7*J<;Q-AT|% zka%<_Z+Urr#?@UB)ZY6!xQu7 zvK3g#N%?HWfaHjCYLd&^4Cd-|J+o}_yEl$u)zPz`0desP#{jNUh_Ts^qVI0RFYH0T zzP`cXuromzIxE98PiJ=JOT5s;2x-)cZGRYgCxk1kPv_D3q@34RQIDg=QtQcj?wfv* z=lSl1MSaT6$*p5=4fPj3YL?6IZO*+HPYZ%sRryey=vqJ}I>fIxHY)(>1#}F&|LP$+ z5FD?OEF}R_)p@F!@Z>9+7v}%^LehKr5AL@*iyev2vJ1_avcoRjzP=qJ^yD^hdZ^2z(@co)cUwVZczzmzcuPhQTy>76a^@h) zz^L*<&(}inln>w6IMXsBpIT7Z$~y!pEp&^1XJqX%Jb9e5BE{e%V=u&rXQr3CnpJgP zPBa*N!0@VFd#LIq0EoU2ZDd_kDHk2oO^U3D&vgxTtBPnF18Nn&Qj<+W#haY#q99ZYnaSD)}$*Y7rF?20ZO*B1WK(UYKy1Y7%A@T+9? z6y&dcyav0=AZy)=;!T&{>bEG_V7>K7ZZuL)GP=ntrJpW}!%{8lG9!u^%WM5V+>74I zO#}-2xS5E_+6mm-?|W)XIzv`(8HW`YQ(|~KY}}eIE(XNP7RwU1E|hIz+51b(&P*rf zR8H|TB3j}i4zh)eDb&Q37Ps$tvY!A-Qt|HlvVp&VgRS};outS}qe5cpeGS1UywB4# zybp)H=xkhWh6m|1j;|1Q&l5JdT|b$hIIuVLKqNwda#qu~bbi4tA67F^S=!@a*1A)W za8Q?DLLn}KizSx#tBL`6nQ~dhl5a_Gd#GoVUXgHqJuq_f&!XZ4@Kg_^)sibHHR9|735-I~UuvmkLV$>JGHo;|=gTS0N3MsECQ+NzRy5LS}Yu69!X0^LJ34_Kc{ygb5F z1>+1bH-}T56YU)L3JCnD<;#Erhj^+#tXtE^fuKalw3A+GC*oIFUqlPlQ5?BKy&ssD zX;_-%ss2b1bXK1ZBel)yRd$za|9frMFSCi0zGn?84h_T9qtlo4rIAB4sjf=*X z%B)QQ6ZUU)B_Mh2z0f?%R=$Cyp=Zms-(a}W^r-ekNET)VPeg4$PY^9i0y;%c7Dg$X z$YWe3j0(HpYdN6uCuCK5nrIP-&; z1Ju}16iCa4YYM0W>uo@F=jj4BSMy7Spc1?T>B%*f>8VPkw=${5*fCZC1vKN1iNOlDrc1# zNZ;Uf>b93XIg?AB+{S(79lDjo*8Df?GglFLt1zJvL^U<4Afw?$E^F&aSz`l_qi2lQIF%-)J6hE~&t z8+3|X)r9e)5Cs0R2^IEVF2gTRo@9@!%YjDwaLH_97Znzu zK0GjgEYNZVXYrmnh36zKv!{Mu^4ZH`lX;FDvrcCyV)cNEx{6+SpvWPCcUY}2sgsm* zpapnosY1;ETHORcW(15rk-bOq9b|+JO4725c-Ft6k!Qh4V5Z8X z6IrIf4T%T7_DI4|uz_2Y=><3-Uq*&psP=PGE~`}@u-Q~Z3?@r^r3QLS&sOct=eW+R zxtdfLHeNlNY;a}tpvzMMshlLlT zU4McPu^SX`9tpE+5I^*DFkXO|dwZ%uj>gIdzRZ?Jg4%vF5Qw{Sm}sz{r4<^eU|Qq{Uo>KC}8OhTYwhZ59lt4jC#x@L1hVysK){l1sPdK zcyFN{q0dSCYplJWuqs34&lbxsMy}c!J)m1tW#;&BimpTEF&8rSg8V6P^UkSwBc2PI z8%S$Avk!@T7Z24AyYvdG+{a7=%pYcQ*1W=d^1@LBT18-mt4k3w>J0zZt>QP#znN2} zpJUJ~iLyqKmw?0GZr(QeNj>+Lz;+_YH<0@2*d+v1e4m%H5ym zwd+~%dZU zpw6>l&cktGpfPi6;{~;^X2F8(d{0(M-~@16R?VpQ=T%#swZU7SnSHbIKy&NOAC zfB5bIV;A0jK)4w8DLq;Ab=p7Ot6oRZ0O2)H1xX^FDQ}$FdAc>rRTI7)sm&!=|F58E zluy|MR%x%!8jOw|-*X48p~=G$Dsa%N7_t{&!s6S@^NwD7)^+vAH!QE%E|Th9U!KW~ z4CbmbheTAjmq_zGP!Q!XCG&)-ck$dwd5a)a5ty!a^_EOj?7S%v4+*_}-<^sSo@wTP97?x(L9n$rqC{=~U|b2b;xR(n4mPeH_pwE?EjAop)*_~e1&NK9<2PxfgnpE)u zt|77w2Y0p?`exNx)7^X29I!p=B?J|d^f@Z-g(X=FYtROU z1PTL=J3(7#8+6fT)cmCe)HHm0mwm8?)UxpI=ki1lB}#-KL3df~CiFVA&UXR>XB5*X z&#OC?A0CkHBpT%bp_FoDgn?O9oKMEM0niM=1GVd4NGQNWDZIP$*Y6dIFue^F9d>MV zV8*=mvs-%ww{av}2DvB6$RS4CnXAQ+&i}}%XnAfh*KKX=W+cnrR!r>C=@fp&Gl_j@ z;ceqMM@JO3_XOQ{euG?Kow!owJdT5rBUr;9nPN_AP?-p2jQ1PX~G%%6WqdEJ+wCCO@V!?CQqR-C!#= zAd)f<2lan2-6Nv+6JEeEl?8sqn+T3rvZAorFJr8{@hYbTK;wnC0cF#FELRigJ~ggy zr+yMG>H1(=zn)U$;`VC9OzyKVr^d<5YNHm3OA67CGHx^|@% z(#Da&AD|@A-t>+_hsmVC)sfjuIMoXg=yw7jhIK$p!MJp9@v3YuTJ?;zNcD}UL`J~x z^&g>aVhtYmD9x~Bo{i^}2J`)MC^}&N@4q(ueGhF^OMwRn2a1>tj^&KnZ);o4Na60> z$uX~v2S}JM4yE<1p$-evGX;C5nMfb~GfHFCCXN;QT@t*x+IcM0_p(b;I~0gB2_QY) z4A*{DfP#IaFm|{v=&ZnYo*@Evy&~N#@>~*gbFCH}h;!`feU6tvA*cVWM|0nKca$IK zYH-{mQFP#ZSMqqDLD#a4)`*eKqRy0#`8*=Qf0643isZANWY^Cl?Sz|j6(fc>nr-o7LS8)w8a05Q(wIfb~mwpfK2)S30Mm)~5=h(d47sFZEp1FVgeoO>h|hF#C%IShcCB!VhP5AXg9|F}=Z{vF_K%fZr{wyG8(FU?l7 ze&?)r zgJHA>;&WuOv3*h9nHgJA%#zG&?C?vh3|d1(x+yZtV&RJ0PUfYg_if<;avCXyIJ3TV z^|)Dee(@vv`|ocj<4L9bfak*U2o25mbLG=HEP30{YUASin!!k!G^ikQI&HkvA1fIH z)YNpObeY~_ph4=Q!D=#-;`~4AYG9;a8F-&f0z8_bTEVP z>%XlSp4HM`89-|cI`|%%q8@Bw2TX9tr4ie$^?BqYPUKb^gOGFH_mKt@0{OxAkGd-2 zIBYMz`r=Yf`|Rg=1;qb+ePA|TF#?gp$SC%2l;EFvH$DSg^&y~f`1?orWqA;C46Q*+ zoA5to^XPH8)Id+28SDG|3jI0fSCs&>duo5p|K)Lg!1p#j(=GdZ*!&WrT$kf{|GJv% ze|el8Fz{UeIriVb=g$GDFkFpRy>EWue|cOXFz~+W&3`#`{Txu*Df;HLl#i$X@5ePl zfq~nZ@BN+={rZ*e$y1iP+Wme<+46sXqs=7kFD<9((zJMdCjr zFJQhJ-30w`@UI=frfrk{u9pR?&t3h{fk z`zM9?lS2F}jsBC6|H{h$q!52nh(9UBpYrzq7Zl>q_nw;yaMRe!Te-e=w8P_83_(pt z*Rjf-3KD+x`1e~H|G9FnoLVuy_@nQ?u2=i>>pycM_wt|c_|K(~|Iax2``Ey6%}2$k SQ$WleQ&oDPm@oh6_5T53T3U$! From 330450b87af380988bad8cc7f9a41c9379d85c84 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 17:00:41 +0100 Subject: [PATCH 37/38] Fix message container tests --- .../MessageContainerView_Tests.swift | 160 +++++++++++++----- 1 file changed, 115 insertions(+), 45 deletions(-) diff --git a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift index d6abf532b..560d91db9 100644 --- a/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift +++ b/StreamChatSwiftUITests/Tests/ChatChannel/MessageContainerView_Tests.swift @@ -124,7 +124,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let view = testMessageViewContainer(message: message, channel: .mockNonDMChannel()) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -140,7 +140,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let view = testMessageViewContainer(message: message, channel: .mockNonDMChannel()) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -161,7 +161,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let view = testMessageViewContainer(message: message, channel: .mockNonDMChannel()) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -275,7 +275,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let view = testMessageViewContainer(message: message, channel: .mockNonDMChannel()) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -293,7 +293,7 @@ class MessageContainerView_Tests: StreamChatTestCase { ) // When - let view = testMessageViewContainer(message: message) + let view = testMessageViewContainer(message: message, channel: .mockNonDMChannel()) // Then assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) @@ -413,20 +413,9 @@ class MessageContainerView_Tests: StreamChatTestCase { isSentByCurrentUser: true ) - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(config: .mock(repliesEnabled: true)), - message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil), - onLongPress: { _ in } - ) + let viewModel = MessageViewModel(message: message, channel: .mockDMChannel(config: .mock(repliesEnabled: true))) - XCTAssertTrue(view.isSwipeToReplyPossible) + XCTAssertTrue(viewModel.isSwipeToQuoteReplyPossible) } func test_isSwipeToReplyPossible_whenRepliesDisabled_whenMessageInteractable_shouldBeFalse() { @@ -438,20 +427,9 @@ class MessageContainerView_Tests: StreamChatTestCase { isSentByCurrentUser: true ) - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(config: .mock(repliesEnabled: false)), - message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil), - onLongPress: { _ in } - ) + let viewModel = MessageViewModel(message: message, channel: .mockDMChannel(config: .mock(repliesEnabled: false))) - XCTAssertFalse(view.isSwipeToReplyPossible) + XCTAssertFalse(viewModel.isSwipeToQuoteReplyPossible) } func test_isSwipeToReplyPossible_whenRepliesEnabled_whenMessageNotInteractable_shouldBeFalse() { @@ -464,20 +442,113 @@ class MessageContainerView_Tests: StreamChatTestCase { isSentByCurrentUser: true ) - let view = MessageContainerView( - factory: DefaultViewFactory.shared, - channel: .mockDMChannel(config: .mock(repliesEnabled: true)), + let viewModel = MessageViewModel(message: message, channel: .mockDMChannel(config: .mock(repliesEnabled: true))) + + XCTAssertFalse(viewModel.isSwipeToQuoteReplyPossible) + } + + func test_translatedText_showOriginalTranslatedButtonEnabled_originalTextShown_snapshot() { + // Given + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + author: .mock(id: .unique), + translations: [ + .spanish: "Hola" + ] + ) + let utils = Utils( + dateFormatter: EmptyDateFormatter(), + messageListConfig: .init( + messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: true) + ) + ) + streamChat = StreamChat(chatClient: chatClient, utils: utils) + + // When + let messageViewModel = MessageViewModel_Mock( message: message, - width: defaultScreenSize.width, - showsAllInfo: true, - isInThread: false, - isLast: false, - scrolledId: .constant(nil), - quotedMessage: .constant(nil), - onLongPress: { _ in } + channel: .mock( + cid: .unique, + membership: .mock(id: .unique, language: .spanish) + ) + ) + messageViewModel.mockOriginalTextShown = true + let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) + .environment(\.channelTranslationLanguage, .spanish) + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + + func test_translatedText_showOriginalTranslatedButtonEnabled_translatedTextShown_snapshot() { + // Given + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + author: .mock(id: .unique), + translations: [ + .spanish: "Hola" + ] + ) + let utils = Utils( + dateFormatter: EmptyDateFormatter(), + messageListConfig: .init( + messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: true) + ) + ) + streamChat = StreamChat(chatClient: chatClient, utils: utils) + + // When + let messageViewModel = MessageViewModel_Mock( + message: message, + channel: .mock( + cid: .unique, + membership: .mock(id: .unique, language: .spanish) + ) + ) + messageViewModel.mockOriginalTextShown = false + let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) + .environment(\.channelTranslationLanguage, .spanish) + + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) + } + + func test_translatedText_showOriginalTranslatedButtonDisabled_translatedTextShown_snapshot() { + // Given + let message = ChatMessage.mock( + id: .unique, + cid: .unique, + text: "Hello", + author: .mock(id: .unique), + translations: [ + .spanish: "Hola" + ] ) + let utils = Utils( + dateFormatter: EmptyDateFormatter(), + messageListConfig: .init( + messageDisplayOptions: MessageDisplayOptions(showOriginalTranslatedButton: false) + ) + ) + streamChat = StreamChat(chatClient: chatClient, utils: utils) + + // When + let messageViewModel = MessageViewModel_Mock( + message: message, + channel: .mock( + cid: .unique, + membership: .mock(id: .unique, language: .spanish) + ) + ) + let view = testMessageViewContainer(message: message, messageViewModel: messageViewModel) + .environment(\.channelTranslationLanguage, .spanish) - XCTAssertFalse(view.isSwipeToReplyPossible) + // Then + assertSnapshot(matching: view, as: .image(perceptualPrecision: precision)) } // MARK: - private @@ -497,10 +568,9 @@ class MessageContainerView_Tests: StreamChatTestCase { isLast: false, scrolledId: .constant(nil), quotedMessage: .constant(nil), - onLongPress: { _ in } + onLongPress: { _ in }, + viewModel: messageViewModel ?? MessageViewModel(message: message, channel: channel) ) - .environmentObject(ChatChannelViewModel(channelController: ChatChannelController_Mock.mock())) - .environmentObject(messageViewModel ?? MessageViewModel(message: message, channel: channel)) .frame(width: 375, height: 200) } } From 862593cb7b2f4f6ce226e40f06c989acc4c5f2b8 Mon Sep 17 00:00:00 2001 From: Nuno Vieira Date: Fri, 23 May 2025 17:14:32 +0100 Subject: [PATCH 38/38] Allow providing custom view models to reactions view --- .../ChatChannel/Reactions/ReactionsOverlayView.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift index e4a08a52d..a41e32d80 100644 --- a/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift +++ b/Sources/StreamChatSwiftUI/ChatChannel/Reactions/ReactionsOverlayView.swift @@ -44,15 +44,17 @@ public struct ReactionsOverlayView: View { minOriginY: CGFloat = 100, bottomOffset: CGFloat = 0, onBackgroundTap: @escaping () -> Void, - onActionExecuted: @escaping (MessageActionInfo) -> Void + onActionExecuted: @escaping (MessageActionInfo) -> Void, + viewModel: ReactionsOverlayViewModel? = nil, + messageViewModel: MessageViewModel? = nil ) { _viewModel = StateObject( - wrappedValue: ViewModelsFactory.makeReactionsOverlayViewModel( + wrappedValue: viewModel ?? ViewModelsFactory.makeReactionsOverlayViewModel( message: messageDisplayInfo.message ) ) _messageViewModel = StateObject( - wrappedValue: MessageViewModel( + wrappedValue: messageViewModel ?? MessageViewModel( message: messageDisplayInfo.message, channel: channel )