diff --git a/StickerSlack.xcodeproj/project.pbxproj b/StickerSlack.xcodeproj/project.pbxproj index 104acc3..7ed474e 100644 --- a/StickerSlack.xcodeproj/project.pbxproj +++ b/StickerSlack.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ A924C3722EA9127200F20781 /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = A924C3712EA9127200F20781 /* Emoji.swift */; }; A924C3732EA9127200F20781 /* Emoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = A924C3712EA9127200F20781 /* Emoji.swift */; }; A924C3782EA9225800F20781 /* Haptics in Frameworks */ = {isa = PBXBuildFile; productRef = A924C3772EA9225800F20781 /* Haptics */; }; + A935437B2EB2A3C800BB80A4 /* FilterCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */; }; + A935437C2EB2A3C800BB80A4 /* FilterCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */; }; A940FE3D2EA232590016870B /* ApiEmoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = A940FE3C2EA232590016870B /* ApiEmoji.swift */; }; A949B1F32EA04E8200215164 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A949B1EF2EA04E8200215164 /* Assets.xcassets */; }; A949B1F42EA04E8200215164 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949B1F02EA04E8200215164 /* ContentView.swift */; }; @@ -58,6 +60,7 @@ A924C3712EA9127200F20781 /* Emoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Emoji.swift; sourceTree = ""; }; A924C3742EA9134C00F20781 /* StickerSlack.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StickerSlack.entitlements; sourceTree = ""; }; A924C3752EA9137A00F20781 /* StickerSlackiMessageExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StickerSlackiMessageExtension.entitlements; sourceTree = ""; }; + A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterCategory.swift; sourceTree = ""; }; A940FE3C2EA232590016870B /* ApiEmoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiEmoji.swift; sourceTree = ""; }; A949B1DF2EA04C0B00215164 /* StickerSlack.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StickerSlack.app; sourceTree = BUILT_PRODUCTS_DIR; }; A949B1EF2EA04E8200215164 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -152,6 +155,7 @@ A940FE3C2EA232590016870B /* ApiEmoji.swift */, A924C3712EA9127200F20781 /* Emoji.swift */, A9D15B892EB1142C00404792 /* EmojiPack.swift */, + A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */, ); path = Emoji; sourceTree = ""; @@ -291,6 +295,7 @@ A949B1F42EA04E8200215164 /* ContentView.swift in Sources */, A949B1F52EA04E8200215164 /* StickerSlackApp.swift in Sources */, A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */, + A935437B2EB2A3C800BB80A4 /* FilterCategory.swift in Sources */, A924C3732EA9127200F20781 /* Emoji.swift in Sources */, A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */, A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */, @@ -305,6 +310,7 @@ A924C3722EA9127200F20781 /* Emoji.swift in Sources */, A9BE06DC2EA657C70033B213 /* ApiEmoji.swift in Sources */, A9BE06DB2EA656B80033B213 /* EmojiHoarder.swift in Sources */, + A935437C2EB2A3C800BB80A4 /* FilterCategory.swift in Sources */, A969D6AF2EA3F1AF00399C05 /* MessagesViewController.swift in Sources */, A9BE06DD2EA657CF0033B213 /* SlackResponse.swift in Sources */, A9D15B8A2EB1142C00404792 /* EmojiPack.swift in Sources */, diff --git a/StickerSlack/Emoji/FilterCategory.swift b/StickerSlack/Emoji/FilterCategory.swift new file mode 100644 index 0000000..2d1d832 --- /dev/null +++ b/StickerSlack/Emoji/FilterCategory.swift @@ -0,0 +1,14 @@ +// +// FilterCategory.swift +// StickerSlack +// +// Created by neon443 on 29/10/2025. +// + +import Foundation + +enum FilterCategory { + case none + case downloaded + case notDownloaded +} diff --git a/StickerSlack/EmojiHoarder.swift b/StickerSlack/EmojiHoarder.swift index 99b88e6..4ab2520 100644 --- a/StickerSlack/EmojiHoarder.swift +++ b/StickerSlack/EmojiHoarder.swift @@ -91,4 +91,22 @@ class EmojiHoarder: ObservableObject { } } } + + func filterEmojis(byCategory category: FilterCategory, searchTerm: String) { + guard category != .none else { + filterEmojis(by: searchTerm) + return + } + Task { + filterEmojis(by: searchTerm) + switch category { + case .none: + fallthrough + case .downloaded: + withAnimation(.interactiveSpring) { filteredEmojis = filteredEmojis.filter { $0.isLocal } } + case .notDownloaded: + withAnimation(.interactiveSpring) { filteredEmojis = filteredEmojis.filter { !$0.isLocal } } + } + } + } } diff --git a/StickerSlack/Views/ContentView.swift b/StickerSlack/Views/ContentView.swift index 42b4aa2..ecf3914 100644 --- a/StickerSlack/Views/ContentView.swift +++ b/StickerSlack/Views/ContentView.swift @@ -21,10 +21,21 @@ struct ContentView: View { .onChange(of: searchTerm) { _ in hoarder.filterEmojis(by: searchTerm) } - .autocorrectionDisabled() .textFieldStyle(.roundedBorder) + Button("none") { + hoarder.filterEmojis(byCategory: .none, searchTerm: searchTerm) + } + + Button("downloaded") { + hoarder.filterEmojis(byCategory: .downloaded, searchTerm: searchTerm) + } + + Button("not downloaded") { + hoarder.filterEmojis(byCategory: .notDownloaded, searchTerm: searchTerm) + } + Text("\(hoarder.filteredEmojis.count) Emoji") ForEach($hoarder.filteredEmojis, id: \.self) { $emoji in diff --git a/StickerSlack/Views/EmojiPreview.swift b/StickerSlack/Views/EmojiPreview.swift index c9a78d1..20827e0 100644 --- a/StickerSlack/Views/EmojiPreview.swift +++ b/StickerSlack/Views/EmojiPreview.swift @@ -51,6 +51,7 @@ struct EmojiPreview: View { } } else { ProgressView() + .frame(maxWidth: .infinity, maxHeight: .infinity) } } }