Add TravelAlbum, ProfileSpace, and wired camera transfer modules.
Introduce travel album entry with Sony PTP tethering pipeline, profile space settings page, home routing updates, Launch Screen storyboard, and related tests/docs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
56
suixinkan/Core/CameraTransfer/CameraTransferTask.swift
Normal file
56
suixinkan/Core/CameraTransfer/CameraTransferTask.swift
Normal file
@ -0,0 +1,56 @@
|
||||
//
|
||||
// CameraTransferTask.swift
|
||||
// suixinkan
|
||||
//
|
||||
// Created by Codex on 2026/6/29.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
/// 相机传输任务状态。
|
||||
enum CameraTransferStatus: String, Codable, Equatable {
|
||||
case pending
|
||||
case downloading
|
||||
case downloaded
|
||||
case uploading
|
||||
case uploaded
|
||||
case failed
|
||||
}
|
||||
|
||||
/// 相机传输任务,表示从相机下载到上传登记的单条记录。
|
||||
struct CameraTransferTask: Identifiable, Equatable, Codable {
|
||||
let id: UUID
|
||||
let assetID: String
|
||||
let filename: String
|
||||
var localPath: String?
|
||||
var remoteURL: String?
|
||||
var status: CameraTransferStatus
|
||||
var progress: Int
|
||||
var errorMessage: String?
|
||||
|
||||
init(
|
||||
id: UUID = UUID(),
|
||||
assetID: String,
|
||||
filename: String,
|
||||
localPath: String? = nil,
|
||||
remoteURL: String? = nil,
|
||||
status: CameraTransferStatus = .pending,
|
||||
progress: Int = 0,
|
||||
errorMessage: String? = nil
|
||||
) {
|
||||
self.id = id
|
||||
self.assetID = assetID
|
||||
self.filename = filename
|
||||
self.localPath = localPath
|
||||
self.remoteURL = remoteURL
|
||||
self.status = status
|
||||
self.progress = progress
|
||||
self.errorMessage = errorMessage
|
||||
}
|
||||
|
||||
/// 本地文件 URL,仅在路径有效时返回。
|
||||
var localURL: URL? {
|
||||
guard let localPath, !localPath.isEmpty else { return nil }
|
||||
return URL(fileURLWithPath: localPath)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user