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:
@@ -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 {
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user