From be9caef61e30d2d6533b915305e85d7e8c6a162c Mon Sep 17 00:00:00 2001 From: Ilias Pavlidakis Date: Wed, 8 May 2024 17:17:39 +0300 Subject: [PATCH] Update structure and add docs --- .../Feedback/CallEndedViewModifier.swift | 105 --------- .../Feedback/DemoFeedbackView.swift | 2 +- Sources/StreamVideo/Call.swift | 4 +- .../ViewModifiers/CallEndedViewModifier.swift | 195 +++++++++++++++++ .../Extensions/View+OptionalPublisher.swift | 2 +- .../Utils/ViewExtensions.swift | 15 -- StreamVideo.xcodeproj/project.pbxproj | 16 +- .../05-ui-cookbook/18-call-quality-rating.mdx | 206 ++++++++++++++++++ ...anscriptions.mdx => 19-transcriptions.mdx} | 0 .../docs/iOS/assets/call-quality-rating.png | Bin 0 -> 74687 bytes 10 files changed, 412 insertions(+), 133 deletions(-) delete mode 100644 DemoApp/Sources/Components/Feedback/CallEndedViewModifier.swift create mode 100644 Sources/StreamVideoSwiftUI/CallView/ViewModifiers/CallEndedViewModifier.swift rename {DemoApp/Sources => Sources/StreamVideoSwiftUI/Utils}/Extensions/View+OptionalPublisher.swift (93%) create mode 100644 docusaurus/docs/iOS/05-ui-cookbook/18-call-quality-rating.mdx rename docusaurus/docs/iOS/05-ui-cookbook/{18-transcriptions.mdx => 19-transcriptions.mdx} (100%) create mode 100644 docusaurus/docs/iOS/assets/call-quality-rating.png diff --git a/DemoApp/Sources/Components/Feedback/CallEndedViewModifier.swift b/DemoApp/Sources/Components/Feedback/CallEndedViewModifier.swift deleted file mode 100644 index 8e7485855..000000000 --- a/DemoApp/Sources/Components/Feedback/CallEndedViewModifier.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// Copyright © 2024 Stream.io Inc. All rights reserved. -// - -import Foundation -import StreamVideo -import SwiftUI - -private struct CallEndedViewModifier: ViewModifier { - - private final class CallEndedViewModifierState: ObservableObject { - @Published var call: Call? - @Published var isPresentingSubview: Bool - @Published var maxParticipantsCount: Int - - init( - call: Call? = nil, - isPresentingSubview: Bool = false, - maxParticipantsCount: Int = 0 - ) { - self.call = call - self.isPresentingSubview = isPresentingSubview - self.maxParticipantsCount = maxParticipantsCount - } - } - - @Injected(\.streamVideo) private var streamVideo - - private var subviewProvider: (Call?, @escaping () -> Void) -> Subview - - @StateObject private var state: CallEndedViewModifierState = .init() - - init( - @ViewBuilder subviewProvider: @escaping (Call?, @escaping () -> Void) -> Subview - ) { - self.subviewProvider = subviewProvider - } - - func body(content: Content) -> some View { - content - .sheet(isPresented: $state.isPresentingSubview) { - subviewProvider(state.call) { - state.call = nil - state.isPresentingSubview = false - } - } - .onReceive(streamVideo.state.$activeCall.removeDuplicates { $0?.cId != $1?.cId }) { call in - switch (call, state.call, state.isPresentingSubview) { - case (nil, let activeCall, false) where activeCall != nil && state.maxParticipantsCount > 1: - /// The following presentation criteria are required: - /// - The activeCall was ended. - /// - Participants, during call's duration, grew to more than one. - state.isPresentingSubview = true - - case let (newActiveCall, activeCall, _) where newActiveCall != nil && activeCall != nil: - /// The activeCall was replaced with another call. We should not present the - /// subview. We will also hide any modals if any is visible. - state.call = newActiveCall - state.isPresentingSubview = false - state.maxParticipantsCount = 0 - - case (let newActiveCall, nil, _) where newActiveCall != nil: - /// The activeCall was replaced with another call. We should not present the - /// subview. We will also hide any modals if any is visible. - state.call = newActiveCall - state.isPresentingSubview = false - state.maxParticipantsCount = 0 - - default: - /// For every other case we won't perform any action. - log - .debug( - "CallEnded view modifier received newValue:\(call?.cId ?? "nil") oldValue:\(state.call?.cId ?? "nil") isPresentingSubview:\(state.isPresentingSubview) maxParticipantsCount:\(state.maxParticipantsCount). No action is required." - ) - } - } - .onReceive(streamVideo.state.activeCall?.state.$participants.map(\.count)) { - /// Every time participants update, we store the maximum number of participants in - /// the call (during call's duration). - state.maxParticipantsCount = max(state.maxParticipantsCount, $0) - } - } -} - -extension View { - - /// A viewModifier that observes callState from StreamVideo. Once the following criteria are being - /// fulfilled, presents a modal with the provided content. - /// Activation criteria: - /// - Active call was ended. - /// - Participants, during call's duration, grew to more than one. - /// - /// - Parameter content: A viewBuilder that returns the modal's content. The viewModifier - /// will provide a dismiss closure that can be called from the content to close the modal. - @ViewBuilder - public func onCallEnded( - @ViewBuilder _ content: @escaping (Call?, @escaping () -> Void) -> some View - ) -> some View { - modifier( - CallEndedViewModifier( - subviewProvider: content - ) - ) - } -} diff --git a/DemoApp/Sources/Components/Feedback/DemoFeedbackView.swift b/DemoApp/Sources/Components/Feedback/DemoFeedbackView.swift index 308f1eb0b..cdaee0c9c 100644 --- a/DemoApp/Sources/Components/Feedback/DemoFeedbackView.swift +++ b/DemoApp/Sources/Components/Feedback/DemoFeedbackView.swift @@ -120,7 +120,7 @@ struct DemoFeedbackView: View { } .padding(.horizontal) } - .withModalNavigationBar(title: "", closeAction: { dismiss() }) + .withModalNavigationBar(title: "", closeAction: dismiss) } } diff --git a/Sources/StreamVideo/Call.swift b/Sources/StreamVideo/Call.swift index 754e79dec..8842290d0 100644 --- a/Sources/StreamVideo/Call.swift +++ b/Sources/StreamVideo/Call.swift @@ -927,9 +927,9 @@ public class Call: @unchecked Sendable, WSEventsSubscriber { @discardableResult @MainActor public func collectUserFeedback( - custom: [String: RawJSON]? = nil, rating: Int? = nil, - reason: String? = nil + reason: String? = nil, + custom: [String: RawJSON]? = nil ) async throws -> CollectUserFeedbackResponse { try await callController.collectUserFeedback( sessionID: state.sessionId, diff --git a/Sources/StreamVideoSwiftUI/CallView/ViewModifiers/CallEndedViewModifier.swift b/Sources/StreamVideoSwiftUI/CallView/ViewModifiers/CallEndedViewModifier.swift new file mode 100644 index 000000000..0647218d7 --- /dev/null +++ b/Sources/StreamVideoSwiftUI/CallView/ViewModifiers/CallEndedViewModifier.swift @@ -0,0 +1,195 @@ +// +// Copyright © 2024 Stream.io Inc. All rights reserved. +// + +import Combine +import Foundation +import StreamVideo +import SwiftUI + +private final class CallEndedViewModifierViewModel: ObservableObject { + + @Injected(\.streamVideo) private var streamVideo + + @Published var activeCall: Call? + @Published var lastCall: Call? + @Published var isPresentingSubview: Bool = false + @Published var maxParticipantsCount: Int = 0 + + private var observationCancellable: AnyCancellable? + + init() { + observationCancellable = streamVideo + .state + .$activeCall + .receive(on: DispatchQueue.main) + .sink { [weak self] in self?.activeCall = $0 } + } +} + +@available(iOS 14.0, *) +private struct CallEndedViewModifier: ViewModifier { + + private var subviewProvider: (Call?, @escaping () -> Void) -> Subview + + @StateObject private var viewModel: CallEndedViewModifierViewModel + + init( + @ViewBuilder subviewProvider: @escaping (Call?, @escaping () -> Void) -> Subview + ) { + self.subviewProvider = subviewProvider + _viewModel = .init(wrappedValue: .init()) + } + + func body(content: Content) -> some View { + content + .sheet(isPresented: $viewModel.isPresentingSubview) { + subviewProvider(viewModel.lastCall) { + viewModel.lastCall = nil + viewModel.isPresentingSubview = false + } + } + .onReceive(viewModel.$activeCall) { call in + log + .debug( + "CallEnded view modifier received newValue:\(call?.cId ?? "nil") oldValue:\(viewModel.lastCall?.cId ?? "nil") isPresentingSubview:\(viewModel.isPresentingSubview) maxParticipantsCount:\(viewModel.maxParticipantsCount)." + ) + + switch (call, viewModel.lastCall, viewModel.isPresentingSubview) { + case (nil, let activeCall, false) where activeCall != nil && viewModel.maxParticipantsCount > 1: + /// The following presentation criteria are required: + /// - The activeCall was ended. + /// - Participants, during call's duration, grew to more than one. + viewModel.isPresentingSubview = true + + case let (newActiveCall, activeCall, _) where newActiveCall != nil && activeCall != nil: + /// The activeCall was replaced with another call. We should not present the + /// subview. We will also hide any modals if any is visible. + viewModel.lastCall = newActiveCall + viewModel.isPresentingSubview = false + viewModel.maxParticipantsCount = 0 + + case (let newActiveCall, nil, _) where newActiveCall != nil: + /// A new call has started. We should not present the subview. We will also hide + /// any modals if any is visible. + viewModel.lastCall = newActiveCall + viewModel.isPresentingSubview = false + viewModel.maxParticipantsCount = 0 + + default: + /// For every other case we won't perform any action. + break + } + } + .onReceive(viewModel.activeCall?.state.$participants) { + /// Every time participants update, we store the maximum number of participants in + /// the call (during call's duration). + let newMaxParticipantsCount = max(viewModel.maxParticipantsCount, $0.count) + if newMaxParticipantsCount != viewModel.maxParticipantsCount { + log + .debug( + "CallEnded view modifier updated maxParticipantsCount:\(viewModel.maxParticipantsCount) → \(newMaxParticipantsCount)" + ) + viewModel.maxParticipantsCount = newMaxParticipantsCount + } + } + } +} + +@available(iOS, introduced: 13, obsoleted: 14) +private struct CallEndedViewModifier_iOS13: ViewModifier { + + private var subviewProvider: (Call?, @escaping () -> Void) -> Subview + + @BackportStateObject private var viewModel: CallEndedViewModifierViewModel = .init() + + init( + @ViewBuilder subviewProvider: @escaping (Call?, @escaping () -> Void) -> Subview + ) { + self.subviewProvider = subviewProvider + } + + func body(content: Content) -> some View { + content + .sheet(isPresented: $viewModel.isPresentingSubview) { + subviewProvider(viewModel.lastCall) { + viewModel.lastCall = nil + viewModel.isPresentingSubview = false + } + } + .onReceive(viewModel.$activeCall) { call in + log + .debug( + "CallEnded view modifier received newValue:\(call?.cId ?? "nil") oldValue:\(viewModel.lastCall?.cId ?? "nil") isPresentingSubview:\(viewModel.isPresentingSubview) maxParticipantsCount:\(viewModel.maxParticipantsCount)." + ) + + switch (call, viewModel.lastCall, viewModel.isPresentingSubview) { + case (nil, let activeCall, false) where activeCall != nil && viewModel.maxParticipantsCount > 1: + /// The following presentation criteria are required: + /// - The activeCall was ended. + /// - Participants, during call's duration, grew to more than one. + viewModel.isPresentingSubview = true + + case let (newActiveCall, activeCall, _) where newActiveCall != nil && activeCall != nil: + /// The activeCall was replaced with another call. We should not present the + /// subview. We will also hide any modals if any is visible. + viewModel.lastCall = newActiveCall + viewModel.isPresentingSubview = false + viewModel.maxParticipantsCount = 0 + + case (let newActiveCall, nil, _) where newActiveCall != nil: + /// The activeCall was replaced with another call. We should not present the + /// subview. We will also hide any modals if any is visible. + viewModel.lastCall = newActiveCall + viewModel.isPresentingSubview = false + viewModel.maxParticipantsCount = 0 + + default: + /// For every other case we won't perform any action. + break + } + } + .onReceive(viewModel.activeCall?.state.$participants) { + /// Every time participants update, we store the maximum number of participants in + /// the call (during call's duration). + let newMaxParticipantsCount = max(viewModel.maxParticipantsCount, $0.count) + if newMaxParticipantsCount != viewModel.maxParticipantsCount { + log + .debug( + "CallEnded view modifier updated maxParticipantsCount:\(viewModel.maxParticipantsCount) → \(newMaxParticipantsCount)" + ) + viewModel.maxParticipantsCount = newMaxParticipantsCount + } + } + } +} + +extension View { + + /// A viewModifier that observes callState from StreamVideo. Once the following criteria are being + /// fulfilled, presents a modal with the provided content. + /// Activation criteria: + /// - Active call was ended. + /// - Participants, during call's duration, grew to more than one. + /// + /// - Parameter content: A viewBuilder that returns the modal's content. The viewModifier + /// will provide a dismiss closure that can be called from the content to close the modal. + @ViewBuilder + public func onCallEnded( + @ViewBuilder _ content: @escaping (Call?, @escaping () -> Void) -> some View + ) -> some View { + if #available(iOS 14.0, *) { + modifier( + CallEndedViewModifier( + subviewProvider: content + ) + ) + } else { + modifier( + CallEndedViewModifier_iOS13( + subviewProvider: content + ) + ) + } + } +} diff --git a/DemoApp/Sources/Extensions/View+OptionalPublisher.swift b/Sources/StreamVideoSwiftUI/Utils/Extensions/View+OptionalPublisher.swift similarity index 93% rename from DemoApp/Sources/Extensions/View+OptionalPublisher.swift rename to Sources/StreamVideoSwiftUI/Utils/Extensions/View+OptionalPublisher.swift index 96b28eab4..79159cbcd 100644 --- a/DemoApp/Sources/Extensions/View+OptionalPublisher.swift +++ b/Sources/StreamVideoSwiftUI/Utils/Extensions/View+OptionalPublisher.swift @@ -9,7 +9,7 @@ import SwiftUI extension View { @ViewBuilder - func onReceive

