mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 13:26:17 +00:00
89 lines
2.3 KiB
Swift
89 lines
2.3 KiB
Swift
//
|
|
// EmojiHoarder.swift
|
|
// StickerSlack
|
|
//
|
|
// Created by neon443 on 15/10/2025.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftUI
|
|
import Combine
|
|
import UniformTypeIdentifiers
|
|
|
|
class EmojiHoarder: ObservableObject {
|
|
static let container = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.neon443.StickerSlack")!.appendingPathComponent("Library", conformingTo: .directory)
|
|
static let localEmojiDB: URL = EmojiHoarder.container.appendingPathComponent("_localEmojiDB.json", conformingTo: .fileURL)
|
|
private let endpoint: URL = URL(string: "https://cachet.dunkirk.sh/emojis")!
|
|
private let encoder = JSONEncoder()
|
|
private let decoder = JSONDecoder()
|
|
|
|
@Published var emojis: [Emoji] = []
|
|
@Published var filteredEmojis: [Emoji] = []
|
|
@Published var prefix: Int = 100
|
|
|
|
init() {
|
|
self.emojis = loadLocalDB()
|
|
self.filteredEmojis = self.emojis
|
|
|
|
Task(priority: .high) {
|
|
if let fetched = await self.fetchRemoteDB() {
|
|
self.emojis = fetched
|
|
self.filteredEmojis = fetched
|
|
}
|
|
}
|
|
}
|
|
|
|
func storeStickers(_ toStore: [UUID]) {
|
|
for stickerId in toStore {
|
|
print(stickerId)
|
|
}
|
|
}
|
|
|
|
func storeDB() {
|
|
try! encoder.encode(emojis).write(to: EmojiHoarder.localEmojiDB)
|
|
}
|
|
|
|
func storeDB(data: Data) {
|
|
try! data.write(to: EmojiHoarder.localEmojiDB)
|
|
}
|
|
|
|
func loadLocalDB() -> [Emoji] {
|
|
if let localEmojiDB = try? Data(contentsOf: EmojiHoarder.localEmojiDB) {
|
|
let decoded = try! decoder.decode([Emoji].self, from: localEmojiDB)
|
|
return decoded
|
|
}
|
|
return []
|
|
}
|
|
|
|
func fetchRemoteDB() async -> [Emoji]? {
|
|
do {
|
|
let (data, _) = try await URLSession.shared.data(from: endpoint)
|
|
decoder.dateDecodingStrategy = .iso8601
|
|
let decoded: [SlackResponse] = try! decoder.decode([SlackResponse].self, from: data)
|
|
storeDB(data: data)
|
|
return SlackResponse.toEmojis(from: decoded)
|
|
} catch {
|
|
print(error.localizedDescription)
|
|
fatalError()
|
|
}
|
|
}
|
|
|
|
func setPrefix(to: Int) {
|
|
filterEmojis(by: "")
|
|
filteredEmojis = Array(filteredEmojis.prefix(prefix))
|
|
}
|
|
|
|
func filterEmojis(by searchTerm: String) {
|
|
guard !searchTerm.isEmpty else {
|
|
self.filteredEmojis = emojis
|
|
return
|
|
}
|
|
Task {
|
|
let filtered = emojis.filter { $0.name.localizedCaseInsensitiveContains(searchTerm) }
|
|
DispatchQueue.main.async {
|
|
self.filteredEmojis = filtered
|
|
}
|
|
}
|
|
}
|
|
}
|