| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- //
- // LNAutoReplyEditViewController.swift
- // Gami
- //
- // Created by OneeChan on 2026/3/10.
- //
- import Foundation
- import UIKit
- import SnapKit
- extension UIView {
- func pushToAutoRelyEdit(num: Int, item: LNAutoReplyVO) {
- let vc = LNAutoReplyEditViewController()
- vc.update(num: num, item: item)
- navigationController?.pushViewController(vc, animated: true)
- }
- }
- class LNAutoReplyEditViewController: LNViewController {
- private let editView = UIView()
- private let titleLabel = UILabel()
-
- private let textEdit = LNCommonTextView()
- private let voiceEdit = LNVoiceEditView()
-
- private let rejectView = UIView()
- private let rejectLabel = UILabel()
-
- private let commitButton = UIButton()
-
- private var curItem: LNAutoReplyVO?
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- setupViews()
- }
-
- func update(num: Int, item: LNAutoReplyVO) {
- textEdit.isHidden = true
- voiceEdit.isHidden = true
- rejectView.isHidden = true
-
- titleLabel.text = .init(key: "B00114", num + 1)
-
- switch item.type {
- case .text:
- textEdit.isHidden = false
- textEdit.textView.text = item.textContent
- case .voice:
- voiceEdit.isHidden = false
- voiceEdit.update(item.voiceUrl, duration: item.voiceDuration)
- }
-
- commitButton.isEnabled = false
- commitButton.setBackgroundImage(nil, for: .normal)
- switch item.status {
- case .pass:
- commitButton.setTitle(.init(key: "A00240"), for: .normal)
- case .reject:
- commitButton.setTitle(.init(key: "B00121"), for: .normal)
-
- rejectLabel.text = item.reviewReason
- rejectView.isHidden = false
- case .reviewing:
- break
- }
-
- curItem = item
- }
- }
- extension LNAutoReplyEditViewController {
- private func commitItem(_ item: LNAutoReplyVO) {
- if item.id.isEmpty {
- LNGameMateManager.shared.createAutoReplay(item: item) { [weak self] success in
- guard let self else { return }
- guard success else { return }
- view.pushToSkillReview(cls: LNAutoReplyEditViewController.self)
- }
- } else {
- LNGameMateManager.shared.updateAutoReplay(item: item) { [weak self] success in
- guard let self else { return }
- guard success else { return }
- navigationController?.popViewController(animated: true)
- }
- }
- }
- }
- extension LNAutoReplyEditViewController: UITextViewDelegate, LNVoiceEditViewDelegate {
- func onVoiceChanged() {
- checkSubmit()
- }
-
- func textViewDidChange(_ textView: UITextView) {
- checkSubmit()
- }
- }
- extension LNAutoReplyEditViewController {
- private func checkSubmit() {
- let enable = switch curItem?.type {
- case .text:
- textEdit.text.isEmpty == false && textEdit.text != curItem?.textContent
- case .voice:
- voiceEdit.voiceInfo.0 != nil && voiceEdit.voiceInfo.1 > 0 && voiceEdit.voiceInfo.0 != curItem?.voiceUrl
- case nil:
- false
- }
-
- if commitButton.isEnabled != enable {
- commitButton.isEnabled = enable
- if enable {
- commitButton.setBackgroundImage(.primary_8, for: .normal)
- } else {
- commitButton.setBackgroundImage(nil, for: .normal)
- }
- }
- }
-
- private func setupViews() {
- title = .init(key: "B00112")
- view.backgroundColor = .primary_1
- view.onTap { [weak self] in
- guard let self else { return }
- view.endEditing(true)
- }
-
- if curItem?.id.isEmpty == false {
- let delete = UIButton()
- delete.setImage(.icDelete.withTintColor(.text_5, renderingMode: .alwaysOriginal), for: .normal)
- delete.addAction(UIAction(handler: { [weak self] _ in
- guard let self else { return }
- LNCommonAlertView.showCommonDeleteAlert { [weak self] in
- guard let self else { return }
- guard let curItem else { return }
- LNGameMateManager.shared.deleteAutoReplay(id: curItem.id) { [weak self] success in
- guard let self else { return }
- guard success else { return }
- navigationController?.popViewController(animated: true)
- }
- }
- }), for: .touchUpInside)
- setRightButton(delete)
- }
-
- let stackView = UIStackView()
- stackView.axis = .vertical
- stackView.spacing = 10
- view.addSubview(stackView)
- stackView.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.top.equalToSuperview().offset(12)
- }
-
- stackView.addArrangedSubview(buildWelcomeDetailView())
- stackView.addArrangedSubview(buildReject())
-
- commitButton.layer.cornerRadius = 23.5
- commitButton.clipsToBounds = true
- commitButton.backgroundColor = .fill_4
- commitButton.setTitleColor(.text_1, for: .normal)
- commitButton.titleLabel?.font = .heading_h3
- commitButton.addAction(UIAction(handler: { [weak self] _ in
- guard let self else { return }
- guard let curItem else { return }
-
- switch curItem.type {
- case .text:
- curItem.textContent = textEdit.text
- commitItem(curItem)
- case .voice:
- let (url, duration) = voiceEdit.voiceInfo
- guard let url else { return }
- showLoading()
- LNFileUploader.shared.startUpload(type: .voice, fileURL: URL(fileURLWithPath: url), progressHandler: nil)
- { [weak self] url, err in
- dismissLoading()
- guard let self else { return }
- if let url, err == nil {
- curItem.voiceUrl = url
- curItem.voiceDuration = duration
- commitItem(curItem)
- } else {
- showToast(err)
- }
- }
- }
- }), for: .touchUpInside)
- view.addSubview(commitButton)
- commitButton.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.bottom.equalToSuperview().offset(view.commonBottomInset)
- make.height.equalTo(47)
- }
- }
-
- private func buildWelcomeDetailView() -> UIView {
- editView.layer.cornerRadius = 12
- editView.backgroundColor = .fill
-
- titleLabel.font = .heading_h4
- titleLabel.textColor = .text_5
- editView.addSubview(titleLabel)
- titleLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.top.equalToSuperview().offset(16)
- }
-
- let stackView = UIStackView()
- stackView.axis = .vertical
- stackView.spacing = 10
- editView.addSubview(stackView)
- stackView.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.top.equalTo(titleLabel.snp.bottom).offset(8)
- make.bottom.equalToSuperview().offset(-16)
- }
-
- textEdit.delegate = self
- textEdit.maxInput = LNGameMateManager.AutoReplayMaxInput
- textEdit.placeholderLabel.text = .init(key: "B00126")
- textEdit.snp.makeConstraints { make in
- make.height.equalTo(150)
- }
- stackView.addArrangedSubview(textEdit)
-
- voiceEdit.delegate = self
- stackView.addArrangedSubview(voiceEdit)
-
- return editView
- }
-
- private func buildReject() -> UIView {
- rejectView.layer.cornerRadius = 12
- rejectView.backgroundColor = .fill
-
- let titleLabel = UILabel()
- titleLabel.text = .init(key: "B00127")
- titleLabel.font = .heading_h4
- titleLabel.textColor = .text_5
- rejectView.addSubview(titleLabel)
- titleLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.top.equalToSuperview().offset(16)
- }
-
- rejectLabel.font = .body_s
- rejectLabel.textColor = .text_4
- rejectView.addSubview(rejectLabel)
- rejectLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(16)
- make.top.equalTo(titleLabel.snp.bottom).offset(8)
- make.bottom.equalToSuperview().offset(-16)
- }
-
- return rejectView
- }
- }
- #if DEBUG
- import SwiftUI
- struct LNAutoReplyEditViewControllerPreview: UIViewControllerRepresentable {
- func makeUIViewController(context: Context) -> some UIViewController {
- LNAutoReplyEditViewController()
- }
-
- func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
-
- }
- }
- #Preview(body: {
- LNAutoReplyEditViewControllerPreview()
- })
- #endif
|