WebKit Report Service

Converts SVG reports to PDF and PNG formats using WKWebView.

Implementation

Located in Minuta/Sources/Services/WebKitReportService.swift.

Protocol

protocol ReportService: Sendable {
    func generatePDF(
        records: [TimeRecord],
        tags: [Tag],
        options: ReportOptions
    ) async throws -> Data

    func generateSVG(
        records: [TimeRecord],
        tags: [Tag],
        options: ReportOptions
    ) async throws -> Data

    func generatePNG(
        records: [TimeRecord],
        tags: [Tag],
        options: ReportOptions
    ) async throws -> Data
}

Conversion Pipeline

  1. Build ReportData from records
  2. Render SVG via 307-svg-renderer
  3. Load SVG into WKWebView
  4. Convert:
    • PDF: webView.pdf()
    • PNG: webView.takeSnapshot() at 2x resolution

Error Types

enum ReportError: Error {
    case renderingFailed(String)
    case pdfGenerationFailed
    case svgGenerationFailed
    case pngGenerationFailed
    case invalidData(String)
}

Usage

Called from ShareExportSheet when user selects a format:

  • Preview loads in sheet
  • Save/Share uses generated data

Related