100% fresh codebase — no legacy code carried over. Built against the Android beacon app as the behavioral spec. Architecture: - App: SwiftUI @main, AppState-driven navigation, Keychain storage - Views: LoginView (OTP + biometric), BusinessListView, ScanView (provisioning hub) - Models: Business, ServicePoint, BeaconConfig, BeaconType, DiscoveredBeacon - Services: APIClient (actor, async/await), BLEManager (CoreBluetooth scanner) - Provisioners: KBeacon, DXSmart (2-step auth + flashing), BlueCharm - Utils: UUIDFormatting, BeaconBanList, BeaconShardPool (64 shards) Matches Android feature parity: - 4-screen flow: Login → Business Select → Scan/Provision - 3 beacon types with correct GATT protocols and timeouts - Namespace allocation via beacon-sharding API - Smart service point naming (Table N auto-increment) - DXSmart special flow (connect → flash → user confirms → write) - Biometric auth, dev/prod build configs, DEV banner overlay Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
18 lines
495 B
Swift
18 lines
495 B
Swift
import Foundation
|
|
|
|
struct Business: Identifiable, Codable, Hashable {
|
|
let id: String
|
|
let name: String
|
|
let imageExtension: String?
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case id = "ID"
|
|
case name = "BusinessName"
|
|
case imageExtension = "ImageExtension"
|
|
}
|
|
|
|
var headerImageURL: URL? {
|
|
guard let ext = imageExtension, !ext.isEmpty else { return nil }
|
|
return URL(string: "\(APIConfig.imageBaseURL)/businesses/\(id)/header.\(ext)")
|
|
}
|
|
}
|