75 lines · 2.6 KB · Swift
RawDownload
import AppKitimport SwiftUI @MainActorenum ShareStatsRenderer {    static func pngData(for payload: ShareStatsPayload) -> Data? {        let size = ShareStatsCardView.size        let view = NSHostingView(rootView: ShareStatsCardView(payload: payload))        view.frame = CGRect(origin: .zero, size: size)        view.layoutSubtreeIfNeeded()         guard let representation = NSBitmapImageRep(            bitmapDataPlanes: nil,            pixelsWide: Int(size.width),            pixelsHigh: Int(size.height),            bitsPerSample: 8,            samplesPerPixel: 4,            hasAlpha: true,            isPlanar: false,            colorSpaceName: .deviceRGB,            bytesPerRow: 0,            bitsPerPixel: 0)        else { return nil }        representation.size = size        guard let context = NSGraphicsContext(bitmapImageRep: representation) else { return nil }        view.displayIgnoringOpacity(view.bounds, in: context)        return representation.representation(using: .png, properties: [:])    }     static func image(for payload: ShareStatsPayload) -> NSImage? {        guard let data = self.pngData(for: payload) else { return nil }        return NSImage(data: data)    }} @MainActorenum ShareStatsExporter {    static func copyImage(_ payload: ShareStatsPayload) -> Bool {        guard let data = ShareStatsRenderer.pngData(for: payload),              let image = NSImage(data: data) else { return false }        let pasteboard = NSPasteboard.general        let item = NSPasteboardItem()        item.setData(data, forType: .png)        if let tiff = image.tiffRepresentation {            item.setData(tiff, forType: .tiff)        }        pasteboard.clearContents()        return pasteboard.writeObjects([item])    }     static func copyText(_ payload: ShareStatsPayload) {        MenuPasteboardCopy.perform(ShareStatsFormatting.text(payload))    }     static func saveImage(_ payload: ShareStatsPayload) -> Bool {        guard let data = ShareStatsRenderer.pngData(for: payload) else { return false }        let panel = NSSavePanel()        panel.allowedContentTypes = [.png]        panel.canCreateDirectories = true        panel.nameFieldStringValue = self.defaultFilename(payload)        let response = panel.runModal()        guard response == .OK, let url = panel.url else { return false }        do {            try data.write(to: url, options: .atomic)            return true        } catch {            NSSound.beep()            return false        }    }     private static func defaultFilename(_ payload: ShareStatsPayload) -> String {        "codexbar-subscriptions-last-\(payload.days)-days.png"    }}