USB-Meter / USB Meter / Views / ChargedDevices / ChargedDeviceQRCodeView.swift
Newer Older
60 lines | 1.689kb
Bogdan Timofte authored a month ago
1
//
2
//  ChargedDeviceQRCodeView.swift
3
//  USB Meter
4
//
5
//  Created by Codex on 10/04/2026.
6
//
7

            
8
import CoreImage.CIFilterBuiltins
9
import SwiftUI
10

            
11
struct ChargedDeviceQRCodeView: View {
12
    let qrIdentifier: String
13
    let side: CGFloat
14

            
15
    private let context = CIContext()
16
    private let filter = CIFilter.qrCodeGenerator()
17

            
18
    var body: some View {
19
        Group {
20
            if let image = qrImage {
21
                Image(uiImage: image)
22
                    .interpolation(.none)
23
                    .resizable()
24
                    .scaledToFit()
25
            } else {
26
                RoundedRectangle(cornerRadius: 14)
27
                    .fill(Color.secondary.opacity(0.12))
28
                    .overlay(
29
                        Image(systemName: "qrcode")
30
                            .font(.system(size: side * 0.34, weight: .semibold))
31
                            .foregroundColor(.secondary)
32
                    )
33
            }
34
        }
35
        .frame(width: side, height: side)
36
        .padding(8)
37
        .background(
38
            RoundedRectangle(cornerRadius: 18)
39
                .fill(Color.white.opacity(0.92))
40
        )
41
    }
42

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

            
47
        guard let outputImage = filter.outputImage else {
48
            return nil
49
        }
50

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

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

            
58
        return UIImage(cgImage: cgImage)
59
    }
60
}