Visual_Novel_iOS/crush/Crush/Src/Modules/Chat/Setting/ChatPersonalSettingControll...

169 lines
5.5 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// ChatPersonalSettingController.swift
// Crush
//
// Created by Leon on 2025/8/17.
//
import UIKit
import Combine
class ChatPersonalSettingController: CLViewController<ChatPersonalSetting> {
lazy var birthdayPicker: BirthdayPickerView = BirthdayPickerView()
var setting: IMChatSetting?
@Published var buttonEnable:Bool = false
private var cancellables = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
setupDatas()
setupEvents()
}
private func setupViews() {
navigationView.alpha0Title = "My Chat Persona"
navigationView.setupNaviRightStyleButton()
navigationView.styleMainButton.setTitle("Save", for: .normal)
navigationView.styleMainButton.addTarget(self, action: #selector(tapNaviSaveButton), for: .touchUpInside)
}
private func setupDatas() {
}
private func setupEvents() {
container.birthdaySelectView.selectBlock = { [weak self] in
self?.selectBirthday()
}
navigationView.tapBackButtonAction = { [weak self] in
if self?.container.editFlag ?? false{
self?.alertToExitNotSaved()
}else{
self?.close()
}
}
$buttonEnable.sink {[weak self] enable in
self?.navigationView.styleMainButton.isEnabled = enable
}.store(in: &cancellables)
Publishers.CombineLatest4(container.$whoIm.prepend(nil), container.$birthdayDate.prepend(nil), container.$nickname.prepend(nil), container.$editFlag.prepend(false)).map{ [weak self]
whoIm, date, name, editFlag in
guard let birthdayDate = date, let nickname = name else{
return false
}
if Date().years(from: birthdayDate) < 18{
return false
}
if !nickname.isValidNickname {
return false
}
if let content = whoIm{
if content.trimmed.count > 0 && content.count < 10{
return false
}
}
// Add: .1 container.editFlag
// if let oldNickname = self?.setting?.nickname, let oldBirthday = self?.setting?.birthday, let oldWhoIm = self?.setting?.whoAmI{
// if oldNickname == name && birthdayDate.timeStamp == oldBirthday && whoIm == oldWhoIm{
// return false
// }
// }
guard editFlag else{
return false
}
return true
}.assign(to: &$buttonEnable)
container.config(setting)
}
private func selectBirthday() {
if let date = container.birthdayDate{
birthdayPicker.setupDefaultSelectDate(date)
}else if let dateStr = container.birthdayStr{
let date = Date(dateString: dateStr, format: "yyyy-MM-dd")
birthdayPicker.setupDefaultSelectDate(date)
}
birthdayPicker.show()
birthdayPicker.tapConfirmAction = { [weak self] date, timestamp in
dlog("birthday date:\(date). timestamp:\(timestamp)")
self?.container.birthdayDate = date
self?.container.birthdayStr = date.toString(dateFormat: "yyyy-MM-dd")
self?.container.editFlag = true
}
}
// MARK: - Action
@objc private func tapNaviSaveButton(){
guard let newNickname = container.nickname, let before = container.nickname else{
return
}
Hud.showIndicator()
if newNickname != before {
UserOperator.checkname(name: newNickname) {[weak self] nicknameOK in
if nicknameOK{
self?.doSaveChatSetting()
}else{
Hud.hideIndicator()
}
}
}else{
doSaveChatSetting()
}
}
// MARK: - Functions
private func doSaveChatSetting(){
guard let aiId = setting?.aiId else {return}
var params = [String:Any]()
let nickname = container.nickname
let birthday = container.birthdayDate!.timeStamp
let whoAmI = container.whoIm
params.updateValue(aiId, forKey: "aiId")
params.updateValue(nickname ?? "-", forKey: "nickname")
params.updateValue(birthday, forKey: "birthday")
params.updateValue(whoAmI ?? "", forKey: "whoAmI")
AIRoleProvider.request(.chatSetup(params: params), modelType: EmptyModel.self) {[weak self] result in
Hud.hideIndicator()
switch result {
case .success:
Hud.toast(str: "保存成功")
NotificationCenter.post(name: .chatPersonaUpdated)
self?.navigationController?.popViewController(animated: true)
case .failure:
break
}
}
}
@objc private func alertToExitNotSaved() {
view.endEditing(true)
let alert = Alert(title: "Save edited content", text: "Edits will not be saved after exiting. Are you sure you want to continue?")
let action1 = AlertAction(title: "Give up", actionStyle: .confirm) { [weak self] in
self?.close()
}
let action2 = AlertAction(title: "Cancel", actionStyle: .cancel)
alert.addAction(action1)
alert.addAction(action2)
alert.show()
}
}