mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 13:26:17 +00:00
quicker opening of the imessage app, support ios 17 and below again
This commit is contained in:
@@ -23,6 +23,13 @@
|
|||||||
A949B1F52EA04E8200215164 /* StickerSlackApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949B1F12EA04E8200215164 /* StickerSlackApp.swift */; };
|
A949B1F52EA04E8200215164 /* StickerSlackApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949B1F12EA04E8200215164 /* StickerSlackApp.swift */; };
|
||||||
A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949B1F72EA04F2300215164 /* EmojiHoarder.swift */; };
|
A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949B1F72EA04F2300215164 /* EmojiHoarder.swift */; };
|
||||||
A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949B1FA2EA0518800215164 /* SlackResponse.swift */; };
|
A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949B1FA2EA0518800215164 /* SlackResponse.swift */; };
|
||||||
|
A955B3EB2EC22C0200E1732D /* Haptics in Frameworks */ = {isa = PBXBuildFile; productRef = A9112EAB2EAFFDB0006739E2 /* Haptics */; };
|
||||||
|
A955B3ED2EC22C4A00E1732D /* DownloadedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */; };
|
||||||
|
A955B3EE2EC22C4A00E1732D /* DownloadedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */; };
|
||||||
|
A955B3F12EC22E9700E1732D /* BrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F02EC22E9700E1732D /* BrowseView.swift */; };
|
||||||
|
A955B3F22EC22E9700E1732D /* BrowseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F02EC22E9700E1732D /* BrowseView.swift */; };
|
||||||
|
A955B3F52EC22EE900E1732D /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F42EC22EE900E1732D /* SearchView.swift */; };
|
||||||
|
A955B3F62EC22EE900E1732D /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A955B3F42EC22EE900E1732D /* SearchView.swift */; };
|
||||||
A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */; };
|
A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */; };
|
||||||
A986A6AE2EB658DF00B6E0FA /* Messages.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A969D6932EA3E86500399C05 /* Messages.framework */; };
|
A986A6AE2EB658DF00B6E0FA /* Messages.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A969D6932EA3E86500399C05 /* Messages.framework */; };
|
||||||
A986A6BA2EB658E100B6E0FA /* StickerSlackiMessageApp.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
A986A6BA2EB658E100B6E0FA /* StickerSlackiMessageApp.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
@@ -101,6 +108,9 @@
|
|||||||
A949B1FA2EA0518800215164 /* SlackResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SlackResponse.swift; sourceTree = "<group>"; };
|
A949B1FA2EA0518800215164 /* SlackResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SlackResponse.swift; sourceTree = "<group>"; };
|
||||||
A950E87D2EB57F1100A9F873 /* StickerSlack.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = StickerSlack.xctestplan; sourceTree = "<group>"; };
|
A950E87D2EB57F1100A9F873 /* StickerSlack.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = StickerSlack.xctestplan; sourceTree = "<group>"; };
|
||||||
A950E8802EB6C13700A9F873 /* StickerSlackiMessageApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StickerSlackiMessageApp.entitlements; sourceTree = "<group>"; };
|
A950E8802EB6C13700A9F873 /* StickerSlackiMessageApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StickerSlackiMessageApp.entitlements; sourceTree = "<group>"; };
|
||||||
|
A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadedView.swift; sourceTree = "<group>"; };
|
||||||
|
A955B3F02EC22E9700E1732D /* BrowseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseView.swift; sourceTree = "<group>"; };
|
||||||
|
A955B3F42EC22EE900E1732D /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = "<group>"; };
|
||||||
A969D6932EA3E86500399C05 /* Messages.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Messages.framework; path = Library/Frameworks/Messages.framework; sourceTree = DEVELOPER_DIR; };
|
A969D6932EA3E86500399C05 /* Messages.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Messages.framework; path = Library/Frameworks/Messages.framework; sourceTree = DEVELOPER_DIR; };
|
||||||
A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPreview.swift; sourceTree = "<group>"; };
|
A9773C2E2EA54AF000F3B753 /* EmojiPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPreview.swift; sourceTree = "<group>"; };
|
||||||
A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = StickerSlackiMessageApp.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
A986A6AD2EB658DF00B6E0FA /* StickerSlackiMessageApp.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = StickerSlackiMessageApp.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
@@ -125,6 +135,7 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
A955B3EB2EC22C0200E1732D /* Haptics in Frameworks */,
|
||||||
A924C3782EA9225800F20781 /* Haptics in Frameworks */,
|
A924C3782EA9225800F20781 /* Haptics in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -207,6 +218,9 @@
|
|||||||
A949B1F02EA04E8200215164 /* ContentView.swift */,
|
A949B1F02EA04E8200215164 /* ContentView.swift */,
|
||||||
A9BBC5172EB8FA4500FFE82F /* ViewModifiers.swift */,
|
A9BBC5172EB8FA4500FFE82F /* ViewModifiers.swift */,
|
||||||
A91C098C2EBBD7AB00210C34 /* Emoji */,
|
A91C098C2EBBD7AB00210C34 /* Emoji */,
|
||||||
|
A955B3EC2EC22C4A00E1732D /* DownloadedView.swift */,
|
||||||
|
A955B3F02EC22E9700E1732D /* BrowseView.swift */,
|
||||||
|
A955B3F42EC22EE900E1732D /* SearchView.swift */,
|
||||||
);
|
);
|
||||||
path = SwiftUI;
|
path = SwiftUI;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -450,9 +464,12 @@
|
|||||||
A949B1F52EA04E8200215164 /* StickerSlackApp.swift in Sources */,
|
A949B1F52EA04E8200215164 /* StickerSlackApp.swift in Sources */,
|
||||||
A9104C802EB4022500D160EA /* MSSticker.swift in Sources */,
|
A9104C802EB4022500D160EA /* MSSticker.swift in Sources */,
|
||||||
A9EB72392EB93FDB00658CEB /* EmojiCollectionView.swift in Sources */,
|
A9EB72392EB93FDB00658CEB /* EmojiCollectionView.swift in Sources */,
|
||||||
|
A955B3EE2EC22C4A00E1732D /* DownloadedView.swift in Sources */,
|
||||||
A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */,
|
A949B1FB2EA0518800215164 /* SlackResponse.swift in Sources */,
|
||||||
|
A955B3F52EC22EE900E1732D /* SearchView.swift in Sources */,
|
||||||
A935437B2EB2A3C800BB80A4 /* FilterCategory.swift in Sources */,
|
A935437B2EB2A3C800BB80A4 /* FilterCategory.swift in Sources */,
|
||||||
A9C172DD2EB8C9AC008A7885 /* Trie.swift in Sources */,
|
A9C172DD2EB8C9AC008A7885 /* Trie.swift in Sources */,
|
||||||
|
A955B3F22EC22E9700E1732D /* BrowseView.swift in Sources */,
|
||||||
A9EB724F2EB94A6B00658CEB /* TrieTestingView.swift in Sources */,
|
A9EB724F2EB94A6B00658CEB /* TrieTestingView.swift in Sources */,
|
||||||
A924C3732EA9127200F20781 /* Emoji.swift in Sources */,
|
A924C3732EA9127200F20781 /* Emoji.swift in Sources */,
|
||||||
A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */,
|
A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */,
|
||||||
@@ -484,12 +501,15 @@
|
|||||||
files = (
|
files = (
|
||||||
A9104C7F2EB4022500D160EA /* MSSticker.swift in Sources */,
|
A9104C7F2EB4022500D160EA /* MSSticker.swift in Sources */,
|
||||||
A9B9A8302EB2CD0B004C9245 /* Emoji.swift in Sources */,
|
A9B9A8302EB2CD0B004C9245 /* Emoji.swift in Sources */,
|
||||||
|
A955B3F12EC22E9700E1732D /* BrowseView.swift in Sources */,
|
||||||
A9B9A82F2EB2CCED004C9245 /* EmojiHoarder.swift in Sources */,
|
A9B9A82F2EB2CCED004C9245 /* EmojiHoarder.swift in Sources */,
|
||||||
A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */,
|
A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */,
|
||||||
A9EB724D2EB94A6B00658CEB /* TrieTestingView.swift in Sources */,
|
A9EB724D2EB94A6B00658CEB /* TrieTestingView.swift in Sources */,
|
||||||
A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
||||||
|
A955B3ED2EC22C4A00E1732D /* DownloadedView.swift in Sources */,
|
||||||
A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */,
|
A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */,
|
||||||
A9EB72472EB948C400658CEB /* EmojiRow.swift in Sources */,
|
A9EB72472EB948C400658CEB /* EmojiRow.swift in Sources */,
|
||||||
|
A955B3F62EC22EE900E1732D /* SearchView.swift in Sources */,
|
||||||
A9B9A8322EB2CD29004C9245 /* SlackResponse.swift in Sources */,
|
A9B9A8322EB2CD29004C9245 /* SlackResponse.swift in Sources */,
|
||||||
A9B9A82E2EB2CCBE004C9245 /* StickerSlackTests.swift in Sources */,
|
A9B9A82E2EB2CCBE004C9245 /* StickerSlackTests.swift in Sources */,
|
||||||
A9B9A8312EB2CD14004C9245 /* FilterCategory.swift in Sources */,
|
A9B9A8312EB2CD14004C9245 /* FilterCategory.swift in Sources */,
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ class EmojiHoarder: ObservableObject {
|
|||||||
@Published var downloadedEmojis: Set<String> = []
|
@Published var downloadedEmojis: Set<String> = []
|
||||||
@Published var searchTerm: String = ""
|
@Published var searchTerm: String = ""
|
||||||
|
|
||||||
init(localOnly: Bool = false) {
|
init(localOnly: Bool = false, skipIndex: Bool = false) {
|
||||||
let localDB = loadLocalDB()
|
let localDB = loadLocalDB()
|
||||||
withAnimation { self.emojis = localDB }
|
withAnimation { self.emojis = localDB }
|
||||||
buildTrie()
|
if !skipIndex { buildTrie() }
|
||||||
withAnimation { self.filteredEmojis = [] }
|
withAnimation { self.filteredEmojis = [] }
|
||||||
|
|
||||||
guard !localOnly else { return }
|
guard !localOnly else { return }
|
||||||
@@ -37,7 +37,7 @@ class EmojiHoarder: ObservableObject {
|
|||||||
print("start loading remote db")
|
print("start loading remote db")
|
||||||
await self.loadRemoteDB()
|
await self.loadRemoteDB()
|
||||||
print("end")
|
print("end")
|
||||||
await self.buildTrie()
|
if !skipIndex { await self.buildTrie() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
24
StickerSlack/SwiftUI/BrowseView.swift
Normal file
24
StickerSlack/SwiftUI/BrowseView.swift
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
//
|
||||||
|
// BrowseView.swift
|
||||||
|
// StickerSlack
|
||||||
|
//
|
||||||
|
// Created by neon443 on 10/11/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct BrowseView: View {
|
||||||
|
@ObservedObject var hoarder: EmojiHoarder = .shared
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
List {
|
||||||
|
ForEach(hoarder.emojis, id: \.self) { emoji in
|
||||||
|
EmojiRow(emoji: emoji)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
BrowseView()
|
||||||
|
}
|
||||||
@@ -11,95 +11,73 @@ import Haptics
|
|||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@StateObject var hoarder: EmojiHoarder = .shared
|
@StateObject var hoarder: EmojiHoarder = .shared
|
||||||
|
|
||||||
@State var searchTerm: String = ""
|
|
||||||
|
|
||||||
var minColWidth: CGFloat { 75 }
|
|
||||||
var spacing: CGFloat { 10 }
|
|
||||||
var col: GridItem {
|
|
||||||
GridItem(
|
|
||||||
.flexible(minimum: minColWidth, maximum: 125),
|
|
||||||
spacing: spacing,
|
|
||||||
alignment: .center
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Environment(\.colorScheme) var colorScheme
|
|
||||||
var isDark: Bool { colorScheme == .dark }
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
NavigationSplitView {
|
||||||
|
if #available(iOS 18, *) {
|
||||||
TabView {
|
TabView {
|
||||||
ScrollView {
|
Tab("Downloaded", systemImage: "arrow.down.circle.fill") {
|
||||||
let columns: Int = max(1, Int((UIScreen.main.bounds.width - 2*spacing) / (minColWidth + spacing)))
|
DownloadedView()
|
||||||
let layout = Array(repeating: col, count: columns)
|
|
||||||
LazyVGrid(columns: layout, spacing: 10) {
|
|
||||||
ForEach(hoarder.emojis, id: \.self) { emoji in
|
|
||||||
if hoarder.downloadedEmojis.contains(emoji.name) {
|
|
||||||
ZStack {
|
|
||||||
Rectangle()
|
|
||||||
.foregroundStyle(isDark ? .black : .white)
|
|
||||||
EmojiPreview(emoji: emoji)
|
|
||||||
RoundedRectangle(cornerRadius: 15)
|
|
||||||
.stroke(.gray, lineWidth: 1)
|
|
||||||
}
|
}
|
||||||
.aspectRatio(1, contentMode: .fit)
|
|
||||||
.clipShape(RoundedRectangle(cornerRadius: 15))
|
|
||||||
.contextMenu {
|
|
||||||
Text(emoji.name)
|
|
||||||
Button("Share", systemImage: "square.and.arrow.up") {
|
|
||||||
|
|
||||||
|
Tab("Browse", systemImage: "square.grid.2x2.fill") {
|
||||||
|
BrowseView()
|
||||||
}
|
}
|
||||||
ShareLink("Share", item: emoji.localImageURL, subject: nil, message: nil)
|
|
||||||
ShareLink("Share", item: emoji.remoteImageURL, subject: nil, message: nil)
|
// Tab {
|
||||||
Divider()
|
// List {
|
||||||
Button("Delete", systemImage: "trash.fill", role: .destructive) {
|
// Text("\(searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji")
|
||||||
hoarder.delete(emoji: emoji)
|
//
|
||||||
|
// ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
||||||
|
// if let emoji = hoarder.trie.dict[name] {
|
||||||
|
// EmojiRow(emoji: emoji)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// .onChange(of: searchTerm) { _ in
|
||||||
|
// hoarder.filterEmojis(by: searchTerm)
|
||||||
|
// }
|
||||||
|
// .refreshable {
|
||||||
|
// Task.detached {
|
||||||
|
// await hoarder.refreshDB()
|
||||||
|
// }
|
||||||
|
// searchTerm = ""
|
||||||
|
// }
|
||||||
|
// } label: {
|
||||||
|
// Label("Search", systemImage: "magnifyingglass")
|
||||||
|
// }
|
||||||
|
|
||||||
|
Tab("Tree", systemImage: "tree.fill") {
|
||||||
|
TrieTestingView()
|
||||||
|
}
|
||||||
|
|
||||||
|
Tab(role: .search) {
|
||||||
|
SearchView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
.searchable(text: $hoarder.searchTerm, placement: .automatic)
|
||||||
}
|
} else {
|
||||||
}
|
TabView {
|
||||||
.padding(.horizontal, spacing)
|
DownloadedView()
|
||||||
}
|
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label("Downloaded", systemImage: "arrow.down.circle.fill")
|
Label("Downloaded", systemImage: "arrow.down.circle.fill")
|
||||||
}
|
}
|
||||||
|
BrowseView()
|
||||||
List {
|
|
||||||
ForEach(hoarder.emojis, id: \.self) { emoji in
|
|
||||||
EmojiRow(emoji: emoji)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label("Browse", systemImage: "square.grid.2x2.fill")
|
Label("Browse", systemImage: "square.grid.2x2.fill")
|
||||||
}
|
}
|
||||||
|
TrieTestingView()
|
||||||
List {
|
.tabItem {
|
||||||
Text("\(searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji")
|
Label("Trie", systemImage: "tree.fill")
|
||||||
|
|
||||||
ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
|
||||||
if let emoji = hoarder.trie.dict[name] {
|
|
||||||
EmojiRow(emoji: emoji)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.onChange(of: searchTerm) { _ in
|
|
||||||
hoarder.filterEmojis(by: searchTerm)
|
|
||||||
}
|
|
||||||
.refreshable {
|
|
||||||
Task.detached {
|
|
||||||
await hoarder.refreshDB()
|
|
||||||
}
|
|
||||||
searchTerm = ""
|
|
||||||
}
|
}
|
||||||
|
SearchView()
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label("Search", systemImage: "magnifyingglass")
|
Label("Search", systemImage: "magnifyingglass")
|
||||||
}
|
}
|
||||||
|
|
||||||
TrieTestingView()
|
|
||||||
.tabItem {
|
|
||||||
Label("Tree", systemImage: "tree.fill")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.searchable(text: $searchTerm, placement: .automatic)
|
} detail: {
|
||||||
|
Text("")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
64
StickerSlack/SwiftUI/DownloadedView.swift
Normal file
64
StickerSlack/SwiftUI/DownloadedView.swift
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
//
|
||||||
|
// DownloadedView.swift
|
||||||
|
// StickerSlack
|
||||||
|
//
|
||||||
|
// Created by neon443 on 10/11/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct DownloadedView: View {
|
||||||
|
@ObservedObject var hoarder: EmojiHoarder = .shared
|
||||||
|
|
||||||
|
@Environment(\.colorScheme) var colorScheme
|
||||||
|
var isDark: Bool { colorScheme == .dark }
|
||||||
|
|
||||||
|
var minColWidth: CGFloat { 75 }
|
||||||
|
var spacing: CGFloat { 10 }
|
||||||
|
var col: GridItem {
|
||||||
|
GridItem(
|
||||||
|
.flexible(minimum: minColWidth, maximum: 125),
|
||||||
|
spacing: spacing,
|
||||||
|
alignment: .center
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
ScrollView {
|
||||||
|
let columns: Int = max(1, Int((UIScreen.main.bounds.width - 2*spacing) / (minColWidth + spacing)))
|
||||||
|
let layout = Array(repeating: col, count: columns)
|
||||||
|
LazyVGrid(columns: layout, spacing: 10) {
|
||||||
|
ForEach(hoarder.emojis, id: \.self) { emoji in
|
||||||
|
if hoarder.downloadedEmojis.contains(emoji.name) {
|
||||||
|
ZStack {
|
||||||
|
Rectangle()
|
||||||
|
.foregroundStyle(isDark ? .black : .white)
|
||||||
|
EmojiPreview(emoji: emoji)
|
||||||
|
RoundedRectangle(cornerRadius: 15)
|
||||||
|
.stroke(.gray, lineWidth: 1)
|
||||||
|
}
|
||||||
|
.aspectRatio(1, contentMode: .fit)
|
||||||
|
.clipShape(RoundedRectangle(cornerRadius: 15))
|
||||||
|
.contextMenu {
|
||||||
|
Text(emoji.name)
|
||||||
|
Button("Share", systemImage: "square.and.arrow.up") {
|
||||||
|
|
||||||
|
}
|
||||||
|
ShareLink("Share", item: emoji.localImageURL, subject: nil, message: nil)
|
||||||
|
ShareLink("Share", item: emoji.remoteImageURL, subject: nil, message: nil)
|
||||||
|
Divider()
|
||||||
|
Button("Delete", systemImage: "trash.fill", role: .destructive) {
|
||||||
|
hoarder.delete(emoji: emoji)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.horizontal, spacing)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
DownloadedView()
|
||||||
|
}
|
||||||
33
StickerSlack/SwiftUI/SearchView.swift
Normal file
33
StickerSlack/SwiftUI/SearchView.swift
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
//
|
||||||
|
// SearchView.swift
|
||||||
|
// StickerSlack
|
||||||
|
//
|
||||||
|
// Created by neon443 on 10/11/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct SearchView: View {
|
||||||
|
@ObservedObject var hoarder: EmojiHoarder = .shared
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
NavigationStack {
|
||||||
|
List {
|
||||||
|
Text("\(hoarder.searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji")
|
||||||
|
|
||||||
|
ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
||||||
|
if let emoji = hoarder.trie.dict[name] {
|
||||||
|
EmojiRow(emoji: emoji)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: hoarder.searchTerm) { _ in
|
||||||
|
hoarder.filterEmojis(by: hoarder.searchTerm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
SearchView()
|
||||||
|
}
|
||||||
@@ -73,3 +73,15 @@ struct EmojiCollectionView: UIViewRepresentable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
//class EmojiCell: UITableViewCell {
|
||||||
|
// override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
||||||
|
// let l = UILabel()
|
||||||
|
// l.text = "ifosa"
|
||||||
|
// self.view = l
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// required init?(coder: NSCoder) {
|
||||||
|
// fatalError("init(coder:) has not been implemented")
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import Foundation
|
|||||||
import Messages
|
import Messages
|
||||||
|
|
||||||
class StickerBrowserDataSource: NSObject, MSStickerBrowserViewDataSource {
|
class StickerBrowserDataSource: NSObject, MSStickerBrowserViewDataSource {
|
||||||
var hoarder: EmojiHoarder = EmojiHoarder(localOnly: true)
|
var hoarder: EmojiHoarder = EmojiHoarder(localOnly: true, skipIndex: true)
|
||||||
|
|
||||||
var emojis: [MSSticker] = []
|
var emojis: [MSSticker] = []
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user