ios: remove voice message preview and stop rec/play if preference change prohibits it; more robust logic to stop playback on send (#1463)

This commit is contained in:
JRoberts
2022-11-29 15:23:54 +04:00
committed by GitHub
parent 8d096f469d
commit acd72fb269
2 changed files with 22 additions and 4 deletions

View File

@@ -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 {

View File

@@ -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())
}