diff --git a/SodaLive/Sources/CustomView/ChatTextFieldView.swift b/SodaLive/Sources/CustomView/ChatTextFieldView.swift new file mode 100644 index 0000000..6b5fe4f --- /dev/null +++ b/SodaLive/Sources/CustomView/ChatTextFieldView.swift @@ -0,0 +1,61 @@ +// +// ChatTextFieldView.swift +// SodaLive +// +// Created by klaus on 10/24/24. +// + +import SwiftUI +import UIKit + +struct ChatTextFieldView: UIViewRepresentable { + class Coordinator: NSObject, UITextFieldDelegate { + var parent: ChatTextFieldView + + init(parent: ChatTextFieldView) { + self.parent = parent + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + // "Send" 버튼이 눌리면 액션 실행 + parent.onSend() + return true + } + + @objc func textDidChange(_ textField: UITextField) { + parent.text = textField.text ?? "" + } + } + + @Binding var text: String + var placeholder: String + var onSend: () -> Void + + func makeUIView(context: Context) -> UITextField { + let textField = UITextField(frame: .zero) + textField.delegate = context.coordinator + textField.borderStyle = .roundedRect + textField.placeholder = placeholder + textField.autocorrectionType = .no + textField.autocapitalizationType = .none + textField.borderStyle = .none + textField.backgroundColor = UIColor(hex: "222222") + textField.textColor = UIColor(hex: "BBBBBB") + textField.tintColor = UIColor(hex: "3BB9F1") + textField.font = UIFont(name: Font.medium.rawValue, size: 13.3) + textField.returnKeyType = .send + textField.addTarget(context.coordinator, action: #selector(Coordinator.textDidChange(_:)), for: .editingChanged) + return textField + } + + func updateUIView(_ uiView: UITextField, context: Context) { + uiView.text = text + } + + func makeCoordinator() -> Coordinator { + return Coordinator(parent: self) + } +} +#Preview { + ChatTextFieldView(text: .constant(""), placeholder: "채팅을 입력하세요") {} +} diff --git a/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInputChatView.swift b/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInputChatView.swift index 0912a55..22c7cc2 100644 --- a/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInputChatView.swift +++ b/SodaLive/Sources/Live/Room/V2/Component/View/LiveRoomInputChatView.swift @@ -16,23 +16,15 @@ struct LiveRoomInputChatView: View { var body: some View { HStack(spacing: 6.7) { - TextField("채팅을 입력하세요", text: $chatMessage) - .autocapitalization(.none) - .disableAutocorrection(true) - .font(.custom(Font.medium.rawValue, size: 13.3)) - .foregroundColor(.graybb) - .accentColor(.button) - .keyboardType(.default) - .padding(.horizontal, 13.3) - .padding(.vertical, 18.3) - .background(Color.gray22) - .cornerRadius(5.3) - .frame(maxWidth: .infinity) - .overlay( - RoundedRectangle(cornerRadius: 5.3) - .strokeBorder(lineWidth: 1) - .foregroundColor(.gray77) - ) + ChatTextFieldView(text: $chatMessage, placeholder: "채팅을 입력하세요") { + if sendMessage(chatMessage) { + chatMessage = "" + } + } + .padding(.horizontal, 13.3) + .padding(.vertical, 18.3) + .fixedSize(horizontal: false, vertical: true) + .frame(maxWidth: .infinity) Image("btn_message_send") .resizable() @@ -44,6 +36,13 @@ struct LiveRoomInputChatView: View { } } } + .background(Color.gray22) + .cornerRadius(5.3) + .overlay( + RoundedRectangle(cornerRadius: 5.3) + .strokeBorder(lineWidth: 1) + .foregroundColor(.gray77) + ) .padding(13.3) } } diff --git a/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift b/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift index 1115e7c..a809a1c 100644 --- a/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift +++ b/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift @@ -185,47 +185,50 @@ struct LiveRoomViewV2: View { .padding(.bottom, 40) .padding(.trailing, 13.3) - VStack(spacing: 13.3) { - if liveRoomInfo.creatorId == UserDefaults.int(forKey: .userId) { - LiveRoomRightBottomButton( - imageName: "ic_roulette_settings", - onClick: { viewModel.isShowRouletteSettings = true } - ) - } else if liveRoomInfo.creatorId != UserDefaults.int(forKey: .userId) && viewModel.isActiveRoulette { - LiveRoomRightBottomButton( - imageName: "ic_roulette", - onClick: { viewModel.showRoulette() } - ) + HStack(alignment: .bottom, spacing: 0) { + LiveRoomInputChatView { + viewModel.sendMessage(chatMessage: $0) { + viewModel.isShowingNewChat = false + proxy.scrollTo(viewModel.messages.count - 1, anchor: .center) + } + + return true } - if viewModel.role == .SPEAKER { + VStack(spacing: 13.3) { + if liveRoomInfo.creatorId == UserDefaults.int(forKey: .userId) { + LiveRoomRightBottomButton( + imageName: "ic_roulette_settings", + onClick: { viewModel.isShowRouletteSettings = true } + ) + } else if liveRoomInfo.creatorId != UserDefaults.int(forKey: .userId) && viewModel.isActiveRoulette { + LiveRoomRightBottomButton( + imageName: "ic_roulette", + onClick: { viewModel.showRoulette() } + ) + } + LiveRoomRightBottomButton( - imageName: viewModel.isMute ? "ic_mic_off" : "ic_mic_on", - onClick: { viewModel.toggleMute() } + imageName: "ic_donation_message_list", + onClick: { viewModel.isShowDonationMessagePopup = true } ) + + if liveRoomInfo.creatorId != UserDefaults.int(forKey: .userId) { + LiveRoomRightBottomButton( + imageName: "ic_donation", + onClick: { viewModel.isShowDonationPopup = true } + ) + } + + if viewModel.role == .SPEAKER { + LiveRoomRightBottomButton( + imageName: viewModel.isMute ? "ic_mic_off" : "ic_mic_on", + onClick: { viewModel.toggleMute() } + ) + } } - - LiveRoomRightBottomButton( - imageName: "ic_donation_message_list", - onClick: { viewModel.isShowDonationMessagePopup = true } - ) - - if liveRoomInfo.creatorId != UserDefaults.int(forKey: .userId) { - LiveRoomRightBottomButton( - imageName: "ic_donation", - onClick: { viewModel.isShowDonationPopup = true } - ) - } - } - .padding(.trailing, 13.3) - - LiveRoomInputChatView { - viewModel.sendMessage(chatMessage: $0) { - viewModel.isShowingNewChat = false - proxy.scrollTo(viewModel.messages.count - 1, anchor: .center) - } - - return true + .padding(.bottom, 13.3) + .padding(.trailing, 13.3) } .padding(.bottom, 10) }