feat: add AI retouch task center

This commit is contained in:
2026-08-14 15:06:57 +08:00
parent 0f3b26991e
commit 30bfe0313f
26 changed files with 3679 additions and 50 deletions
@@ -12,6 +12,7 @@ final class MessageDetailViewController: BaseViewController {
private let viewModel: MessageDetailViewModel
private let api: any MessageCenterServing
private let travelAlbumAPI: any TravelAlbumServing
private let scrollView = UIScrollView()
private let contentView = UIView()
@@ -20,13 +21,19 @@ final class MessageDetailViewController: BaseViewController {
private let timeContainer = UIView()
private let timeLabel = UILabel()
private let bodyLabel = UILabel()
private let taskDetailButton = UIButton(type: .system)
private let bottomBar = UIView()
private let deleteButton = UIButton(type: .system)
/// 初始化消息详情页。
init(message: MessageItem, api: (any MessageCenterServing)? = nil) {
init(
message: MessageItem,
api: (any MessageCenterServing)? = nil,
travelAlbumAPI: (any TravelAlbumServing)? = nil
) {
viewModel = MessageDetailViewModel(message: message)
self.api = api ?? NetworkServices.shared.messageCenterAPI
self.travelAlbumAPI = travelAlbumAPI ?? NetworkServices.shared.travelAlbumAPI
super.init(nibName: nil, bundle: nil)
}
@@ -67,6 +74,15 @@ final class MessageDetailViewController: BaseViewController {
bodyLabel.numberOfLines = 0
bodyLabel.textAlignment = .left
taskDetailButton.setTitle("查看任务详情", for: .normal)
taskDetailButton.setTitleColor(.white, for: .normal)
taskDetailButton.titleLabel?.font = .systemFont(ofSize: 16, weight: .semibold)
taskDetailButton.backgroundColor = AppColor.primary
taskDetailButton.layer.cornerRadius = 10
taskDetailButton.clipsToBounds = true
taskDetailButton.isHidden = !viewModel.showsAIRetouchTaskAction
taskDetailButton.accessibilityLabel = "查看AI修图任务详情"
bottomBar.backgroundColor = .white
deleteButton.setTitle("删除并返回", for: .normal)
deleteButton.setTitleColor(.white, for: .normal)
@@ -77,7 +93,7 @@ final class MessageDetailViewController: BaseViewController {
view.addSubview(scrollView)
scrollView.addSubview(contentView)
[typeImageView, titleLabel, timeContainer, bodyLabel].forEach(contentView.addSubview)
[typeImageView, titleLabel, timeContainer, bodyLabel, taskDetailButton].forEach(contentView.addSubview)
timeContainer.addSubview(timeLabel)
view.addSubview(bottomBar)
bottomBar.addSubview(deleteButton)
@@ -121,12 +137,23 @@ final class MessageDetailViewController: BaseViewController {
bodyLabel.snp.makeConstraints { make in
make.top.equalTo(timeContainer.snp.bottom).offset(24)
make.leading.trailing.equalToSuperview().inset(32)
make.bottom.lessThanOrEqualToSuperview().inset(24)
if !viewModel.showsAIRetouchTaskAction {
make.bottom.lessThanOrEqualToSuperview().inset(24)
}
}
if viewModel.showsAIRetouchTaskAction {
taskDetailButton.snp.makeConstraints { make in
make.top.equalTo(bodyLabel.snp.bottom).offset(24)
make.leading.trailing.equalToSuperview().inset(32)
make.height.equalTo(52)
make.bottom.lessThanOrEqualToSuperview().inset(24)
}
}
}
override func bindActions() {
deleteButton.addTarget(self, action: #selector(deleteTapped), for: .touchUpInside)
taskDetailButton.addTarget(self, action: #selector(taskDetailTapped), for: .touchUpInside)
viewModel.onStateChange = { [weak self] in
Task { @MainActor in
self?.applyState()
@@ -145,6 +172,16 @@ final class MessageDetailViewController: BaseViewController {
}
}
@objc private func taskDetailTapped() {
let target: UIViewController
if let batchId = viewModel.aiRetouchBatchId {
target = TravelAlbumAIJobDetailViewController(batchId: batchId, api: travelAlbumAPI)
} else {
target = TravelAlbumAIJobListViewController(api: travelAlbumAPI)
}
navigationController?.pushViewController(target, animated: true)
}
@objc private func deleteTapped() {
let alert = UIAlertController(title: "删除消息", message: "确定要删除这条消息吗?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "取消", style: .cancel))