diff --git a/SodaLive/Resources/Assets.xcassets/ic_record.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_record.imageset/Contents.json new file mode 100644 index 0000000..bf7b6a4 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_record.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_record.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_record.imageset/ic_record.png b/SodaLive/Resources/Assets.xcassets/ic_record.imageset/ic_record.png new file mode 100644 index 0000000..3da4ab7 Binary files /dev/null and b/SodaLive/Resources/Assets.xcassets/ic_record.imageset/ic_record.png differ diff --git a/SodaLive/Resources/Assets.xcassets/ic_record_pause.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_record_pause.imageset/Contents.json new file mode 100644 index 0000000..5a1a314 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_record_pause.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_record_pause.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_record_pause.imageset/ic_record_pause.png b/SodaLive/Resources/Assets.xcassets/ic_record_pause.imageset/ic_record_pause.png new file mode 100644 index 0000000..4327dfb Binary files /dev/null and b/SodaLive/Resources/Assets.xcassets/ic_record_pause.imageset/ic_record_pause.png differ diff --git a/SodaLive/Resources/Assets.xcassets/ic_record_play.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_record_play.imageset/Contents.json new file mode 100644 index 0000000..5dc90ae --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_record_play.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_record_play.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_record_play.imageset/ic_record_play.png b/SodaLive/Resources/Assets.xcassets/ic_record_play.imageset/ic_record_play.png new file mode 100644 index 0000000..aa0af8c Binary files /dev/null and b/SodaLive/Resources/Assets.xcassets/ic_record_play.imageset/ic_record_play.png differ diff --git a/SodaLive/Resources/Assets.xcassets/ic_record_stop.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_record_stop.imageset/Contents.json new file mode 100644 index 0000000..1183aa1 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_record_stop.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_record_stop.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_record_stop.imageset/ic_record_stop.png b/SodaLive/Resources/Assets.xcassets/ic_record_stop.imageset/ic_record_stop.png new file mode 100644 index 0000000..d44e5ef Binary files /dev/null and b/SodaLive/Resources/Assets.xcassets/ic_record_stop.imageset/ic_record_stop.png differ diff --git a/SodaLive/Resources/Assets.xcassets/ic_save.imageset/Contents.json b/SodaLive/Resources/Assets.xcassets/ic_save.imageset/Contents.json new file mode 100644 index 0000000..1846a98 --- /dev/null +++ b/SodaLive/Resources/Assets.xcassets/ic_save.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_save.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SodaLive/Resources/Assets.xcassets/ic_save.imageset/ic_save.png b/SodaLive/Resources/Assets.xcassets/ic_save.imageset/ic_save.png new file mode 100644 index 0000000..70c82f3 Binary files /dev/null and b/SodaLive/Resources/Assets.xcassets/ic_save.imageset/ic_save.png differ diff --git a/SodaLive/Sources/Message/Voice/VoiceMessageView.swift b/SodaLive/Sources/Message/Voice/VoiceMessageView.swift index eece48e..401840e 100644 --- a/SodaLive/Sources/Message/Voice/VoiceMessageView.swift +++ b/SodaLive/Sources/Message/Voice/VoiceMessageView.swift @@ -41,11 +41,21 @@ struct VoiceMessageView: View { viewModel.isShowPopup = true return } else { + viewModel.keepVoiceMessage() } }, onClickReply: { viewModel.selectedMessageId = item.messageId soundManager.stopAudio() + AppState.shared.setAppStep( + step: .writeVoiceMessage( + userId: item.senderId, + nickname: item.senderNickname, + onRefresh: { + viewModel.refresh() + } + ) + ) }, onClickDelete: { viewModel.selectedMessageId = item.messageId @@ -180,6 +190,7 @@ struct VoiceMessageView: View { .multilineTextAlignment(.leading) .fixedSize(horizontal: false, vertical: true) .cornerRadius(20) + .padding(.top, 66.7) Spacer() } } diff --git a/SodaLive/Sources/Message/Voice/VoiceMessageViewModel.swift b/SodaLive/Sources/Message/Voice/VoiceMessageViewModel.swift index c3c2497..36f64cf 100644 --- a/SodaLive/Sources/Message/Voice/VoiceMessageViewModel.swift +++ b/SodaLive/Sources/Message/Voice/VoiceMessageViewModel.swift @@ -116,6 +116,52 @@ final class VoiceMessageViewModel: ObservableObject { .store(in: &subscription) } + func keepVoiceMessage() { + if selectedMessageId <= 0 { + errorMessage = "메시지를 저장하지 못했습니다\n잠시 후 다시 시도해 주세요." + isShowPopup = true + return + } + + isLoading = true + repository.keepVoiceMessage(messageId: selectedMessageId) + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { [unowned self] response in + self.isLoading = false + let responseData = response.data + + do { + let jsonDecoder = JSONDecoder() + let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData) + + if decoded.success { + self.errorMessage = "보관되었습니다." + self.isShowPopup = true + self.refresh() + } else { + if let message = decoded.message { + self.errorMessage = message + self.isShowPopup = true + } else { + self.errorMessage = "메시지를 보관하지 못했습니다.\n잠시 후 다시 시도해 주세요." + } + + self.isShowPopup = true + } + } catch { + self.errorMessage = "메시지를 보관하지 못했습니다.\n잠시 후 다시 시도해 주세요." + self.isShowPopup = true + } + } + .store(in: &subscription) + } + func keepTextMessage() { if selectedMessageId <= 0 { errorMessage = "메시지를 저장하지 못했습니다\n잠시 후 다시 시도해 주세요."