You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
4.8 KiB

import Foundation
import SwiftUI
// MARK: -
public enum BarcodeType: String, CaseIterable {
case ean13 = "EAN-13"
case ean8 = "EAN-8"
case upce = "UPC-E"
case code39 = "Code 39"
case code39Checksum = "Code 39 (Checksum)"
case code39FullASCII = "Code 39 (Full ASCII)"
case code39FullASCIIChecksum = "Code 39 (Full ASCII + Checksum)"
case code93 = "Code 93"
case code93i = "Code 93i"
case code128 = "Code 128"
case itf14 = "ITF-14"
case pdf417 = "PDF417"
var displayName: String {
return self.rawValue
}
var icon: String {
switch self {
case .ean13, .ean8, .upce:
return "barcode"
case .code39, .code39Checksum, .code39FullASCII, .code39FullASCIIChecksum:
return "barcode.viewfinder"
case .code93, .code93i, .code128:
return "barcode.viewfinder"
case .itf14:
return "barcode"
case .pdf417:
return "qrcode.viewfinder"
}
}
}
// MARK: -
public enum QRCodeType: String, CaseIterable {
case wifi = "WiFi"
case mail = "Email"
case url = "URL"
case phone = "Phone"
case sms = "SMS"
case vcard = "vCard"
case mecard = "MeCard"
case text = "Text"
case location = "Location"
case calendar = "Calendar"
case instagram = "Instagram"
case facebook = "Facebook"
case spotify = "Spotify"
case twitter = "Twitter"
case whatsapp = "WhatsApp"
case viber = "Viber"
case snapchat = "Snapchat"
case tiktok = "TikTok"
var displayName: String {
return self.rawValue
}
var icon: String {
switch self {
case .wifi:
return "wifi"
case .mail:
return "envelope"
case .url:
return "link"
case .phone:
return "phone"
case .sms:
return "message"
case .vcard, .mecard:
return "person.crop.rectangle"
case .text:
return "text.quote"
case .location:
return "location"
case .calendar:
return "calendar"
case .instagram:
return "camera"
case .facebook:
return "person.2"
case .spotify:
return "music.note"
case .twitter:
return "bird"
case .whatsapp:
return "message.circle"
case .viber:
return "bubble.left.and.bubble.right"
case .snapchat:
return "camera.viewfinder"
case .tiktok:
return "music.mic"
}
}
}
// MARK: -
public enum DataSource: String, CaseIterable {
case scanned = "scanned"
case created = "created"
var displayName: String {
switch self {
case .scanned:
return "扫描获得"
case .created:
return "手动创建"
}
}
var icon: String {
switch self {
case .scanned:
return "camera.viewfinder"
case .created:
return "plus.circle"
}
}
}
// MARK: -
public enum DataType: String, CaseIterable {
case barcode = "barcode"
case qrcode = "qrcode"
var displayName: String {
switch self {
case .barcode:
return "条形码"
case .qrcode:
return "二维码"
}
}
var icon: String {
switch self {
case .barcode:
return "barcode"
case .qrcode:
return "qrcode"
}
}
}
// MARK: -
@objc(ParsedQRData)
public class ParsedQRData: NSObject, NSSecureCoding {
public static var supportsSecureCoding: Bool = true
public let type: QRCodeType
public let title: String
public let subtitle: String?
public let icon: String
public init(type: QRCodeType, title: String, subtitle: String? = nil, icon: String? = nil) {
self.type = type
self.title = title
self.subtitle = subtitle
self.icon = icon ?? type.icon
}
public required init?(coder: NSCoder) {
let typeString = coder.decodeObject(of: NSString.self, forKey: "type") as String? ?? ""
self.type = QRCodeType(rawValue: typeString) ?? .text
self.title = coder.decodeObject(of: NSString.self, forKey: "title") as String? ?? ""
self.subtitle = coder.decodeObject(of: NSString.self, forKey: "subtitle") as String?
self.icon = coder.decodeObject(of: NSString.self, forKey: "icon") as String? ?? self.type.icon
}
public func encode(with coder: NSCoder) {
coder.encode(type.rawValue, forKey: "type")
coder.encode(title, forKey: "title")
coder.encode(subtitle, forKey: "subtitle")
coder.encode(icon, forKey: "icon")
}
}