VcfShare.swift 34 lignes · 1319 octets
import CoreTransferable
import Foundation
import UniformTypeIdentifiers

// Port of contact/VcfShare.kt — slugged file name + temp .vcf file, exposed as
// a `Transferable` so `ShareLink` writes the file lazily on share.

enum VcfShare {
    static func fileName(_ card: ContactCard) -> String {
        let base = card.displayName().nilIfBlank ?? "contact"
        let slug = KotlinRegex("[^a-z0-9]+")
            .replace(base.lowercased(), with: "-")
            .trimmingCharacters(in: CharacterSet(charactersIn: "-"))
        return "\(slug.nilIfBlank ?? "contact").vcf"
    }

    static func writeTempFile(_ card: ContactCard) throws -> URL {
        let dir = FileManager.default.temporaryDirectory.appendingPathComponent("vcf", isDirectory: true)
        try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
        let url = dir.appendingPathComponent(fileName(card))
        try VCardSerializer.toVCard3(card).write(to: url, atomically: true, encoding: .utf8)
        return url
    }
}

struct VcfShareFile: Transferable {
    let card: ContactCard

    static var transferRepresentation: some TransferRepresentation {
        FileRepresentation(exportedContentType: .vCard) { file in
            SentTransferredFile(try VcfShare.writeTempFile(file.card))
        }
    }
}