Skip to content

Commit ef16303

Browse files
rasmustautsgliagithub-review-helper
authored andcommitted
Replace InteractorProviding with InteractorPublisher
After Interactor was refactored to be Published property, interactorProviding was replaced with interactorPublisher using Combine MOB-3982
1 parent 8680815 commit ef16303

15 files changed

+153
-46
lines changed

GliaWidgets.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,7 @@
900900
C090478A2B7E5C66003C437C /* AttachmentSourceListStyle.Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09047892B7E5C66003C437C /* AttachmentSourceListStyle.Equatable.swift */; };
901901
C090478C2B7E5C8F003C437C /* FilePreviewStyle.Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C090478B2B7E5C8F003C437C /* FilePreviewStyle.Equatable.swift */; };
902902
C096B40B297EBDE400F0C552 /* VisitorCodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C096B40A297EBDE400F0C552 /* VisitorCodeTests.swift */; };
903+
C0AF097D2D4B748300699E83 /* AnyPublisher.mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0AF097C2D4B747700699E83 /* AnyPublisher.mock.swift */; };
903904
C0B325E72AC5A8FA006BC430 /* AlertViewController+LiveObservationConfirmation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B325E62AC5A8FA006BC430 /* AlertViewController+LiveObservationConfirmation.swift */; };
904905
C0C5BB772CAD4278001B2025 /* MediaTypeItemStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C5BB762CAD4259001B2025 /* MediaTypeItemStyle.swift */; };
905906
C0C5BB792CAD42FD001B2025 /* MediaTypeItemStyle.RemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C5BB782CAD42FD001B2025 /* MediaTypeItemStyle.RemoteConfig.swift */; };
@@ -1987,6 +1988,7 @@
19871988
C09047892B7E5C66003C437C /* AttachmentSourceListStyle.Equatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentSourceListStyle.Equatable.swift; sourceTree = "<group>"; };
19881989
C090478B2B7E5C8F003C437C /* FilePreviewStyle.Equatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilePreviewStyle.Equatable.swift; sourceTree = "<group>"; };
19891990
C096B40A297EBDE400F0C552 /* VisitorCodeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisitorCodeTests.swift; sourceTree = "<group>"; };
1991+
C0AF097C2D4B747700699E83 /* AnyPublisher.mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyPublisher.mock.swift; sourceTree = "<group>"; };
19901992
C0B325E62AC5A8FA006BC430 /* AlertViewController+LiveObservationConfirmation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AlertViewController+LiveObservationConfirmation.swift"; sourceTree = "<group>"; };
19911993
C0C5BB762CAD4259001B2025 /* MediaTypeItemStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaTypeItemStyle.swift; sourceTree = "<group>"; };
19921994
C0C5BB782CAD42FD001B2025 /* MediaTypeItemStyle.RemoteConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaTypeItemStyle.RemoteConfig.swift; sourceTree = "<group>"; };
@@ -2825,6 +2827,7 @@
28252827
1A60AFC12566857200E53F53 /* Sources */ = {
28262828
isa = PBXGroup;
28272829
children = (
2830+
C0AF097B2D4B746E00699E83 /* Combine */,
28282831
2198B7AA2CAEB13E002C442B /* QueuesMonitor */,
28292832
215A25922CA44D900013023E /* EngagementLauncher */,
28302833
C0F3DE352C69F4A700DE6D7B /* EntryWidget */,
@@ -5099,6 +5102,14 @@
50995102
path = CallVisualizer;
51005103
sourceTree = "<group>";
51015104
};
5105+
C0AF097B2D4B746E00699E83 /* Combine */ = {
5106+
isa = PBXGroup;
5107+
children = (
5108+
C0AF097C2D4B747700699E83 /* AnyPublisher.mock.swift */,
5109+
);
5110+
path = Combine;
5111+
sourceTree = "<group>";
5112+
};
51025113
C0D2F0292991213B00803B47 /* VideoCall */ = {
51035114
isa = PBXGroup;
51045115
children = (
@@ -6193,6 +6204,7 @@
61936204
C0D6CA212C185F1000D4709B /* AlertTypeComposer.Environment.swift in Sources */,
61946205
75940982298D38C2008B173A /* VisitorCodeCoordinator+Environment.swift in Sources */,
61956206
C09047682B7E23EC003C437C /* ChatFileDownloadErrorStateStyle.RemoteConfig.swift in Sources */,
6207+
C0AF097D2D4B748300699E83 /* AnyPublisher.mock.swift in Sources */,
61966208
75CF8D6129B3F1E400CB1524 /* Configuration.Mock.swift in Sources */,
61976209
84EFB05D28AA992D0005E270 /* WebMessageCardView.swift in Sources */,
61986210
315BAB1E29ADFED800FF284B /* ConfirmationStyle.CheckMessagesButtonStyle.swift in Sources */,

GliaWidgets/Public/Glia/Glia+EntryWidget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extension Glia {
2828
guard let self else { return false }
2929
return pendingInteraction?.hasPendingInteraction ?? false
3030
},
31-
interactorPublisher: Glia.sharedInstance.$interactor.eraseToAnyPublisher(),
31+
interactorPublisher: $interactor.eraseToAnyPublisher(),
3232
onCallVisualizerResume: { [weak self] in
3333
guard let self else { return }
3434
callVisualizer.resume()

GliaWidgets/Public/Glia/Glia.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import GliaCoreSDK
2+
import Combine
23
import UIKit
34

45
/// Engagement media type.
@@ -107,7 +108,7 @@ public class Glia {
107108
public lazy var callVisualizer = CallVisualizer(
108109
environment: .create(
109110
with: environment,
110-
interactorProviding: { [weak self] in self?.interactor },
111+
interactorPublisher: $interactor.eraseToAnyPublisher(),
111112
engagedOperator: { [weak self] in
112113
self?.environment.coreSdk.getNonTransferredSecureConversationEngagement()?.engagedOperator
113114
},
@@ -267,7 +268,7 @@ public class Glia {
267268
do {
268269
pendingInteraction = try .init(environment: .init(
269270
client: environment.coreSdk,
270-
interactorProviding: { [weak self] in self?.interactor }
271+
interactorPublisher: Just(interactor).eraseToAnyPublisher()
271272
))
272273
startObservingInteractorEvents()
273274
completion(.success(()))

GliaWidgets/SecureConversations/SecureConversations.PendingInteraction.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@ extension SecureConversations {
3838

3939
self.unreadMessageCountCancellationToken = unreadMessageCountCancellationToken
4040

41-
environment.interactorProviding()?.$currentEngagement
41+
environment.interactorPublisher
42+
.flatMap { interactor -> AnyPublisher<CoreSdkClient.Engagement?, Never> in
43+
guard let interactor else {
44+
return Just(nil).eraseToAnyPublisher()
45+
}
46+
return interactor.$currentEngagement.eraseToAnyPublisher()
47+
}
4248
.map { $0?.isTransferredSecureConversation ?? false }
4349
.assign(to: &$hasTransferredSecureConversation)
4450

@@ -67,7 +73,7 @@ extension SecureConversations.PendingInteraction {
6773
var observeSecureConversationsUnreadMessageCount: CoreSdkClient.SubscribeForUnreadSCMessageCount
6874
var unsubscribeFromUnreadCount: CoreSdkClient.UnsubscribeFromUnreadCount
6975
var unsubscribeFromPendingStatus: CoreSdkClient.UnsubscribeFromPendingSCStatus
70-
var interactorProviding: () -> Interactor?
76+
var interactorPublisher: AnyPublisher<Interactor?, Never>
7177
}
7278
}
7379

@@ -84,13 +90,13 @@ extension SecureConversations.PendingInteraction {
8490
extension SecureConversations.PendingInteraction.Environment {
8591
init(
8692
client: CoreSdkClient,
87-
interactorProviding: @escaping () -> Interactor?
93+
interactorPublisher: AnyPublisher<Interactor?, Never>
8894
) {
8995
self.observePendingSecureConversationsStatus = client.observePendingSecureConversationStatus
9096
self.observeSecureConversationsUnreadMessageCount = client.subscribeForUnreadSCMessageCount
9197
self.unsubscribeFromPendingStatus = client.unsubscribeFromPendingSecureConversationStatus
9298
self.unsubscribeFromUnreadCount = client.unsubscribeFromUnreadCount
93-
self.interactorProviding = interactorProviding
99+
self.interactorPublisher = interactorPublisher
94100
}
95101
}
96102

@@ -103,7 +109,7 @@ extension SecureConversations.PendingInteraction.Environment {
103109
observeSecureConversationsUnreadMessageCount: { _ in uuidGen().uuidString },
104110
unsubscribeFromUnreadCount: { _ in },
105111
unsubscribeFromPendingStatus: { _ in },
106-
interactorProviding: { nil }
112+
interactorPublisher: .mock(.mock())
107113
)
108114
}()
109115
}

GliaWidgets/Sources/CallVisualizer/CallVisualizer.Environment.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Foundation
2+
import Combine
23

34
extension CallVisualizer {
45
struct Environment {
@@ -12,7 +13,7 @@ extension CallVisualizer {
1213
var uiDevice: UIKitBased.UIDevice
1314
var notificationCenter: FoundationBased.NotificationCenter
1415
var requestVisitorCode: CoreSdkClient.RequestVisitorCode
15-
var interactorProviding: () -> Interactor?
16+
var interactorPublisher: AnyPublisher<Interactor?, Never>
1617
var callVisualizerPresenter: CallVisualizer.Presenter
1718
var bundleManaging: BundleManaging
1819
var screenShareHandler: ScreenShareHandler
@@ -37,7 +38,7 @@ extension CallVisualizer {
3738
extension CallVisualizer.Environment {
3839
static func create(
3940
with environment: Glia.Environment,
40-
interactorProviding: @escaping () -> Interactor?,
41+
interactorPublisher: AnyPublisher<Interactor?, Never>,
4142
engagedOperator: @escaping () -> CoreSdkClient.Operator?,
4243
theme: Theme,
4344
assetBuilder: @escaping () -> RemoteConfiguration.AssetsBuilder,
@@ -56,7 +57,7 @@ extension CallVisualizer.Environment {
5657
uiDevice: environment.uiDevice,
5758
notificationCenter: environment.notificationCenter,
5859
requestVisitorCode: environment.coreSdk.requestVisitorCode,
59-
interactorProviding: interactorProviding,
60+
interactorPublisher: interactorPublisher,
6061
callVisualizerPresenter: environment.callVisualizerPresenter,
6162
bundleManaging: environment.bundleManaging,
6263
screenShareHandler: environment.screenShareHandler,

GliaWidgets/Sources/CallVisualizer/CallVisualizer.swift

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Foundation
2+
import Combine
23
import UIKit
34
import GliaCoreSDK
45

@@ -14,6 +15,8 @@ import GliaCoreSDK
1415
public final class CallVisualizer {
1516
private var environment: Environment
1617
var delegate: ((Action) -> Void)?
18+
private var interactorSubscription: AnyCancellable?
19+
private(set) var activeInteractor: Interactor?
1720
lazy var coordinator: Coordinator = {
1821
let viewFactory = ViewFactory(
1922
with: environment.theme,
@@ -107,7 +110,7 @@ extension CallVisualizer {
107110

108111
func endSession() {
109112
coordinator.end()
110-
environment.interactorProviding()?.cleanup()
113+
activeInteractor?.cleanup()
111114
delegate?(.engagementEnded)
112115
}
113116

@@ -131,31 +134,41 @@ extension CallVisualizer {
131134

132135
extension CallVisualizer {
133136
func startObservingInteractorEvents() {
134-
environment.interactorProviding()?.addObserver(self) { [weak self] event in
137+
interactorSubscription = environment.interactorPublisher
138+
.sink { [weak self] newInteractor in
139+
guard let self else { return }
140+
handleInteractorEvents(newInteractor)
141+
}
142+
}
143+
144+
func handleInteractorEvents(_ newInteractor: Interactor?) {
145+
self.activeInteractor?.removeObserver(self)
146+
self.activeInteractor = newInteractor
147+
newInteractor?.addObserver(self) { [weak self] event in
148+
guard let self else { return }
135149
if case .stateChanged(.ended(.byOperator)) = event,
136-
let endedEngagement = self?.environment.interactorProviding()?.endedEngagement,
150+
let endedEngagement = activeInteractor?.endedEngagement,
137151
endedEngagement.source == .callVisualizer {
138-
self?.endSession()
139-
self?.environment.log.prefixed(Self.self).info("Call visualizer engagement ended")
152+
endSession()
153+
environment.log.prefixed(Self.self).info("Call visualizer engagement ended")
140154
return
141155
}
142-
143156
guard
144-
let engagement = self?.environment.getCurrentEngagement(),
157+
let engagement = self.environment.getCurrentEngagement(),
145158
engagement.source == .callVisualizer
146159
else {
147160
switch event {
148161
case let .onEngagementRequest(request, answer):
149-
self?.handleEngagementRequest(request: request, answer: answer)
150-
default: return
162+
handleEngagementRequest(request: request, answer: answer)
163+
default:
164+
break
151165
}
152166
return
153167
}
154-
155168
switch event {
156169
case .screenShareOffer(answer: let answer):
157-
self?.environment.coreSdk.requestEngagedOperator { operators, _ in
158-
self?.environment.alertManager.present(
170+
environment.coreSdk.requestEngagedOperator { operators, _ in
171+
self.environment.alertManager.present(
159172
in: .global,
160173
as: .screenSharing(
161174
operators: operators?.compactMap { $0.name }.joined(separator: ", ") ?? "",
@@ -167,8 +180,8 @@ extension CallVisualizer {
167180
)
168181
}
169182
case let .upgradeOffer(offer, answer):
170-
self?.environment.coreSdk.requestEngagedOperator { operators, _ in
171-
self?.environment.alertManager.present(
183+
environment.coreSdk.requestEngagedOperator { operators, _ in
184+
self.environment.alertManager.present(
172185
in: .global,
173186
as: .mediaUpgrade(
174187
operators: operators?.compactMap { $0.name }.joined(separator: ", ") ?? "",
@@ -181,15 +194,15 @@ extension CallVisualizer {
181194
)
182195
}
183196
case let .videoStreamAdded(stream):
184-
self?.addVideoStream(stream: stream)
197+
addVideoStream(stream: stream)
185198
case let .stateChanged(state):
186199
if case .engaged = state {
187-
self?.environment.log.prefixed(Self.self).info("New Call visualizer engagement loaded")
188-
self?.delegate?(.engagementStarted)
189-
self?.environment.log.prefixed(Self.self).info("Engagement started")
200+
environment.log.prefixed(Self.self).info("New Call visualizer engagement loaded")
201+
delegate?(.engagementStarted)
202+
environment.log.prefixed(Self.self).info("Engagement started")
190203
}
191204
case let .screenSharingStateChanged(state):
192-
self?.environment.screenShareHandler.updateState(state)
205+
environment.screenShareHandler.updateState(state)
193206
default:
194207
break
195208
}

GliaWidgets/Sources/CallVisualizer/Coordinator/CallVisualizer.Coordinator.Environment.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Foundation
2+
import Combine
23

34
extension CallVisualizer.Coordinator {
45
struct Environment {
@@ -23,7 +24,7 @@ extension CallVisualizer.Coordinator {
2324
var orientationManager: OrientationManager
2425
var proximityManager: ProximityManager
2526
var log: CoreSdkClient.Logger
26-
var interactorProviding: Interactor?
27+
var interactorPublisher: AnyPublisher<Interactor?, Never>
2728
var fetchSiteConfigurations: CoreSdkClient.FetchSiteConfigurations
2829
var snackBar: SnackBar
2930
var cameraDeviceManager: CoreSdkClient.GetCameraDeviceManageable
@@ -59,7 +60,7 @@ extension CallVisualizer.Coordinator.Environment {
5960
orientationManager: environment.orientationManager,
6061
proximityManager: environment.proximityManager,
6162
log: environment.log,
62-
interactorProviding: environment.interactorProviding(),
63+
interactorPublisher: environment.interactorPublisher,
6364
fetchSiteConfigurations: environment.fetchSiteConfigurations,
6465
snackBar: environment.snackBar,
6566
cameraDeviceManager: environment.cameraDeviceManager,

GliaWidgets/Sources/CallVisualizer/Coordinator/CallVisualizer.Coordinator.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Foundation
22
import UIKit
3+
import Combine
34

45
extension CallVisualizer {
56
final class Coordinator {
@@ -15,12 +16,19 @@ extension CallVisualizer {
1516
bubbleView.pan = { [weak self] translation in
1617
self?.updateBubblePosition(translation: translation)
1718
}
19+
20+
interactorSubscription = environment.interactorPublisher
21+
.sink { [weak self] newInteractor in
22+
self?.activeInteractor = newInteractor
23+
}
1824
}
1925

2026
// MARK: - Private
2127
private var visitorCodeCoordinator: VisitorCodeCoordinator?
2228
private var screenSharingCoordinator: ScreenSharingCoordinator?
2329
private var videoCallCoordinator: VideoCallCoordinator?
30+
private var interactorSubscription: AnyCancellable?
31+
private(set) var activeInteractor: Interactor?
2432
private var state: State
2533
private let bubbleSize = CGSize(width: 60, height: 60)
2634
private let bubbleView: BubbleView
@@ -225,7 +233,7 @@ extension CallVisualizer.Coordinator {
225233

226234
extension CallVisualizer.Coordinator {
227235
func declineEngagement() {
228-
environment.interactorProviding?.endEngagement { _ in }
236+
activeInteractor?.endEngagement { _ in }
229237
end()
230238
}
231239

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Foundation
2+
import Combine
3+
4+
extension AnyPublisher {
5+
static func mock<T>() -> AnyPublisher<T, Never> {
6+
return Empty().eraseToAnyPublisher()
7+
}
8+
9+
static func mock<T>(_ value: T) -> AnyPublisher<T, Never> {
10+
return Just(value).eraseToAnyPublisher()
11+
}
12+
}

GliaWidgets/Sources/EntryWidget/EntryWidget.Environment.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ extension EntryWidget.Environment {
2929
log: .mock,
3030
isAuthenticated: { true },
3131
hasPendingInteraction: { false },
32-
interactorPublisher: Just(nil).eraseToAnyPublisher(),
32+
interactorPublisher: .mock(nil),
3333
onCallVisualizerResume: {}
3434
)
3535
}

0 commit comments

Comments
 (0)