( + public func onReceive

( _ publisher: P?, perform action: @escaping (P.Output) -> Void ) -> some View where P: Publisher, P.Failure == Never { diff --git a/Sources/StreamVideoSwiftUI/Utils/ViewExtensions.swift b/Sources/StreamVideoSwiftUI/Utils/ViewExtensions.swift index ddc7d6d68..4d1ad9861 100644 --- a/Sources/StreamVideoSwiftUI/Utils/ViewExtensions.swift +++ b/Sources/StreamVideoSwiftUI/Utils/ViewExtensions.swift @@ -14,18 +14,3 @@ extension Alert { ) } } - -extension View { - - @ViewBuilder - func onReceive

( - _ publisher: P?, - perform action: @escaping (P.Output) -> Void - ) -> some View where P: Publisher, P.Failure == Never { - if let publisher = publisher { - onReceive(publisher, perform: action) - } else { - self - } - } -} diff --git a/StreamVideo.xcodeproj/project.pbxproj b/StreamVideo.xcodeproj/project.pbxproj index a2cafd7a2..09dadbe78 100644 --- a/StreamVideo.xcodeproj/project.pbxproj +++ b/StreamVideo.xcodeproj/project.pbxproj @@ -54,7 +54,6 @@ 403812F62A6EA2A7009BB2F7 /* MicrophoneChecker_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403812F52A6EA2A7009BB2F7 /* MicrophoneChecker_Tests.swift */; }; 403BE0FE2A24C07300988F65 /* DeeplinkAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403BE0FD2A24C07300988F65 /* DeeplinkAdapter.swift */; }; 403BE1012A24C70000988F65 /* DemoApp+Sentry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403BE1002A24C70000988F65 /* DemoApp+Sentry.swift */; }; - 403EFC9F2BDBFE050057C248 /* CallEndedViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403EFC9E2BDBFE050057C248 /* CallEndedViewModifier.swift */; }; 403EFCA12BDC003A0057C248 /* DemoFeedbackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403EFCA02BDC003A0057C248 /* DemoFeedbackView.swift */; }; 403FF3E72BA1D2D40092CE8A /* StreamPixelBufferRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403FF3E32BA1D2460092CE8A /* StreamPixelBufferRepository.swift */; }; 403FF3E82BA1D2D70092CE8A /* StreamPixelBufferPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403FF3E52BA1D2610092CE8A /* StreamPixelBufferPool.swift */; }; @@ -97,7 +96,6 @@ 406A8E9D2AA1D7E9001F598A /* String+Unique.swift in Sources */ = {isa = PBXBuildFile; fileRef = 401A64B42A9DF88C00534ED1 /* String+Unique.swift */; }; 406A8E9E2AA1D7E9001F598A /* URL+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = 401A64B22A9DF86200534ED1 /* URL+Convenience.swift */; }; 406A8E9F2AA1D7E9001F598A /* CallViewModel+CallSettingsPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F446052A9E2CB8004BE3DA /* CallViewModel+CallSettingsPublisher.swift */; }; - 406A8EA02AA1D7E9001F598A /* View+OptionalPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 409BFA3F2A9F79D2003341EF /* View+OptionalPublisher.swift */; }; 406A8EA12AA1D7EF001F598A /* Reaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F445D32A9E2051004BE3DA /* Reaction.swift */; }; 406A8EA22AA1D7EF001F598A /* TokenResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 401A64B02A9DF83200534ED1 /* TokenResponse.swift */; }; 406A8EA92AA1D80C001F598A /* ReactionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F445D12A9E2033004BE3DA /* ReactionsHelper.swift */; }; @@ -149,7 +147,6 @@ 4093861A2AA09E4A00FF5AF4 /* MemoryLogDestination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 409386192AA09E4A00FF5AF4 /* MemoryLogDestination.swift */; }; 4093861C2AA0A11500FF5AF4 /* LogQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4093861B2AA0A11500FF5AF4 /* LogQueue.swift */; }; 4093861F2AA0A21800FF5AF4 /* MemoryLogViewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4093861E2AA0A21800FF5AF4 /* MemoryLogViewer.swift */; }; - 409BFA402A9F79D2003341EF /* View+OptionalPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 409BFA3F2A9F79D2003341EF /* View+OptionalPublisher.swift */; }; 40A0E9602B88ABC80089E8D3 /* DemoBackgroundEffectSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A0E95F2B88ABC80089E8D3 /* DemoBackgroundEffectSelector.swift */; }; 40A0E9622B88D3DC0089E8D3 /* UIInterfaceOrientation+CGOrientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A0E9612B88D3DC0089E8D3 /* UIInterfaceOrientation+CGOrientation.swift */; }; 40A0E9642B88DE830089E8D3 /* SerialActor_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A0E9632B88DE830089E8D3 /* SerialActor_Tests.swift */; }; @@ -262,6 +259,8 @@ 40F0C3AA2BC8121F00AB75AD /* ReusePool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F0C3A82BC8121400AB75AD /* ReusePool.swift */; }; 40F0C3AC2BC8138A00AB75AD /* ReusePool_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F0C3AB2BC8138A00AB75AD /* ReusePool_Tests.swift */; }; 40F161AB2A4C6B5C00846E3E /* ScreenSharingSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F161AA2A4C6B5C00846E3E /* ScreenSharingSession.swift */; }; + 40F18B8C2BEBAC4C00ADF76E /* CallEndedViewModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403EFC9E2BDBFE050057C248 /* CallEndedViewModifier.swift */; }; + 40F18B8E2BEBB65100ADF76E /* View+OptionalPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F18B8D2BEBB65100ADF76E /* View+OptionalPublisher.swift */; }; 40F445AC2A9DFC13004BE3DA /* UserCredentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F445AB2A9DFC13004BE3DA /* UserCredentials.swift */; }; 40F445AE2A9DFC34004BE3DA /* UserState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F445AD2A9DFC34004BE3DA /* UserState.swift */; }; 40F445B02A9DFC58004BE3DA /* CallKitState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F445AF2A9DFC58004BE3DA /* CallKitState.swift */; }; @@ -1167,7 +1166,6 @@ 409386192AA09E4A00FF5AF4 /* MemoryLogDestination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryLogDestination.swift; sourceTree = ""; }; 4093861B2AA0A11500FF5AF4 /* LogQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogQueue.swift; sourceTree = ""; }; 4093861E2AA0A21800FF5AF4 /* MemoryLogViewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryLogViewer.swift; sourceTree = ""; }; - 409BFA3F2A9F79D2003341EF /* View+OptionalPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+OptionalPublisher.swift"; sourceTree = ""; }; 40A0E95F2B88ABC80089E8D3 /* DemoBackgroundEffectSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoBackgroundEffectSelector.swift; sourceTree = ""; }; 40A0E9612B88D3DC0089E8D3 /* UIInterfaceOrientation+CGOrientation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIInterfaceOrientation+CGOrientation.swift"; sourceTree = ""; }; 40A0E9632B88DE830089E8D3 /* SerialActor_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SerialActor_Tests.swift; sourceTree = ""; }; @@ -1237,6 +1235,7 @@ 40F0C3A82BC8121400AB75AD /* ReusePool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReusePool.swift; sourceTree = ""; }; 40F0C3AB2BC8138A00AB75AD /* ReusePool_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReusePool_Tests.swift; sourceTree = ""; }; 40F161AA2A4C6B5C00846E3E /* ScreenSharingSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenSharingSession.swift; sourceTree = ""; }; + 40F18B8D2BEBB65100ADF76E /* View+OptionalPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+OptionalPublisher.swift"; sourceTree = ""; }; 40F445AB2A9DFC13004BE3DA /* UserCredentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserCredentials.swift; sourceTree = ""; }; 40F445AD2A9DFC34004BE3DA /* UserState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserState.swift; sourceTree = ""; }; 40F445AF2A9DFC58004BE3DA /* CallKitState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallKitState.swift; sourceTree = ""; }; @@ -2153,7 +2152,6 @@ 40F445E92A9E297B004BE3DA /* CallStateResponseFields+Identifiable.swift */, 40F446032A9E2C78004BE3DA /* MicrophoneChecker+MicrophoneChecking.swift */, 40F446052A9E2CB8004BE3DA /* CallViewModel+CallSettingsPublisher.swift */, - 409BFA3F2A9F79D2003341EF /* View+OptionalPublisher.swift */, 402F04B02B724EE500CA1986 /* CallViewModel+Snapshot.swift */, ); path = Extensions; @@ -2191,7 +2189,6 @@ 403EFC9D2BDBFDEE0057C248 /* Feedback */ = { isa = PBXGroup; children = ( - 403EFC9E2BDBFE050057C248 /* CallEndedViewModifier.swift */, 403EFCA02BDC003A0057C248 /* DemoFeedbackView.swift */, ); path = Feedback; @@ -2518,6 +2515,7 @@ 40C7B82A2B612D5100FB9DB2 /* ViewModifiers */ = { isa = PBXGroup; children = ( + 403EFC9E2BDBFE050057C248 /* CallEndedViewModifier.swift */, 408D29A02B6D208700885473 /* Snapshot */, 409145E92B68FDD2007F3C17 /* ReadableContentGuide */, 40C7B82B2B612D6000FB9DB2 /* ParticipantsListViewModifier.swift */, @@ -2771,6 +2769,7 @@ isa = PBXGroup; children = ( 40FA12F12B76AC8300CE3EC9 /* RTCCVPixelBuffer+Convenience.swift */, + 40F18B8D2BEBB65100ADF76E /* View+OptionalPublisher.swift */, ); path = Extensions; sourceTree = ""; @@ -4547,7 +4546,6 @@ 4030E5A02A9DF5BD003E8CBA /* AppEnvironment.swift in Sources */, 40F445B42A9E01B2004BE3DA /* AuthenticationProvider.swift in Sources */, 4093861C2AA0A11500FF5AF4 /* LogQueue.swift in Sources */, - 409BFA402A9F79D2003341EF /* View+OptionalPublisher.swift in Sources */, 844ADA6D2AD443AC00769F6A /* DemoCallsViewModel.swift in Sources */, 403EFCA12BDC003A0057C248 /* DemoFeedbackView.swift in Sources */, 847B47AF2A233AE2000714CE /* DemoAppViewFactory.swift in Sources */, @@ -4562,7 +4560,6 @@ 40D946412AA5ECEF00C8861B /* CodeScanner.swift in Sources */, 409145FC2B68FEF0007F3C17 /* DemoMoreControlsViewModifier.swift in Sources */, 40F445AE2A9DFC34004BE3DA /* UserState.swift in Sources */, - 403EFC9F2BDBFE050057C248 /* CallEndedViewModifier.swift in Sources */, 40F445F52A9E2AA1004BE3DA /* ReactionOverlayView.swift in Sources */, 8456E6C2287EB405004E180E /* LoginView.swift in Sources */, 844ADA6B2AD4439D00769F6A /* DemoCallsView.swift in Sources */, @@ -4678,7 +4675,6 @@ 406A8EB42AA1D8F5001F598A /* LoginView.swift in Sources */, 40AB35502B738C6000E465CC /* LongPressToFocusViewModifier.swift in Sources */, 40AB354C2B738C5700E465CC /* DemoMoreControlsViewModifier.swift in Sources */, - 406A8EA02AA1D7E9001F598A /* View+OptionalPublisher.swift in Sources */, 406A8E9E2AA1D7E9001F598A /* URL+Convenience.swift in Sources */, 40AB353F2B738C1500E465CC /* CodeScanner.swift in Sources */, 406A8EB52AA1D91E001F598A /* JoinCallView.swift in Sources */, @@ -5018,6 +5014,7 @@ 848CCCE72AB8ED8F002E83A2 /* ThumbnailsSettingsRequest.swift in Sources */, 8206D8532A5FF3260099F5EC /* SystemEnvironment+Version.swift in Sources */, 842B8E1C2A2DFED900863A87 /* AcceptCallResponse.swift in Sources */, + 40F18B8E2BEBB65100ADF76E /* View+OptionalPublisher.swift in Sources */, 842B8E262A2DFED900863A87 /* CallParticipantResponse.swift in Sources */, 8409465729AF4EEC007AF5BF /* CallRecording.swift in Sources */, 842E70D52B91BE1700D2D68B /* CallHLSBroadcastingFailedEvent.swift in Sources */, @@ -5276,6 +5273,7 @@ 40E110472B5A9DF4007DF492 /* CallDurationView.swift in Sources */, 40A9416E2B4D959F006D6965 /* StreamPictureInPictureAdapter.swift in Sources */, 846FBE8B28AAD84A00147F6E /* InviteParticipantsViewModel.swift in Sources */, + 40F18B8C2BEBAC4C00ADF76E /* CallEndedViewModifier.swift in Sources */, 40E110492B5A9F03007DF492 /* Formatters.swift in Sources */, 40C7B8322B61325500FB9DB2 /* ModalButton.swift in Sources */, 8498796828A15F0300D06F31 /* ViewFactory.swift in Sources */, diff --git a/docusaurus/docs/iOS/05-ui-cookbook/18-call-quality-rating.mdx b/docusaurus/docs/iOS/05-ui-cookbook/18-call-quality-rating.mdx new file mode 100644 index 000000000..fc26b41ef --- /dev/null +++ b/docusaurus/docs/iOS/05-ui-cookbook/18-call-quality-rating.mdx @@ -0,0 +1,206 @@ +--- +title: Call Quality Rating +description: Documentation on implementing feedback collection when a call ends. +--- + +# Introduction +​ +In this guide, we are going to show how one can build a call quality rating form on top of our Swift Video SDK. It is a good practice to ask your end users about their overall experience after the end of the call or, while being in a call. + +Here is a preview of the component we are going to build: +![alt text](../assets/call-quality-rating.png) + +# Submit Feedback API +​ +Our Swift Video SDK provides an API for collecting this feedback which later can be seen in the call stats section of our dashboard. + +```swift +try await call.collectUserFeedback( + rating: rating, // a rating grade from 1 - 5, + reason: "it worked great!", // the main feedback + custom: [ + // ... any extra properties that you wish to collect + ] +) +``` + +# Implementation + +We are going to present a simple view that will be presented as a modal to the user and ask for feedback. + +The feedback view we are going to show will look like the one on the image above and is represented by this code: + +```swift +struct DemoFeedbackView: View { + + @Environment(\.openURL) private var openURL + @Injected(\.appearance) private var appearance + + @State private var email: String = "" + @State private var comment: String = "" + @State private var rating: Int = 1 + @State private var isSubmitting = false + + private var call: Call + private var dismiss: () -> Void + private var isSubmitEnabled: Bool { !email.isEmpty && !isSubmitting } + + init(_ call: Call, dismiss: @escaping () -> Void) { + self.call = call + self.dismiss = dismiss + } + + var body: some View { + ScrollView { + VStack(spacing: 32) { + Image(.feedbackLogo) + + VStack(spacing: 8) { + Text("How is your call going?") + .font(appearance.fonts.headline) + .foregroundColor(appearance.colors.text) + .lineLimit(1) + + Text("All feedback is celebrated!") + .font(appearance.fonts.subheadline) + .foregroundColor(.init(appearance.colors.textLowEmphasis)) + .lineLimit(2) + } + .frame(maxWidth: .infinity, alignment: .center) + .multilineTextAlignment(.center) + + VStack(spacing: 27) { + VStack(spacing: 16) { + TextField( + "Email Address *", + text: $email + ) + .textFieldStyle(DemoTextfieldStyle()) + + DemoTextEditor(text: $comment, placeholder: "Message") + } + + HStack { + Text("Rate Quality") + .font(appearance.fonts.body) + .foregroundColor(.init(appearance.colors.textLowEmphasis)) + .frame(maxWidth: .infinity, alignment: .leading) + + DemoStarRatingView(rating: $rating) + } + } + + HStack { + Button { + resignFirstResponder() + openURL(.init(string: "https://getstream.io/video/#contact")!) + } label: { + Text("Contact Us") + } + .frame(maxWidth: .infinity) + .foregroundColor(appearance.colors.text) + .padding(.vertical, 4) + .clipShape(Capsule()) + .overlay(Capsule().stroke(Color(appearance.colors.textLowEmphasis), lineWidth: 1)) + + Button { + resignFirstResponder() + isSubmitting = true + Task { + do { + try await call.collectUserFeedback( + rating: rating, + reason: """ + \(email) + \(comment) + """ + ) + Task { @MainActor in + dismiss() + } + isSubmitting = false + } catch { + log.error(error) + dismiss() + isSubmitting = false + } + } + } label: { + if isSubmitting { + ProgressView() + } else { + Text("Submit") + } + } + .frame(maxWidth: .infinity) + .foregroundColor(appearance.colors.text) + .padding(.vertical, 4) + .background(isSubmitEnabled ? appearance.colors.accentBlue : appearance.colors.lightGray) + .disabled(!isSubmitEnabled) + .clipShape(Capsule()) + } + + Spacer() + } + .padding(.horizontal) + } + } +} +``` + +The View uses a simple view for the start rating: + +```swift +struct DemoStarRatingView: View { + var rating: Binding + + private var range: ClosedRange + + init( + rating: Binding, + minRating: Int = 1, + maxRating: Int = 5 + ) { + self.rating = rating + range = minRating...maxRating + } + + var body: some View { + HStack { + ForEach(range, id: \.self) { index in + Image(systemName: index <= rating.wrappedValue ? "star.fill" : "star") + .resizable() + .frame(width: 30, height: 30) + .foregroundColor(.yellow) + .onTapGesture { + rating.wrappedValue = index + } + } + } + } +} +``` + +With the FeedbackView declared, the next step is to find a way to inject the View in the call's lifecycle in order to be presented to the user at the right time. To simplify this step, the Swift Video SDK provides the `onCallEnded` ViewModifier . The modifier accepts a closure with inputs an optional `Call` object and a dismiss closure. + +```swift +var body: some View { + YourRootView() + .modifier(CallModifier(viewModel: viewModel)) + .onCallEnded { call, dismiss in + if let call { + DemoFeedbackView(call, dismiss: dismiss) + } + } +} +``` + +The ViewModifier observes the Call's lifecycle andy by using following triggering criteria: +- Once the active call has ended +- If the max number of joined participants, during call's duration, grew to more than one + +Then the modifier will trigger the provided closure and will expect a view that will presented inside the modal. + +:::note +The ViewModifier will provide you with a dismiss closure that you can use in your UI to dismiss the modal. +::: \ No newline at end of file diff --git a/docusaurus/docs/iOS/05-ui-cookbook/18-transcriptions.mdx b/docusaurus/docs/iOS/05-ui-cookbook/19-transcriptions.mdx similarity index 100% rename from docusaurus/docs/iOS/05-ui-cookbook/18-transcriptions.mdx rename to docusaurus/docs/iOS/05-ui-cookbook/19-transcriptions.mdx diff --git a/docusaurus/docs/iOS/assets/call-quality-rating.png b/docusaurus/docs/iOS/assets/call-quality-rating.png new file mode 100644 index 0000000000000000000000000000000000000000..268014a541f1809ff42328bfbe471b783a95857f GIT binary patch literal 74687 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

  • @aeY|*bkyBpt={S3ub<4NjT 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 Z5z^zICY6F+5@UY>R24N8%H&?4{|if0q#*zR literal 0 HcmV?d00001