Skip to content

Commit

Permalink
Replace InteractorProviding with InteractorPublisher
Browse files Browse the repository at this point in the history
After Interactor was refactored to be Published property, interactorProviding was replaced with interactorPublisher using Combine

MOB-3982
  • Loading branch information
rasmustautsglia authored and github-review-helper committed Jan 31, 2025
1 parent 8680815 commit ef16303
Show file tree
Hide file tree
Showing 15 changed files with 153 additions and 46 deletions.
12 changes: 12 additions & 0 deletions GliaWidgets.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -900,6 +900,7 @@
C090478A2B7E5C66003C437C /* AttachmentSourceListStyle.Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09047892B7E5C66003C437C /* AttachmentSourceListStyle.Equatable.swift */; };
C090478C2B7E5C8F003C437C /* FilePreviewStyle.Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C090478B2B7E5C8F003C437C /* FilePreviewStyle.Equatable.swift */; };
C096B40B297EBDE400F0C552 /* VisitorCodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C096B40A297EBDE400F0C552 /* VisitorCodeTests.swift */; };
C0AF097D2D4B748300699E83 /* AnyPublisher.mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0AF097C2D4B747700699E83 /* AnyPublisher.mock.swift */; };
C0B325E72AC5A8FA006BC430 /* AlertViewController+LiveObservationConfirmation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B325E62AC5A8FA006BC430 /* AlertViewController+LiveObservationConfirmation.swift */; };
C0C5BB772CAD4278001B2025 /* MediaTypeItemStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C5BB762CAD4259001B2025 /* MediaTypeItemStyle.swift */; };
C0C5BB792CAD42FD001B2025 /* MediaTypeItemStyle.RemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C5BB782CAD42FD001B2025 /* MediaTypeItemStyle.RemoteConfig.swift */; };
Expand Down Expand Up @@ -1987,6 +1988,7 @@
C09047892B7E5C66003C437C /* AttachmentSourceListStyle.Equatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentSourceListStyle.Equatable.swift; sourceTree = "<group>"; };
C090478B2B7E5C8F003C437C /* FilePreviewStyle.Equatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilePreviewStyle.Equatable.swift; sourceTree = "<group>"; };
C096B40A297EBDE400F0C552 /* VisitorCodeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisitorCodeTests.swift; sourceTree = "<group>"; };
C0AF097C2D4B747700699E83 /* AnyPublisher.mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyPublisher.mock.swift; sourceTree = "<group>"; };
C0B325E62AC5A8FA006BC430 /* AlertViewController+LiveObservationConfirmation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AlertViewController+LiveObservationConfirmation.swift"; sourceTree = "<group>"; };
C0C5BB762CAD4259001B2025 /* MediaTypeItemStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaTypeItemStyle.swift; sourceTree = "<group>"; };
C0C5BB782CAD42FD001B2025 /* MediaTypeItemStyle.RemoteConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaTypeItemStyle.RemoteConfig.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2825,6 +2827,7 @@
1A60AFC12566857200E53F53 /* Sources */ = {
isa = PBXGroup;
children = (
C0AF097B2D4B746E00699E83 /* Combine */,
2198B7AA2CAEB13E002C442B /* QueuesMonitor */,
215A25922CA44D900013023E /* EngagementLauncher */,
C0F3DE352C69F4A700DE6D7B /* EntryWidget */,
Expand Down Expand Up @@ -5099,6 +5102,14 @@
path = CallVisualizer;
sourceTree = "<group>";
};
C0AF097B2D4B746E00699E83 /* Combine */ = {
isa = PBXGroup;
children = (
C0AF097C2D4B747700699E83 /* AnyPublisher.mock.swift */,
);
path = Combine;
sourceTree = "<group>";
};
C0D2F0292991213B00803B47 /* VideoCall */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -6193,6 +6204,7 @@
C0D6CA212C185F1000D4709B /* AlertTypeComposer.Environment.swift in Sources */,
75940982298D38C2008B173A /* VisitorCodeCoordinator+Environment.swift in Sources */,
C09047682B7E23EC003C437C /* ChatFileDownloadErrorStateStyle.RemoteConfig.swift in Sources */,
C0AF097D2D4B748300699E83 /* AnyPublisher.mock.swift in Sources */,
75CF8D6129B3F1E400CB1524 /* Configuration.Mock.swift in Sources */,
84EFB05D28AA992D0005E270 /* WebMessageCardView.swift in Sources */,
315BAB1E29ADFED800FF284B /* ConfirmationStyle.CheckMessagesButtonStyle.swift in Sources */,
Expand Down
2 changes: 1 addition & 1 deletion GliaWidgets/Public/Glia/Glia+EntryWidget.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ extension Glia {
guard let self else { return false }
return pendingInteraction?.hasPendingInteraction ?? false
},
interactorPublisher: Glia.sharedInstance.$interactor.eraseToAnyPublisher(),
interactorPublisher: $interactor.eraseToAnyPublisher(),
onCallVisualizerResume: { [weak self] in
guard let self else { return }
callVisualizer.resume()
Expand Down
5 changes: 3 additions & 2 deletions GliaWidgets/Public/Glia/Glia.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import GliaCoreSDK
import Combine
import UIKit

/// Engagement media type.
Expand Down Expand Up @@ -107,7 +108,7 @@ public class Glia {
public lazy var callVisualizer = CallVisualizer(
environment: .create(
with: environment,
interactorProviding: { [weak self] in self?.interactor },
interactorPublisher: $interactor.eraseToAnyPublisher(),
engagedOperator: { [weak self] in
self?.environment.coreSdk.getNonTransferredSecureConversationEngagement()?.engagedOperator
},
Expand Down Expand Up @@ -267,7 +268,7 @@ public class Glia {
do {
pendingInteraction = try .init(environment: .init(
client: environment.coreSdk,
interactorProviding: { [weak self] in self?.interactor }
interactorPublisher: Just(interactor).eraseToAnyPublisher()
))
startObservingInteractorEvents()
completion(.success(()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,13 @@ extension SecureConversations {

self.unreadMessageCountCancellationToken = unreadMessageCountCancellationToken

environment.interactorProviding()?.$currentEngagement
environment.interactorPublisher
.flatMap { interactor -> AnyPublisher<CoreSdkClient.Engagement?, Never> in
guard let interactor else {
return Just(nil).eraseToAnyPublisher()
}
return interactor.$currentEngagement.eraseToAnyPublisher()
}
.map { $0?.isTransferredSecureConversation ?? false }
.assign(to: &$hasTransferredSecureConversation)

Expand Down Expand Up @@ -67,7 +73,7 @@ extension SecureConversations.PendingInteraction {
var observeSecureConversationsUnreadMessageCount: CoreSdkClient.SubscribeForUnreadSCMessageCount
var unsubscribeFromUnreadCount: CoreSdkClient.UnsubscribeFromUnreadCount
var unsubscribeFromPendingStatus: CoreSdkClient.UnsubscribeFromPendingSCStatus
var interactorProviding: () -> Interactor?
var interactorPublisher: AnyPublisher<Interactor?, Never>
}
}

Expand All @@ -84,13 +90,13 @@ extension SecureConversations.PendingInteraction {
extension SecureConversations.PendingInteraction.Environment {
init(
client: CoreSdkClient,
interactorProviding: @escaping () -> Interactor?
interactorPublisher: AnyPublisher<Interactor?, Never>
) {
self.observePendingSecureConversationsStatus = client.observePendingSecureConversationStatus
self.observeSecureConversationsUnreadMessageCount = client.subscribeForUnreadSCMessageCount
self.unsubscribeFromPendingStatus = client.unsubscribeFromPendingSecureConversationStatus
self.unsubscribeFromUnreadCount = client.unsubscribeFromUnreadCount
self.interactorProviding = interactorProviding
self.interactorPublisher = interactorPublisher
}
}

Expand All @@ -103,7 +109,7 @@ extension SecureConversations.PendingInteraction.Environment {
observeSecureConversationsUnreadMessageCount: { _ in uuidGen().uuidString },
unsubscribeFromUnreadCount: { _ in },
unsubscribeFromPendingStatus: { _ in },
interactorProviding: { nil }
interactorPublisher: .mock(.mock())
)
}()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import Combine

extension CallVisualizer {
struct Environment {
Expand All @@ -12,7 +13,7 @@ extension CallVisualizer {
var uiDevice: UIKitBased.UIDevice
var notificationCenter: FoundationBased.NotificationCenter
var requestVisitorCode: CoreSdkClient.RequestVisitorCode
var interactorProviding: () -> Interactor?
var interactorPublisher: AnyPublisher<Interactor?, Never>
var callVisualizerPresenter: CallVisualizer.Presenter
var bundleManaging: BundleManaging
var screenShareHandler: ScreenShareHandler
Expand All @@ -37,7 +38,7 @@ extension CallVisualizer {
extension CallVisualizer.Environment {
static func create(
with environment: Glia.Environment,
interactorProviding: @escaping () -> Interactor?,
interactorPublisher: AnyPublisher<Interactor?, Never>,
engagedOperator: @escaping () -> CoreSdkClient.Operator?,
theme: Theme,
assetBuilder: @escaping () -> RemoteConfiguration.AssetsBuilder,
Expand All @@ -56,7 +57,7 @@ extension CallVisualizer.Environment {
uiDevice: environment.uiDevice,
notificationCenter: environment.notificationCenter,
requestVisitorCode: environment.coreSdk.requestVisitorCode,
interactorProviding: interactorProviding,
interactorPublisher: interactorPublisher,
callVisualizerPresenter: environment.callVisualizerPresenter,
bundleManaging: environment.bundleManaging,
screenShareHandler: environment.screenShareHandler,
Expand Down
51 changes: 32 additions & 19 deletions GliaWidgets/Sources/CallVisualizer/CallVisualizer.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import Combine
import UIKit
import GliaCoreSDK

Expand All @@ -14,6 +15,8 @@ import GliaCoreSDK
public final class CallVisualizer {
private var environment: Environment
var delegate: ((Action) -> Void)?
private var interactorSubscription: AnyCancellable?
private(set) var activeInteractor: Interactor?
lazy var coordinator: Coordinator = {
let viewFactory = ViewFactory(
with: environment.theme,
Expand Down Expand Up @@ -107,7 +110,7 @@ extension CallVisualizer {

func endSession() {
coordinator.end()
environment.interactorProviding()?.cleanup()
activeInteractor?.cleanup()
delegate?(.engagementEnded)
}

Expand All @@ -131,31 +134,41 @@ extension CallVisualizer {

extension CallVisualizer {
func startObservingInteractorEvents() {
environment.interactorProviding()?.addObserver(self) { [weak self] event in
interactorSubscription = environment.interactorPublisher
.sink { [weak self] newInteractor in
guard let self else { return }
handleInteractorEvents(newInteractor)
}
}

func handleInteractorEvents(_ newInteractor: Interactor?) {

Check warning on line 144 in GliaWidgets/Sources/CallVisualizer/CallVisualizer.swift

View workflow job for this annotation

GitHub Actions / SwiftLint

Function Body Length Violation: Function body should span 60 lines or less excluding comments and whitespace: currently spans 65 lines (function_body_length)
self.activeInteractor?.removeObserver(self)
self.activeInteractor = newInteractor
newInteractor?.addObserver(self) { [weak self] event in
guard let self else { return }
if case .stateChanged(.ended(.byOperator)) = event,
let endedEngagement = self?.environment.interactorProviding()?.endedEngagement,
let endedEngagement = activeInteractor?.endedEngagement,
endedEngagement.source == .callVisualizer {
self?.endSession()
self?.environment.log.prefixed(Self.self).info("Call visualizer engagement ended")
endSession()
environment.log.prefixed(Self.self).info("Call visualizer engagement ended")
return
}

guard
let engagement = self?.environment.getCurrentEngagement(),
let engagement = self.environment.getCurrentEngagement(),
engagement.source == .callVisualizer
else {
switch event {
case let .onEngagementRequest(request, answer):
self?.handleEngagementRequest(request: request, answer: answer)
default: return
handleEngagementRequest(request: request, answer: answer)
default:
break
}
return
}

switch event {
case .screenShareOffer(answer: let answer):
self?.environment.coreSdk.requestEngagedOperator { operators, _ in
self?.environment.alertManager.present(
environment.coreSdk.requestEngagedOperator { operators, _ in
self.environment.alertManager.present(
in: .global,
as: .screenSharing(
operators: operators?.compactMap { $0.name }.joined(separator: ", ") ?? "",
Expand All @@ -167,8 +180,8 @@ extension CallVisualizer {
)
}
case let .upgradeOffer(offer, answer):
self?.environment.coreSdk.requestEngagedOperator { operators, _ in
self?.environment.alertManager.present(
environment.coreSdk.requestEngagedOperator { operators, _ in
self.environment.alertManager.present(
in: .global,
as: .mediaUpgrade(
operators: operators?.compactMap { $0.name }.joined(separator: ", ") ?? "",
Expand All @@ -181,15 +194,15 @@ extension CallVisualizer {
)
}
case let .videoStreamAdded(stream):
self?.addVideoStream(stream: stream)
addVideoStream(stream: stream)
case let .stateChanged(state):
if case .engaged = state {
self?.environment.log.prefixed(Self.self).info("New Call visualizer engagement loaded")
self?.delegate?(.engagementStarted)
self?.environment.log.prefixed(Self.self).info("Engagement started")
environment.log.prefixed(Self.self).info("New Call visualizer engagement loaded")
delegate?(.engagementStarted)
environment.log.prefixed(Self.self).info("Engagement started")
}
case let .screenSharingStateChanged(state):
self?.environment.screenShareHandler.updateState(state)
environment.screenShareHandler.updateState(state)
default:
break
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import Combine

extension CallVisualizer.Coordinator {
struct Environment {
Expand All @@ -23,7 +24,7 @@ extension CallVisualizer.Coordinator {
var orientationManager: OrientationManager
var proximityManager: ProximityManager
var log: CoreSdkClient.Logger
var interactorProviding: Interactor?
var interactorPublisher: AnyPublisher<Interactor?, Never>
var fetchSiteConfigurations: CoreSdkClient.FetchSiteConfigurations
var snackBar: SnackBar
var cameraDeviceManager: CoreSdkClient.GetCameraDeviceManageable
Expand Down Expand Up @@ -59,7 +60,7 @@ extension CallVisualizer.Coordinator.Environment {
orientationManager: environment.orientationManager,
proximityManager: environment.proximityManager,
log: environment.log,
interactorProviding: environment.interactorProviding(),
interactorPublisher: environment.interactorPublisher,
fetchSiteConfigurations: environment.fetchSiteConfigurations,
snackBar: environment.snackBar,
cameraDeviceManager: environment.cameraDeviceManager,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Foundation
import UIKit
import Combine

extension CallVisualizer {
final class Coordinator {
Expand All @@ -15,12 +16,19 @@ extension CallVisualizer {
bubbleView.pan = { [weak self] translation in
self?.updateBubblePosition(translation: translation)
}

interactorSubscription = environment.interactorPublisher
.sink { [weak self] newInteractor in
self?.activeInteractor = newInteractor
}
}

// MARK: - Private
private var visitorCodeCoordinator: VisitorCodeCoordinator?
private var screenSharingCoordinator: ScreenSharingCoordinator?
private var videoCallCoordinator: VideoCallCoordinator?
private var interactorSubscription: AnyCancellable?
private(set) var activeInteractor: Interactor?
private var state: State
private let bubbleSize = CGSize(width: 60, height: 60)
private let bubbleView: BubbleView
Expand Down Expand Up @@ -225,7 +233,7 @@ extension CallVisualizer.Coordinator {

extension CallVisualizer.Coordinator {
func declineEngagement() {
environment.interactorProviding?.endEngagement { _ in }
activeInteractor?.endEngagement { _ in }
end()
}

Expand Down
12 changes: 12 additions & 0 deletions GliaWidgets/Sources/Combine/AnyPublisher.mock.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import Foundation
import Combine

extension AnyPublisher {
static func mock<T>() -> AnyPublisher<T, Never> {
return Empty().eraseToAnyPublisher()
}

static func mock<T>(_ value: T) -> AnyPublisher<T, Never> {
return Just(value).eraseToAnyPublisher()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extension EntryWidget.Environment {
log: .mock,
isAuthenticated: { true },
hasPendingInteraction: { false },
interactorPublisher: Just(nil).eraseToAnyPublisher(),
interactorPublisher: .mock(nil),
onCallVisualizerResume: {}
)
}
Expand Down
Loading

0 comments on commit ef16303

Please sign in to comment.