Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: salemove/ios-sdk-widgets
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: cdf1e062c5b7300a203677d1eb5d9d5c3fc4692f
Choose a base ref
..
head repository: salemove/ios-sdk-widgets
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: cac42b400c19ba7e1b78c643d3cfd5706488f1c7
Choose a head ref
2 changes: 1 addition & 1 deletion GliaWidgets.podspec
Original file line number Diff line number Diff line change
@@ -19,5 +19,5 @@ Pod::Spec.new do |s|
}
s.exclude_files = ['GliaWidgets/Window/**']

s.dependency 'GliaCoreSDK', '1.5.4'
s.dependency 'GliaCoreSDK', '1.5.5'
end
10 changes: 10 additions & 0 deletions GliaWidgets/Sources/View/Chat/Message/VisitorChatMessageView.swift
Original file line number Diff line number Diff line change
@@ -84,10 +84,20 @@ class VisitorChatMessageView: ChatMessageView {
target: self,
action: #selector(tapped)
)
tapRecognizer.delegate = self
addGestureRecognizer(tapRecognizer)
}

@objc private func tapped() {
messageTapped?()
}
}

extension VisitorChatMessageView: UIGestureRecognizerDelegate {
func gestureRecognizer(
_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer
) -> Bool {
true
}
}
21 changes: 20 additions & 1 deletion GliaWidgets/Sources/ViewModel/Chat/ChatViewModel.swift
Original file line number Diff line number Diff line change
@@ -204,6 +204,11 @@ class ChatViewModel: EngagementViewModel {
guard let self else { return }
switch result {
case let .success(message):
// When pending message is successfully delivered,
// it has to be removed from the `pendingMessages` list, to avoid
// situation where it gets sent again, for example after
// transfer to another operator.
removePendingMessage(by: message.id)
self.replace(
outgoingMessage,
uploads: [],
@@ -910,6 +915,10 @@ extension ChatViewModel {
) -> Bool {
return section.item(after: row) == nil
}

func removePendingMessage(by messageId: String) {
pendingMessages.removeAll { $0.payload.messageId.rawValue.uppercased() == messageId.uppercased() }
}
}

// MARK: Call
@@ -938,7 +947,7 @@ extension ChatViewModel {
}
}

// MARK: Site Confgurations
// MARK: Site Configurations

extension ChatViewModel {
func fetchSiteConfigurations() {
@@ -976,5 +985,15 @@ extension ChatViewModel {
self.messageText = text
self.sendMessage()
}

/// Sets pending messages list for unit testing
func setPendingMessagesForTesting(_ message: [OutgoingMessage]) {
self.pendingMessages = message
}

/// Gets pending messages list for unit testing
func getPendingMessageForTesting() -> [OutgoingMessage] {
self.pendingMessages
}
}
#endif
23 changes: 23 additions & 0 deletions GliaWidgetsTests/Sources/ChatViewModel/ChatViewModelTests.swift
Original file line number Diff line number Diff line change
@@ -918,6 +918,29 @@ class ChatViewModelTests: XCTestCase {
viewModel.event(.sendTapped)
XCTAssertEqual(calls, [.quickReplyHidden])
}

func test_pendingMessageGetsRemovedFromListWhenMessageIsSentSuccesfully() {
var interactorEnv = Interactor.Environment(coreSdk: .failing, gcd: .mock, log: .mock)
interactorEnv.coreSdk.sendMessageWithMessagePayload = { payload, callback in
callback(.success(.mock(id: payload.messageId.rawValue)))
}
let interactor = Interactor.mock(environment: interactorEnv)
var viewModelEnv = ChatViewModel.Environment.failing()
viewModelEnv.fileManager.urlsForDirectoryInDomainMask = { _, _ in [.mock] }
viewModelEnv.fileManager.createDirectoryAtUrlWithIntermediateDirectories = { _, _, _ in }
viewModelEnv.createFileUploadListModel = { _ in .mock() }
viewModelEnv.fetchSiteConfigurations = { _ in }
viewModelEnv.log = .mock
let viewModel = ChatViewModel.mock(interactor: interactor, environment: viewModelEnv)
let pendingMessages: [OutgoingMessage] = [
.mock(payload: .mock(messageIdSuffix: "0")),
.mock(payload: .mock(messageIdSuffix: "1"))
]
viewModel.setPendingMessagesForTesting(pendingMessages)
XCTAssertEqual(pendingMessages, viewModel.getPendingMessageForTesting())
viewModel.update(for: .engaged(.mock()))
XCTAssertTrue(viewModel.getPendingMessageForTesting().isEmpty)
}
}

extension ChatChoiceCardOption {
4 changes: 2 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -35,8 +35,8 @@ let package = Package(
),
.binaryTarget(
name: "GliaCoreSDK",
url: "https://github.com/salemove/ios-bundle/releases/download/1.5.4/GliaCoreSDK.xcframework.zip",
checksum: "a740f6d42f7f89c1f8feb04a3bbdb6424d66a94b39d457597ae6f384ea4a8ad5"
url: "https://github.com/salemove/ios-bundle/releases/download/1.5.5/GliaCoreSDK.xcframework.zip",
checksum: "21132a5eeb2ce1f4a4e75f4d2ea1c8c77ac4aead2c3ed000dadffbe9489ff899"
),
.binaryTarget(
name: "GliaWidgetsSDKXcf",
4 changes: 2 additions & 2 deletions Podfile.lock
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ PODS:
- AccessibilitySnapshot/Core
- SnapshotTesting (~> 1.0)
- GliaCoreDependency (2.3.0)
- GliaCoreSDK (1.5.4):
- GliaCoreSDK (1.5.5):
- GliaCoreDependency (= 2.3.0)
- TwilioVoice (= 6.8.0)
- WebRTC-lib (= 119.0.0)
@@ -34,7 +34,7 @@ SPEC REPOS:
SPEC CHECKSUMS:
AccessibilitySnapshot: a91e4a69f870188b51f43863d9fc7269d07cdd93
GliaCoreDependency: 37f48a5a32e2646617b87cbe9d4b30eedd123f6f
GliaCoreSDK: da5ed1a3d8fa7db7b9ace3cbb1fbda01a2c9b7cd
GliaCoreSDK: b03e775f43b7c4c144bd208e4b4338d7e06a6812
SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b
SwiftLint: eb47480d47c982481592c195c221d11013a679cc
TwilioVoice: 9563c9ad71b9ab7bbad0b59b67cfe4be96c75d23