mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 13:26:17 +00:00
fixed massive performance issue!!!!
emoji.image is a computed property
made it not crash if it couldnt access cachet 😭
added search and a counter
removed emojipreview.image
This commit is contained in:
@@ -20,7 +20,14 @@ struct Emoji: Codable, Identifiable, Hashable {
|
|||||||
return (try? Data(contentsOf: localImageURL)) != nil
|
return (try? Data(contentsOf: localImageURL)) != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var image: UIImage?
|
var image: UIImage? {
|
||||||
|
if let data = try? Data(contentsOf: localImageURL),
|
||||||
|
let img = UIImage(data: data) {
|
||||||
|
return img
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum CodingKeys: String, CodingKey {
|
enum CodingKeys: String, CodingKey {
|
||||||
case id = "id"
|
case id = "id"
|
||||||
@@ -36,13 +43,6 @@ struct Emoji: Codable, Identifiable, Hashable {
|
|||||||
self.name = try container.decode(String.self, forKey: .name)
|
self.name = try container.decode(String.self, forKey: .name)
|
||||||
self.localImageURL = try container.decode(URL.self, forKey: .localImageURL)
|
self.localImageURL = try container.decode(URL.self, forKey: .localImageURL)
|
||||||
self.remoteImageURL = try container.decode(URL.self, forKey: .remoteImageURL)
|
self.remoteImageURL = try container.decode(URL.self, forKey: .remoteImageURL)
|
||||||
|
|
||||||
if let data = try? Data(contentsOf: localImageURL),
|
|
||||||
let img = UIImage(data: data) {
|
|
||||||
self.image = img
|
|
||||||
} else {
|
|
||||||
self.image = nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init(
|
init(
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ class EmojiHoarder: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.emojis = fetched
|
self.emojis = fetched
|
||||||
|
self.filteredEmojis = fetched
|
||||||
}
|
}
|
||||||
|
|
||||||
func storeStickers(_ toStore: [UUID]) {
|
func storeStickers(_ toStore: [UUID]) {
|
||||||
@@ -49,7 +50,7 @@ class EmojiHoarder: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func fetchRemoteDB() -> [Emoji]? {
|
func fetchRemoteDB() -> [Emoji]? {
|
||||||
guard let data = try? Data(contentsOf: endpoint) else { fatalError("cachet unreachable") }
|
guard let data = try? Data(contentsOf: endpoint) else { return nil }
|
||||||
decoder.dateDecodingStrategy = .iso8601
|
decoder.dateDecodingStrategy = .iso8601
|
||||||
let decoded: [SlackResponse] = try! decoder.decode([SlackResponse].self, from: data)
|
let decoded: [SlackResponse] = try! decoder.decode([SlackResponse].self, from: data)
|
||||||
return SlackResponse.toEmojis(from: decoded)
|
return SlackResponse.toEmojis(from: decoded)
|
||||||
|
|||||||
@@ -17,20 +17,18 @@ struct ContentView: View {
|
|||||||
NavigationView {
|
NavigationView {
|
||||||
TabView {
|
TabView {
|
||||||
List {
|
List {
|
||||||
HStack {
|
TextField("", text: $searchTerm) {
|
||||||
TextField("", text: $searchTerm) {
|
hoarder.filterEmojis(by: searchTerm)
|
||||||
hoarder.filterEmojis(by: searchTerm)
|
|
||||||
}
|
|
||||||
|
|
||||||
.autocorrectionDisabled()
|
|
||||||
.textFieldStyle(.roundedBorder)
|
|
||||||
// Button("downloaded", systemImage: "arrow.down.circle.fill") {
|
|
||||||
// <#code#>
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.autocorrectionDisabled()
|
||||||
|
.textFieldStyle(.roundedBorder)
|
||||||
|
|
||||||
|
Text("\(hoarder.filteredEmojis.count) Emoji")
|
||||||
|
|
||||||
ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in
|
ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in
|
||||||
HStack {
|
HStack {
|
||||||
EmojiPreview(emoji: emoji, image: emoji.image)
|
EmojiPreview(emoji: emoji)
|
||||||
.frame(maxWidth: 100)
|
.frame(maxWidth: 100)
|
||||||
Spacer()
|
Spacer()
|
||||||
if emoji.isLocal {
|
if emoji.isLocal {
|
||||||
@@ -48,7 +46,6 @@ struct ContentView: View {
|
|||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.id(emoji.uiID)
|
|
||||||
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
|
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
|
||||||
if emoji.isLocal {
|
if emoji.isLocal {
|
||||||
Button("Remove", systemImage: "trash") {
|
Button("Remove", systemImage: "trash") {
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ struct EmojiPreview: View {
|
|||||||
@State var emoji: Emoji
|
@State var emoji: Emoji
|
||||||
|
|
||||||
@State private var id: UUID = UUID()
|
@State private var id: UUID = UUID()
|
||||||
@State var image: UIImage? = nil
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
@@ -28,7 +27,6 @@ struct EmojiPreview: View {
|
|||||||
.resizable().scaledToFit()
|
.resizable().scaledToFit()
|
||||||
.frame(width: 20, height: 20)
|
.frame(width: 20, height: 20)
|
||||||
.symbolRenderingMode(.hierarchical)
|
.symbolRenderingMode(.hierarchical)
|
||||||
// .foregroundStyle(.gray)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
AsyncImage(url: emoji.remoteImageURL) { phase in
|
AsyncImage(url: emoji.remoteImageURL) { phase in
|
||||||
@@ -36,14 +34,18 @@ struct EmojiPreview: View {
|
|||||||
image
|
image
|
||||||
.resizable().scaledToFit()
|
.resizable().scaledToFit()
|
||||||
} else if phase.error != nil {
|
} else if phase.error != nil {
|
||||||
Image(systemName: "xmark.app.fill")
|
ZStack {
|
||||||
.resizable().scaledToFit()
|
|
||||||
.padding()
|
Image(systemName: "xmark.app.fill")
|
||||||
.symbolRenderingMode(.hierarchical)
|
.resizable().scaledToFit()
|
||||||
.foregroundStyle(.red)
|
.padding()
|
||||||
.onTapGesture {
|
.padding()
|
||||||
id = UUID()
|
.symbolRenderingMode(.hierarchical)
|
||||||
}
|
.foregroundStyle(.red)
|
||||||
|
.onTapGesture {
|
||||||
|
id = UUID()
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ProgressView()
|
ProgressView()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user