feat: 完善相册 AI 修图模板选择流程
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user