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" }}
import AppKit
import SwiftUI
@MainActor
enum 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)
}
}
@MainActor
enum 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"
}
}