Peter Steinbergerfeat: add private usage sharinga97a2203 months agoHistory
139 lines · 4.6 KB · Swift
RawDownload
import AppKitimport SwiftUI @MainActorfinal class ShareStatsPresenter {    static let shared = ShareStatsPresenter()     private var windowController: ShareStatsWindowController?     func present(payload: ShareStatsPayload) {        let controller = self.windowController ?? ShareStatsWindowController(payload: payload)        controller.update(payload: payload)        self.windowController = controller        controller.present()    }} @MainActorfinal class ShareStatsWindowController: NSWindowController, NSWindowDelegate {    private(set) var payload: ShareStatsPayload     init(payload: ShareStatsPayload) {        self.payload = payload        let window = NSWindow(            contentRect: NSRect(x: 0, y: 0, width: 820, height: 565),            styleMask: [.titled, .closable, .miniaturizable],            backing: .buffered,            defer: false)        window.title = L("Share AI Usage")        window.isReleasedWhenClosed = false        window.center()        super.init(window: window)        window.delegate = self        self.installContent()    }     @available(*, unavailable)    required init?(coder: NSCoder) {        fatalError("init(coder:) has not been implemented")    }     func update(payload: ShareStatsPayload) {        self.payload = payload        self.installContent()    }     func present() {        NSApp.activate(ignoringOtherApps: true)        self.showWindow(nil)        self.window?.makeKeyAndOrderFront(nil)    }     private func installContent() {        self.window?.contentViewController = NSHostingController(rootView: ShareStatsPreviewView(            payload: self.payload,            copyImage: { [weak self] in                guard let self else { return false }                return ShareStatsExporter.copyImage(self.payload)            },            copyText: { [weak self] in                guard let self else { return }                ShareStatsExporter.copyText(self.payload)            },            saveImage: { [weak self] in                guard let self else { return false }                return ShareStatsExporter.saveImage(self.payload)            }))    }} private struct ShareStatsPreviewView: View {    let payload: ShareStatsPayload    let copyImage: @MainActor () -> Bool    let copyText: @MainActor () -> Void    let saveImage: @MainActor () -> Bool     @State private var statusMessage: String?     var body: some View {        VStack(spacing: 20) {            ShareStatsScaledPreview(payload: self.payload)                .clipShape(RoundedRectangle(cornerRadius: 12))                .overlay {                    RoundedRectangle(cornerRadius: 12)                        .stroke(Color.primary.opacity(0.12), lineWidth: 1)                }                .shadow(color: .black.opacity(0.18), radius: 18, y: 8)             HStack(spacing: 12) {                Button {                    self.statusMessage = self.copyImage() ? L("Image copied") : L("Could not copy image")                } label: {                    Label(L("Copy Image"), systemImage: "photo.on.rectangle")                }                .keyboardShortcut(.defaultAction)                 Button {                    self.copyText()                    self.statusMessage = L("Stats copied")                } label: {                    Label(L("Copy Stats"), systemImage: "doc.on.doc")                }                 Button {                    if self.saveImage() {                        self.statusMessage = L("Image saved")                    }                } label: {                    Label(L("Save..."), systemImage: "square.and.arrow.down")                }                 Spacer()                 Text(self.statusMessage ?? L("Nothing is uploaded. This image is created on your Mac."))                    .font(.footnote)                    .foregroundStyle(.secondary)                    .accessibilityLabel(self                        .statusMessage ?? L("Nothing is uploaded. This image is created on your Mac."))            }        }        .padding(24)        .frame(minWidth: 780, minHeight: 525)    }} private struct ShareStatsScaledPreview: View {    let payload: ShareStatsPayload     var body: some View {        GeometryReader { proxy in            let scale = min(                proxy.size.width / ShareStatsCardView.size.width,                proxy.size.height / ShareStatsCardView.size.height)            ShareStatsCardView(payload: self.payload)                .scaleEffect(scale, anchor: .topLeading)        }        .aspectRatio(ShareStatsCardView.size.width / ShareStatsCardView.size.height, contentMode: .fit)    }}