1 contributor
60 lines | 1.689kb
//
//  ChargedDeviceQRCodeView.swift
//  USB Meter
//
//  Created by Codex on 10/04/2026.
//

import CoreImage.CIFilterBuiltins
import SwiftUI

struct ChargedDeviceQRCodeView: View {
    let qrIdentifier: String
    let side: CGFloat

    private let context = CIContext()
    private let filter = CIFilter.qrCodeGenerator()

    var body: some View {
        Group {
            if let image = qrImage {
                Image(uiImage: image)
                    .interpolation(.none)
                    .resizable()
                    .scaledToFit()
            } else {
                RoundedRectangle(cornerRadius: 14)
                    .fill(Color.secondary.opacity(0.12))
                    .overlay(
                        Image(systemName: "qrcode")
                            .font(.system(size: side * 0.34, weight: .semibold))
                            .foregroundColor(.secondary)
                    )
            }
        }
        .frame(width: side, height: side)
        .padding(8)
        .background(
            RoundedRectangle(cornerRadius: 18)
                .fill(Color.white.opacity(0.92))
        )
    }

    private var qrImage: UIImage? {
        filter.setValue(Data(qrIdentifier.utf8), forKey: "inputMessage")
        filter.correctionLevel = "M"

        guard let outputImage = filter.outputImage else {
            return nil
        }

        let transform = CGAffineTransform(scaleX: 12, y: 12)
        let scaledImage = outputImage.transformed(by: transform)

        guard let cgImage = context.createCGImage(scaledImage, from: scaledImage.extent) else {
            return nil
        }

        return UIImage(cgImage: cgImage)
    }
}