mirror of
https://github.com/neon443/StickerSlack.git
synced 2026-03-11 05:19:13 +00:00
add emojiRow
not using uikit cos i cba with the refreshing and stuff added test emojii static var
This commit is contained in:
@@ -47,6 +47,9 @@
|
|||||||
A9C172DE2EB8C9AC008A7885 /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C172DB2EB8C9AC008A7885 /* Trie.swift */; };
|
A9C172DE2EB8C9AC008A7885 /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C172DB2EB8C9AC008A7885 /* Trie.swift */; };
|
||||||
A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D15B892EB1142C00404792 /* EmojiPack.swift */; };
|
A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D15B892EB1142C00404792 /* EmojiPack.swift */; };
|
||||||
A9EB72392EB93FDB00658CEB /* EmojiCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */; };
|
A9EB72392EB93FDB00658CEB /* EmojiCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */; };
|
||||||
|
A9EB72472EB948C400658CEB /* EmojiRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72462EB948C400658CEB /* EmojiRow.swift */; };
|
||||||
|
A9EB72492EB948C400658CEB /* EmojiRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72462EB948C400658CEB /* EmojiRow.swift */; };
|
||||||
|
A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@@ -110,6 +113,7 @@
|
|||||||
A9D15B892EB1142C00404792 /* EmojiPack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPack.swift; sourceTree = "<group>"; };
|
A9D15B892EB1142C00404792 /* EmojiPack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPack.swift; sourceTree = "<group>"; };
|
||||||
A9E2ECD72EB74CE00038B2D6 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = "<group>"; };
|
A9E2ECD72EB74CE00038B2D6 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = "<group>"; };
|
||||||
A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiCollectionView.swift; sourceTree = "<group>"; };
|
A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiCollectionView.swift; sourceTree = "<group>"; };
|
||||||
|
A9EB72462EB948C400658CEB /* EmojiRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiRow.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@@ -213,6 +217,7 @@
|
|||||||
A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */,
|
A935437A2EB2A3C800BB80A4 /* FilterCategory.swift */,
|
||||||
A9C172DB2EB8C9AC008A7885 /* Trie.swift */,
|
A9C172DB2EB8C9AC008A7885 /* Trie.swift */,
|
||||||
A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */,
|
A9EB72382EB93FDB00658CEB /* EmojiCollectionView.swift */,
|
||||||
|
A9EB72462EB948C400658CEB /* EmojiRow.swift */,
|
||||||
);
|
);
|
||||||
path = Emoji;
|
path = Emoji;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -406,6 +411,7 @@
|
|||||||
A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */,
|
A9D15B8B2EB1142C00404792 /* EmojiPack.swift in Sources */,
|
||||||
A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */,
|
A949B1F82EA04F2300215164 /* EmojiHoarder.swift in Sources */,
|
||||||
A9BBC5182EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
A9BBC5182EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
||||||
|
A9EB72492EB948C400658CEB /* EmojiRow.swift in Sources */,
|
||||||
A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */,
|
A9773C2F2EA54AF000F3B753 /* EmojiPreview.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -432,8 +438,10 @@
|
|||||||
A9104C7F2EB4022500D160EA /* MSSticker.swift in Sources */,
|
A9104C7F2EB4022500D160EA /* MSSticker.swift in Sources */,
|
||||||
A9B9A8302EB2CD0B004C9245 /* Emoji.swift in Sources */,
|
A9B9A8302EB2CD0B004C9245 /* Emoji.swift in Sources */,
|
||||||
A9B9A82F2EB2CCED004C9245 /* EmojiHoarder.swift in Sources */,
|
A9B9A82F2EB2CCED004C9245 /* EmojiHoarder.swift in Sources */,
|
||||||
|
A9EB724A2EB948E000658CEB /* EmojiCollectionView.swift in Sources */,
|
||||||
A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
A9BBC51A2EB8FA4500FFE82F /* ViewModifiers.swift in Sources */,
|
||||||
A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */,
|
A9C172DC2EB8C9AC008A7885 /* Trie.swift in Sources */,
|
||||||
|
A9EB72472EB948C400658CEB /* EmojiRow.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 */,
|
||||||
|
|||||||
@@ -91,4 +91,9 @@ struct Emoji: Codable, Identifiable, Hashable {
|
|||||||
mutating func refresh() {
|
mutating func refresh() {
|
||||||
withAnimation { self.uiID = UUID() }
|
withAnimation { self.uiID = UUID() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static var test: Emoji = Emoji(
|
||||||
|
name: "s?",
|
||||||
|
url: URL(string: "https://neon443.github.io/images/fav.ico")!
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
51
StickerSlack/Emoji/EmojiRow.swift
Normal file
51
StickerSlack/Emoji/EmojiRow.swift
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
//
|
||||||
|
// EmojiRow.swift
|
||||||
|
// StickerSlack
|
||||||
|
//
|
||||||
|
// Created by neon443 on 03/11/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import Haptics
|
||||||
|
|
||||||
|
struct EmojiRow: View {
|
||||||
|
@ObservedObject var hoarder: EmojiHoarder
|
||||||
|
@State var emoji: Emoji
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
HStack {
|
||||||
|
EmojiPreview(
|
||||||
|
hoarder: hoarder,
|
||||||
|
emoji: emoji
|
||||||
|
)
|
||||||
|
.frame(maxWidth: 100, maxHeight: 100)
|
||||||
|
Spacer()
|
||||||
|
if emoji.isLocal {
|
||||||
|
Button("", systemImage: "trash") {
|
||||||
|
emoji.deleteImage()
|
||||||
|
emoji.refresh()
|
||||||
|
Haptic.heavy.trigger()
|
||||||
|
}
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
} else {
|
||||||
|
Button("", systemImage: "arrow.down.circle") {
|
||||||
|
Task.detached {
|
||||||
|
try? await emoji.downloadImage()
|
||||||
|
await MainActor.run {
|
||||||
|
emoji.refresh()
|
||||||
|
Haptic.success.trigger()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
EmojiRow(
|
||||||
|
hoarder: EmojiHoarder(localOnly: true),
|
||||||
|
emoji: Emoji.test
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -11,29 +11,43 @@ import Haptics
|
|||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@StateObject var hoarder: EmojiHoarder = EmojiHoarder()
|
@StateObject var hoarder: EmojiHoarder = EmojiHoarder()
|
||||||
|
|
||||||
|
@State var searchTerm: String = ""
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
TextField("", text: $hoarder.searchTerm)
|
NavigationView {
|
||||||
NavigationLink("trieTester") {
|
List {
|
||||||
TrieTestingView(
|
NavigationLink("trieTester") {
|
||||||
hoarder: hoarder,
|
TrieTestingView(
|
||||||
)
|
hoarder: hoarder,
|
||||||
}
|
)
|
||||||
|
}
|
||||||
Text("\(hoarder.searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji")
|
|
||||||
|
Text("\(searchTerm.isEmpty ? hoarder.emojis.count : hoarder.filteredEmojis.count) Emoji")
|
||||||
EmojiCollectionView(hoarder: hoarder)
|
|
||||||
|
if searchTerm.isEmpty {
|
||||||
|
ForEach($hoarder.emojis, id: \.self) { $emoji in
|
||||||
|
EmojiRow(hoarder: hoarder, emoji: emoji)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ForEach(hoarder.filteredEmojis, id: \.self) { name in
|
||||||
|
if let emoji = hoarder.trie.dict[name] {
|
||||||
|
EmojiRow(hoarder: hoarder, emoji: emoji)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.navigationTitle("StickerSlack")
|
.navigationTitle("StickerSlack")
|
||||||
.onChange(of: hoarder.searchTerm) { _ in
|
.onChange(of: searchTerm) { _ in
|
||||||
hoarder.filterEmojis(by: hoarder.searchTerm)
|
hoarder.filterEmojis(by: searchTerm)
|
||||||
}
|
}
|
||||||
.refreshable {
|
.refreshable {
|
||||||
Task.detached {
|
Task.detached {
|
||||||
await hoarder.refreshDB()
|
await hoarder.refreshDB()
|
||||||
}
|
}
|
||||||
hoarder.searchTerm = ""
|
searchTerm = ""
|
||||||
}
|
}
|
||||||
.searchable(text: $hoarder.searchTerm, placement: .automatic)
|
}
|
||||||
|
.searchable(text: $searchTerm, placement: .automatic)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,10 +60,7 @@ struct EmojiPreview: View {
|
|||||||
#Preview {
|
#Preview {
|
||||||
EmojiPreview(
|
EmojiPreview(
|
||||||
hoarder: EmojiHoarder(localOnly: true),
|
hoarder: EmojiHoarder(localOnly: true),
|
||||||
emoji: Emoji(
|
emoji: Emoji.test
|
||||||
name: "s?",
|
|
||||||
url: URL(string: "https://neon443.github.io/images/fav.ico")!
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user