mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-07 11:19:58 +02:00
Adds the opt-in foreground check and an explicit Check now, the waiting-to- be-delivered list on the sender side, and honest reporting when a send could not be delivered: a closed app is a delay, not a success nobody received. The setting is off by default and its footer states that checking reveals app-open times to remembered devices, since that is the reason it is a setting at all. Records in the design doc that this shipped as one global toggle rather than the per-contact opt-in originally specified.
67 lines
2.5 KiB
Swift
67 lines
2.5 KiB
Swift
import Foundation
|
|
import VnidropCore
|
|
|
|
/// A file/folder selected for sharing, ported from `PickedShareFile` in
|
|
/// `core/FilePicker.kt`.
|
|
struct PickedShareFile: Equatable, Identifiable, Sendable {
|
|
let value: String
|
|
let displayName: String
|
|
var sizeBytes: UInt64? = nil
|
|
var thumbnailData: Data? = nil
|
|
/// App-owned picker copy that may be deleted after import or abandonment.
|
|
var isTemporaryCopy: Bool = false
|
|
/// When true, `value` is a directory (path or security-scoped folder URL).
|
|
var isDirectory: Bool = false
|
|
/// macOS sandbox: a security-scoped bookmark captured at pick time so access to
|
|
/// `value` can be re-acquired when the core imports the file (the picker's own
|
|
/// scope ends immediately). Nil on iOS (which copies into the container instead).
|
|
var securityScopeBookmark: Data? = nil
|
|
|
|
var id: String { value }
|
|
}
|
|
|
|
/// Receive-destination and share-source platform bridge, ported from
|
|
/// `core/FileSystemService.kt` and its iOS/desktop actuals.
|
|
@MainActor
|
|
protocol FileSystemService {
|
|
var supportsCustomReceiveFolders: Bool { get }
|
|
|
|
func defaultReceiveFolder() -> ReceiveFolder
|
|
func effectiveReceiveFolder(_ configured: ReceiveFolder) -> ReceiveFolder
|
|
func validateReceiveFolder(_ folder: ReceiveFolder) async -> FolderAccessStatus
|
|
func canRevealReceiveFolder(_ folder: ReceiveFolder) -> Bool
|
|
func revealReceiveFolder(_ folder: ReceiveFolder) async -> Result<Void, Error>
|
|
/// Releases only app-owned picker copies; never deletes original user sources.
|
|
func discardPickedFiles(_ files: [PickedShareFile]) async
|
|
/// Imports a picked selection, either as an invitation or straight to a
|
|
/// remembered device. One entry point so the platform's security-scoped
|
|
/// access handling covers both.
|
|
func sharePickedFiles(
|
|
repository: CoreGateway,
|
|
files: [PickedShareFile],
|
|
transferName: String,
|
|
senderName: String,
|
|
destination: ShareDestination
|
|
) async -> Result<ContactSendOutcome, Error>
|
|
}
|
|
|
|
extension FileSystemService {
|
|
var supportsCustomReceiveFolders: Bool { true }
|
|
|
|
func effectiveReceiveFolder(_ configured: ReceiveFolder) -> ReceiveFolder {
|
|
supportsCustomReceiveFolders ? configured : defaultReceiveFolder()
|
|
}
|
|
|
|
func canRevealReceiveFolder(_ folder: ReceiveFolder) -> Bool { false }
|
|
|
|
func revealReceiveFolder(_ folder: ReceiveFolder) async -> Result<Void, Error> {
|
|
.failure(InvitationError.unsupportedOperation)
|
|
}
|
|
|
|
func discardPickedFiles(_ files: [PickedShareFile]) async {}
|
|
}
|
|
|
|
extension ReceiveFolder {
|
|
var isFileSystemPath: Bool { kind == .fileSystemPath }
|
|
}
|