FieldIdentityPublicMetadataStore.swift (1690B)
1 import Foundation 2 3 struct FieldIdentityPublicMetadata: Codable, Equatable, Sendable { 4 let selectedIdentityId: String 5 let publicKeyHex: String 6 let publicKeyNpub: String 7 let label: String? 8 let updatedAtUnix: UInt64 9 10 init(record: NostrIdentityRecord, updatedAtUnix: UInt64 = UInt64(Date().timeIntervalSince1970)) { 11 self.selectedIdentityId = record.id 12 self.publicKeyHex = record.publicKeyHex 13 self.publicKeyNpub = record.publicKeyNpub 14 self.label = record.label 15 self.updatedAtUnix = updatedAtUnix 16 } 17 } 18 19 struct FieldIdentityPublicMetadataStore { 20 private let userDefaults: UserDefaults 21 private let key: String 22 23 init(servicePrefix: String, userDefaults: UserDefaults = .standard) { 24 self.userDefaults = userDefaults 25 self.key = "field_ios.identity.public_metadata.\(servicePrefix)" 26 } 27 28 static func configured() throws -> FieldIdentityPublicMetadataStore { 29 guard let servicePrefix = BuildConfig.string(.keychainServicePrefix) else { 30 throw FieldSecureIdentityStoreError.missingSecureStoreServicePrefix 31 } 32 return FieldIdentityPublicMetadataStore(servicePrefix: servicePrefix) 33 } 34 35 func load() -> FieldIdentityPublicMetadata? { 36 guard let data = userDefaults.data(forKey: key) else { 37 return nil 38 } 39 return try? JSONDecoder().decode(FieldIdentityPublicMetadata.self, from: data) 40 } 41 42 func save(_ metadata: FieldIdentityPublicMetadata) throws { 43 let data = try JSONEncoder().encode(metadata) 44 userDefaults.set(data, forKey: key) 45 } 46 47 func delete() { 48 userDefaults.removeObject(forKey: key) 49 } 50 }