wake-ios/wake/View/Examples/MediaUpload.swift
2025-08-21 19:39:30 +08:00

104 lines
3.7 KiB
Swift

import SwiftUI
import os.log
public struct ExampleView: View {
@StateObject private var mediaUploader = MediaUploader(
maxSelection: 5,
onUploadComplete: { _ in },
uploadFunction: { media, progress in
//
for i in 0...10 {
try await Task.sleep(nanoseconds: 100_000_000) // 0.1
progress(Double(i) / 10.0)
}
//
switch media {
case .image(let image):
//
guard let url = URL(string: "https://example.com/images/\(UUID().uuidString).jpg") else {
throw NSError(domain: "com.example.app", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL"])
}
return url
case .video(let url, _):
//
guard let url = URL(string: "https://example.com/videos/\(UUID().uuidString).mp4") else {
throw NSError(domain: "com.example.app", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL"])
}
return url
}
}
)
@State private var uploadedURLs: [URL] = []
@EnvironmentObject private var authState: AuthState
public init() {}
public var body: some View {
NavigationView {
VStack {
//
Button(action: {
mediaUploader.showPicker()
}) {
HStack {
Image(systemName: "plus.circle.fill")
Text("添加媒体")
}
.frame(maxWidth: .infinity)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(8)
}
.padding(.horizontal)
//
MediaUploaderView(mediaUploader: mediaUploader)
.onChange(of: mediaUploader.selectedMedia) { newValue in
if !newValue.isEmpty {
Task {
if let results = await mediaUploader.startUpload() {
let urls = results.map { $0.1 }
uploadedURLs.append(contentsOf: urls)
}
}
}
}
// URL
List(uploadedURLs, id: \.self) { url in
Text(url.absoluteString)
.font(.caption)
.padding(.vertical, 4)
}
.listStyle(PlainListStyle())
}
.navigationTitle("媒体上传示例")
}
}
//
private func uploadMedia(_ media: MediaType, progress: @escaping (Double) -> Void) async throws -> URL {
//
for i in 0...10 {
try await Task.sleep(nanoseconds: 100_000_000) // 0.1
progress(Double(i) / 10.0)
}
//
switch media {
case .image(let image):
//
return URL(string: "https://example.com/images/\(UUID().uuidString).jpg")!
case .video(let url, _):
//
return URL(string: "https://example.com/videos/\(UUID().uuidString).mp4")!
}
}
}
#Preview {
ExampleView()
.environmentObject(AuthState.shared)
}