// // PaletteStore.swift // EmojiArt // // Created by ching on 2023/2/23. // import SwiftUI struct Palette: Identifiable, Codable, Hashable { var name: String var emojis: String var id: Int fileprivate init(name: String, emojis: String, id: Int) { self.name = name self.emojis = emojis self.id = id } } class PaletteStore: ObservableObject { let name: String @Published var palettes = [Palette]() { didSet { storeInUserDefaults() } } private var userDefaultsKey: String { "PaletteStore:" + name } private func storeInUserDefaults() { UserDefaults.standard.set(try? JSONEncoder().encode(palettes), forKey: userDefaultsKey) } private func restoreFromUserDefaults() { if let jsonData = UserDefaults.standard.data(forKey: userDefaultsKey), let decodedPalettes = try? JSONDecoder().decode(Array.self, from: jsonData) { palettes = decodedPalettes } } init(named name: String) { self.name = name restoreFromUserDefaults() if palettes.isEmpty { print("using built-in palettes") insertPalette(named: "Vehicles", emojis: "πŸš—πŸš•πŸš™πŸšŒπŸšŽπŸŽπŸš“πŸš‘πŸš’πŸšπŸ›»πŸššπŸš›πŸšœπŸ¦―πŸ¦½πŸ¦ΌπŸ›΄πŸš²πŸ›΅πŸπŸ›ΊπŸš¨πŸš”πŸšπŸš˜πŸš–πŸ›žπŸš‘πŸš πŸšŸπŸšƒπŸš‹πŸšžπŸšπŸš„πŸš…πŸšˆπŸš‚πŸš†πŸš‡πŸšŠπŸš‰βœˆοΈπŸ›«πŸ›¬πŸ›©") insertPalette(named: "Sports", emojis: "βš½οΈπŸ€πŸˆβšΎοΈπŸ₯ŽπŸŽΎπŸπŸ‰πŸ₯πŸŽ±πŸͺ€πŸ“πŸΈπŸ’πŸ‘πŸ₯πŸ") } else { print("loaded palettes") } } // Intent func palette(at index: Int) -> Palette { let safeIndex = min(max(index, 0), palettes.count - 1) return palettes[safeIndex] } @discardableResult func removePalette(at index: Int) -> Int { if palettes.count > 1, palettes.indices.contains(index) { palettes.remove(at: index) } return index % palettes.count } func insertPalette(named name: String, emojis: String? = nil, at index: Int = 0) { let unique = (palettes.max(by: { $0.id < $1.id })?.id ?? 0) + 1 let palette = Palette(name: name, emojis: emojis ?? "", id: unique) let safeIndex = min(max(index, 0), palettes.count) palettes.insert(palette, at: safeIndex) } }