From acd72fb2697b3e37f53b1ea29263931d27925e8c Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Tue, 29 Nov 2022 15:23:54 +0400 Subject: [PATCH] ios: remove voice message preview and stop rec/play if preference change prohibits it; more robust logic to stop playback on send (#1463) --- .../Chat/ComposeMessage/ComposeView.swift | 19 ++++++++++++++++--- .../ComposeMessage/ComposeVoiceView.swift | 7 ++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index 5399acb15..e237737f0 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -170,6 +170,10 @@ struct ComposeView: View { @State private var audioRecorder: AudioRecorder? @State private var voiceMessageRecordingTime: TimeInterval? @State private var startingRecording: Bool = false + // for some reason voice message preview playback occasionally + // fails to stop on ComposeVoiceView.playbackMode().onDisappear, + // this is a workaround to fire an explicit event in certain cases + @State private var stopPlayback: Bool = false var body: some View { VStack(spacing: 0) { @@ -300,7 +304,6 @@ struct ComposeView: View { } } .onDisappear { - audioRecorder?.stop() if let fileName = composeState.voiceMessageRecordingFileName { cancelVoiceMessageRecording(fileName) } @@ -314,6 +317,12 @@ struct ComposeView: View { startingRecording = false } } + .onChange(of: chat.chatInfo.voiceMessageAllowed) { vmAllowed in + if !vmAllowed && composeState.voicePreview, + let fileName = composeState.voiceMessageRecordingFileName { + cancelVoiceMessageRecording(fileName) + } + } } @ViewBuilder func previewView() -> some View { @@ -336,7 +345,8 @@ struct ComposeView: View { recordingTime: $voiceMessageRecordingTime, recordingState: $composeState.voiceMessageRecordingState, cancelVoiceMessage: { cancelVoiceMessageRecording($0) }, - cancelEnabled: !composeState.editing + cancelEnabled: !composeState.editing, + stopPlayback: $stopPlayback ) case let .filePreview(fileName: fileName): ComposeFileView( @@ -427,6 +437,7 @@ struct ComposeView: View { await send(.text(composeState.message), quoted: quoted) } case let .voicePreview(recordingFileName, duration): + stopPlayback.toggle() await send(.voice(text: composeState.message, duration: duration), quoted: quoted, file: recordingFileName) case .filePreview: if let fileURL = chosenFile, @@ -542,6 +553,8 @@ struct ComposeView: View { } private func cancelVoiceMessageRecording(_ fileName: String) { + stopPlayback.toggle() + audioRecorder?.stop() removeFile(fileName) clearState() } @@ -554,9 +567,9 @@ struct ComposeView: View { cancelledLinks = [] chosenImages = [] chosenFile = nil - audioRecorder?.stop() audioRecorder = nil voiceMessageRecordingTime = nil + startingRecording = false } private func updateMsgContent(_ msgContent: MsgContent) -> MsgContent { diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift index 1ec0f23fd..77310240b 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeVoiceView.swift @@ -34,6 +34,7 @@ struct ComposeVoiceView: View { let cancelVoiceMessage: ((String) -> Void) let cancelEnabled: Bool + @Binding var stopPlayback: Bool // value is not taken into account, only the fact it switches @State private var audioPlayer: AudioPlayer? @State private var playbackState: VoiceMessagePlaybackState = .noPlayback @State private var playbackTime: TimeInterval? @@ -111,6 +112,9 @@ struct ComposeVoiceView: View { ProgressBar(length: recordingLength, progress: $playbackTime) } } + .onChange(of: stopPlayback) { _ in + audioPlayer?.stop() + } .onDisappear { audioPlayer?.stop() } @@ -183,7 +187,8 @@ struct ComposeVoiceView_Previews: PreviewProvider { recordingTime: Binding.constant(TimeInterval(20)), recordingState: Binding.constant(VoiceMessageRecordingState.recording), cancelVoiceMessage: { _ in }, - cancelEnabled: true + cancelEnabled: true, + stopPlayback: Binding.constant(false) ) .environmentObject(ChatModel()) }