| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- //
- // LNIMChatInputMenuView.swift
- // Lanu
- //
- // Created by OneeChan on 2025/12/4.
- //
- import Foundation
- import UIKit
- import SnapKit
- import AVFAudio
- class LNIMChatInputMenuView: UIView {
- private let container = UIView()
- private let textInput = LNIMChatTextInputView()
- private let voiceInput = LNIMChatVoiceInputView()
-
- weak var viewModel: LNIMChatViewModel? {
- didSet {
- textInput.viewModel = viewModel
- voiceInput.viewModel = viewModel
- }
- }
-
- override init(frame: CGRect) {
- super.init(frame: frame)
-
- setupViews()
- }
-
- func hideInput() {
- textInput.hideInput()
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNIMChatInputMenuView: LNIMChatTextInputViewDelegate {
- func onVoiceInputClick() {
- endEditing(true)
-
- LNPermissionHelper.requestMicrophoneAccess { [weak self] granted in
- guard let self else { return }
- guard granted else {
- showToast(.init(key: "B00022"))
- return
- }
-
- textInput.snp.remakeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.top.equalTo(self.container.snp.bottom)
- }
- voiceInput.snp.remakeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- voiceInput.startRecord()
- UIView.animate(withDuration: 0.1) { [weak self] in
- guard let self else { return }
- layoutIfNeeded()
- }
- }
- }
- }
- extension LNIMChatInputMenuView: LNIMChatVoiceInputViewDelegate {
- func onVoiceFinishInput() {
- voiceInput.snp.remakeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.top.equalTo(container.snp.bottom)
- }
- textInput.snp.remakeConstraints { make in
- make.edges.equalToSuperview()
- }
- UIView.animate(withDuration: 0.1) { [weak self] in
- guard let self else { return }
- layoutIfNeeded()
- }
- }
- }
- extension LNIMChatInputMenuView {
- private func setupViews() {
- backgroundColor = .fill
-
- container.clipsToBounds = true
- addSubview(container)
- container.snp.makeConstraints { make in
- make.top.equalToSuperview()
- make.horizontalEdges.equalToSuperview()
- make.bottom.equalToSuperview()
- }
-
- textInput.delegate = self
- container.addSubview(textInput)
- textInput.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- voiceInput.delegate = self
- container.addSubview(voiceInput)
- voiceInput.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.top.equalTo(container.snp.bottom)
- }
- }
- }
- #if DEBUG
- import SwiftUI
- struct LNIMChatInputMenuViewPreview: UIViewRepresentable {
- func makeUIView(context: Context) -> some UIView {
- let container = UIView()
- container.backgroundColor = .lightGray
-
- let view = LNIMChatInputMenuView()
- container.addSubview(view)
- view.snp.makeConstraints { make in
- make.leading.trailing.bottom.equalToSuperview()
- }
-
- return container
- }
-
- func updateUIView(_ uiView: UIViewType, context: Context) { }
- }
- #Preview(body: {
- LNIMChatInputMenuViewPreview()
- })
- #endif
|