Add preparing label when sending large files from within app

This commit is contained in:
Leon Böttger committed 2025-08-18 11:06:25 +02:00
1 parent 7d6d0f3482
commit c7a3635689
6 files changed
+347 -40

No files matched your search

+28 -9
View File
@@ -112,17 +112,11 @@ struct DeviceListView: View {
sendModel.textToSend = attachments.textToSend
sendModel.selectDevice(device: device)
} label: {
DeviceButton(device: device, isSelected: isSelected, progress: sendModel.progressState, progressValue: sendModel.progressValue)
DeviceButtonLabel(device: device, isSelected: isSelected, progress: sendModel.progressState, progressValue: sendModel.progressValue)
}
}
else {
SendPickerButton {
DeviceButton(device: device, isSelected: isSelected, progress: sendModel.progressState, progressValue: sendModel.progressValue)
} onResult: { urls, text in
sendModel.urls = urls ?? []
sendModel.textToSend = text
sendModel.selectDevice(device: device)
}
DeviceFilePickerButton(device: device, isSelected: isSelected, progressState: sendModel.progressState, progressValue: sendModel.progressValue, sendModel: sendModel)
}
}
.animation(.easeInOut, value: sendModel.progressValue)
@@ -153,7 +147,32 @@ struct DeviceListView: View {
}
struct DeviceButton: View {
struct DeviceFilePickerButton: View {
let device: RemoteDeviceInfo
let isSelected: Bool
let progressState: String?
let progressValue: Double?
let sendModel: SendModel
@State private var isPreparing = false
var body: some View {
SendPickerButton {
DeviceButtonLabel(device: device, isSelected: isPreparing || isSelected, progress: isPreparing ? "Preparing".localized() : progressState, progressValue: progressValue)
} onResult: { urls, text in
isPreparing = false
sendModel.urls = urls ?? []
sendModel.textToSend = text
sendModel.selectDevice(device: device)
} onPrepare: {
isPreparing = true
}
}
}
struct DeviceButtonLabel: View {
let device: RemoteDeviceInfo
let isSelected: Bool
+32 -30
View File
@@ -13,6 +13,7 @@ import UniformTypeIdentifiers
struct SendPickerButton<Label: View>: View {
var label: () -> Label
var onResult: (_ urls: [URL]?, _ text: String?) -> Void
var onPrepare: (() -> Void)? = nil
@State private var showPhotoPicker = false
@State private var selectedPhotoItems: [PhotosPickerItem] = []
@@ -45,6 +46,7 @@ struct SendPickerButton<Label: View>: View {
)
.onChange(of: selectedPhotoItems) { newItems in
guard !newItems.isEmpty else { return }
onPrepare?()
updatedPhotoSelection(content: newItems)
}
// File picker
@@ -83,37 +85,37 @@ struct SendPickerButton<Label: View>: View {
if let dataUrl = try await item.loadTransferable(type: Data.self) {
if let contentType = item.supportedContentTypes.first {
// Step 2: make the URL file name and a get a file extention.
// Step 2: make the URL file name and a get a file extention.
let url = fileManager.temporaryDirectory.appendingPathComponent("\(UUID().uuidString).\(contentType.preferredFilenameExtension ?? "")")
do {
// Step 3: write to temp App file directory and return in completionHandler
try dataUrl.write(to: url)
return url
} catch {
log("Faied to write data to file: \(error)")
throw error
}
}
do {
// Step 3: write to temp App file directory and return in completionHandler
try dataUrl.write(to: url)
return url
} catch {
log("Failed to write data to file: \(error)")
throw error
}
}
// let destination = fileManager.temporaryDirectory.appendingPathComponent(dataUrl.url.lastPathComponent)
//
// // overwrite if file exists
// if fileManager.fileExists(atPath: destination.path) {
// try fileManager.removeItem(at: destination)
// }
//
// log("Copying photo at \(dataUrl.url) to \(destination)")
//
// do {
// try fileManager.copyItem(at: dataUrl.url, to: destination)
// }
// catch {
// log("Failed to copy photo: \(error)")
// throw error
// }
// return destination
// let destination = fileManager.temporaryDirectory.appendingPathComponent(dataUrl.url.lastPathComponent)
//
// // overwrite if file exists
// if fileManager.fileExists(atPath: destination.path) {
// try fileManager.removeItem(at: destination)
// }
//
// log("Copying photo at \(dataUrl.url) to \(destination)")
//
// do {
// try fileManager.copyItem(at: dataUrl.url, to: destination)
// }
// catch {
// log("Failed to copy photo: \(error)")
// throw error
// }
// return destination
}
return nil
}
@@ -135,7 +137,7 @@ struct SendPickerButton<Label: View>: View {
/// File representation
fileprivate struct DataUrl: Transferable {
let url: URL
static var transferRepresentation: some TransferRepresentation {
FileRepresentation(contentType: .data) { data in