feat: 完善相册 AI 修图模板选择流程

This commit is contained in:
2026-08-11 15:22:08 +08:00
parent 43c75c8e36
commit e64dcec094
11 changed files with 261 additions and 202 deletions
@@ -10,8 +10,8 @@ import UIKit
/// 相册项目续页回调,返回当前筛选和排序下的完整已加载项目及总数。
typealias TravelAlbumPreviewLoadMore = () async -> (projects: [TravelAlbumPreviewProject], totalCount: Int)
/// 相册项目刷新回调,失败时由预览页保留当前内容并展示错误。
typealias TravelAlbumPreviewReload = () async throws -> (projects: [TravelAlbumPreviewProject], totalCount: Int)
/// 相册项目定向刷新回调,根据原素材 ID 返回该项目的最新数据。
typealias TravelAlbumPreviewReload = (_ materialId: Int) async throws -> TravelAlbumPreviewProject
/// 旅拍相册全屏图片预览页,支持项目分页、关联图 Tab、缩放和沉浸式工具栏。
final class TravelAlbumPhotoPreviewViewController: UIViewController {
@@ -481,7 +481,7 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
onSubmitted: { [weak self] in
guard let self else { return }
self.showPreviewToast("AI修图任务已提交")
self.reloadProjects(showSuccessToast: false, forceRefreshImage: false)
self.reloadProjects(showGlobalLoading: false, forceRefreshImage: false)
}
)
present(controller, animated: true)
@@ -578,32 +578,36 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
}
@objc private func refreshTapped() {
reloadProjects(showSuccessToast: true, forceRefreshImage: true)
reloadProjects(showGlobalLoading: true, forceRefreshImage: true)
}
private func reloadProjects(showSuccessToast: Bool, forceRefreshImage: Bool) {
private func reloadProjects(showGlobalLoading: Bool, forceRefreshImage: Bool) {
guard !isRefreshingProject else { return }
guard let reload else {
if showSuccessToast { showPreviewToast("关联图片刷新接口待接入") }
return
}
guard let reload else { return }
isRefreshingProject = true
updateRefreshButton()
if showGlobalLoading { GlobalLoadingManager.shared.show() }
let currentProjectId = currentProject?.id
let currentProjectIndex = currentNode?.projectIndex ?? 0
let kind = currentAsset?.kind ?? .original
Task { [weak self] in
defer {
if showGlobalLoading { GlobalLoadingManager.shared.hide() }
}
guard let self else { return }
do {
let result = try await reload()
guard let currentProjectId else {
self.isRefreshingProject = false
self.updateRefreshButton()
return
}
let project = try await reload(currentProjectId)
self.applySuccessfulReload(
projects: result.projects,
totalCount: result.totalCount,
project: project,
currentProjectId: currentProjectId,
fallbackProjectIndex: currentProjectIndex,
kind: kind,
showSuccessToast: showSuccessToast,
forceRefreshImage: forceRefreshImage
)
} catch is CancellationError {
@@ -612,37 +616,28 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
} catch {
self.isRefreshingProject = false
self.updateRefreshButton()
if showSuccessToast {
let message = error.localizedDescription.trimmingCharacters(in: .whitespacesAndNewlines)
self.showPreviewToast(message.isEmpty ? "刷新失败" : message)
}
}
}
}
private func applySuccessfulReload(
projects refreshedProjects: [TravelAlbumPreviewProject],
totalCount: Int,
currentProjectId: Int?,
project refreshedProject: TravelAlbumPreviewProject,
currentProjectId: Int,
fallbackProjectIndex: Int,
kind: TravelAlbumPreviewAssetKind,
showSuccessToast: Bool,
forceRefreshImage: Bool
) {
let incoming = Self.deduplicated(refreshedProjects)
guard !incoming.isEmpty else {
guard !projects.isEmpty else {
isRefreshingProject = false
updateRefreshButton()
if showSuccessToast { dismiss(animated: true) }
dismiss(animated: true)
return
}
projects = incoming
self.totalCount = max(totalCount, incoming.count)
let targetProjectIndex = currentProjectId.flatMap { id in
incoming.firstIndex { $0.id == id }
} ?? min(max(0, fallbackProjectIndex), incoming.count - 1)
let resolvedKind = incoming[targetProjectIndex].asset(for: kind) == nil ? .original : kind
let targetProjectIndex = projects.firstIndex { $0.id == currentProjectId }
?? min(max(0, fallbackProjectIndex), projects.count - 1)
projects[targetProjectIndex] = refreshedProject
let resolvedKind = refreshedProject.asset(for: kind) == nil ? .original : kind
selectedKind = resolvedKind
rebuildNodes(keepingProjectIndex: targetProjectIndex, kind: resolvedKind)
collectionView.reloadData()
@@ -652,7 +647,6 @@ final class TravelAlbumPhotoPreviewViewController: UIViewController {
if forceRefreshImage { forceRefreshCurrentImage() }
isRefreshingProject = false
updateRefreshButton()
if showSuccessToast { showPreviewToast("刷新成功") }
}
private func forceRefreshCurrentImage() {