修复样片详情解析并优化列表上下架交互。

兼容 Android 媒体项 size 字段格式,增强灵活解码容错,并统一样片列表开关确认逻辑与安全区布局。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-13 15:14:40 +08:00
parent afcd412f11
commit 07b2b9d459
7 changed files with 96 additions and 47 deletions

View File

@ -187,6 +187,19 @@ final class SampleManagementViewModelTests: XCTestCase {
XCTAssertNil(viewModel.uploadDialogState)
}
func testLateProgressCallbackCannotReopenCompletedUploadDialog() async {
let viewModel = UploadSampleViewModel(currentScenicIdProvider: { 3 })
let uploader = MockSampleUploader(urls: ["https://cdn/a.jpg"])
uploader.emitLateProgress = true
await viewModel.addLocalMedia([makeUploadItem(fileName: "a.jpg")], uploader: uploader)
try? await Task.sleep(nanoseconds: 1_000_000)
XCTAssertEqual(viewModel.uploadedMediaList.first?.ossUrl, "https://cdn/a.jpg")
XCTAssertFalse(viewModel.uploadedMediaList.first?.isUploading ?? true)
XCTAssertNil(viewModel.uploadDialogState)
}
func testUploadValidationMessages() async {
let api = MockSampleAPI()
let viewModel = UploadSampleViewModel(
@ -324,6 +337,7 @@ private final class MockSampleAPI: SampleManagementServing {
@MainActor
private final class MockSampleUploader: SampleOSSUploading {
private var results: [Result<String, Error>]
var emitLateProgress = false
init(urls: [String]) {
results = urls.map(Result.success)
@ -340,7 +354,15 @@ private final class MockSampleUploader: SampleOSSUploading {
scenicId: Int,
onProgress: @escaping (Int) -> Void
) async throws -> String {
onProgress(100)
if emitLateProgress {
onProgress(20)
Task { @MainActor in
await Task.yield()
onProgress(100)
}
} else {
onProgress(100)
}
guard !results.isEmpty else { return "https://cdn/default.jpg" }
return try results.removeFirst().get()
}