From a9d9f9d4603545bb66daf5d4e8c7ceaf9dc13e6a Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sat, 13 May 2023 16:04:47 +0100 Subject: [PATCH 01/13] Sticker Packs --- Swiftcord.xcodeproj/project.pbxproj | 22 +- .../Views/Message/BasicStickerView.swift | 115 ++++++++++ .../DefaultMessageView.swift | 2 +- .../Views/Message/MessageStickerView.swift | 203 ++++++++++++++++++ Swiftcord/Views/Message/StickerView.swift | 177 --------------- 5 files changed, 332 insertions(+), 187 deletions(-) create mode 100644 Swiftcord/Views/Message/BasicStickerView.swift create mode 100644 Swiftcord/Views/Message/MessageStickerView.swift delete mode 100644 Swiftcord/Views/Message/StickerView.swift diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index 9b7ee8a6..336bcf10 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 03A188BE2A0FDB7500D5F4BC /* BasicStickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A188BD2A0FDB7500D5F4BC /* BasicStickerView.swift */; }; + 03A188C02A0FDB8A00D5F4BC /* MessageStickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A188BF2A0FDB8A00D5F4BC /* MessageStickerView.swift */; }; 13A79FC0298C41C800D19AAB /* View+KeyDown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A79FBF298C41C800D19AAB /* View+KeyDown.swift */; }; 13A79FC1298C41C800D19AAB /* View+KeyDown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A79FBF298C41C800D19AAB /* View+KeyDown.swift */; }; 36367146283C1B6500A5CBE6 /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 36367144283C19E500A5CBE6 /* AVKit.framework */; }; @@ -78,7 +80,6 @@ 36429981286801C900483D0A /* AppSettingsAccessibilityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAAA22AE284DC0D700C1975E /* AppSettingsAccessibilityView.swift */; }; 36429982286801C900483D0A /* LottieLoopMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF3127C676FE00A9ED72 /* LottieLoopMode.swift */; }; 36429983286801C900483D0A /* Logger+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA28027E28095E3000B14E5C /* Logger+.swift */; }; - 36429984286801C900483D0A /* StickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF3327C6861800A9ED72 /* StickerView.swift */; }; 36429985286801C900483D0A /* ProfileAccentMask.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA54D573284497E400B11857 /* ProfileAccentMask.swift */; }; 36429986286801C900483D0A /* AudioCenterManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAAFB5C6282AB56B00807B54 /* AudioCenterManager.swift */; }; 36429987286801C900483D0A /* LottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF2927C65D2C00A9ED72 /* LottieView.swift */; }; @@ -135,7 +136,6 @@ DA32EF2A27C65D2C00A9ED72 /* LottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF2927C65D2C00A9ED72 /* LottieView.swift */; }; DA32EF3027C676B300A9ED72 /* WrapperLottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF2F27C676B300A9ED72 /* WrapperLottieView.swift */; }; DA32EF3227C676FE00A9ED72 /* LottieLoopMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF3127C676FE00A9ED72 /* LottieLoopMode.swift */; }; - DA32EF3427C6861800A9ED72 /* StickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF3327C6861800A9ED72 /* StickerView.swift */; }; DA32EF3927C77E3300A9ED72 /* AttachmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF3827C77E3300A9ED72 /* AttachmentView.swift */; }; DA32EF3F27C7C1D000A9ED72 /* MessageInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF3E27C7C1D000A9ED72 /* MessageInputView.swift */; }; DA32EF4827C8ABFF00A9ED72 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32EF4727C8ABFF00A9ED72 /* Date+.swift */; }; @@ -263,6 +263,9 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 03A188B82A0F864500D5F4BC /* DiscordKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = DiscordKit; path = ../DiscordKit; sourceTree = ""; }; + 03A188BD2A0FDB7500D5F4BC /* BasicStickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicStickerView.swift; sourceTree = ""; }; + 03A188BF2A0FDB8A00D5F4BC /* MessageStickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageStickerView.swift; sourceTree = ""; }; 13A79FBF298C41C800D19AAB /* View+KeyDown.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+KeyDown.swift"; sourceTree = ""; }; 36004E1C283D63E500F0BA73 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; 36367144283C19E500A5CBE6 /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; }; @@ -302,7 +305,6 @@ DA32EF2927C65D2C00A9ED72 /* LottieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieView.swift; sourceTree = ""; }; DA32EF2F27C676B300A9ED72 /* WrapperLottieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WrapperLottieView.swift; sourceTree = ""; }; DA32EF3127C676FE00A9ED72 /* LottieLoopMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieLoopMode.swift; sourceTree = ""; }; - DA32EF3327C6861800A9ED72 /* StickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickerView.swift; sourceTree = ""; }; DA32EF3827C77E3300A9ED72 /* AttachmentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentView.swift; sourceTree = ""; usesTabs = 0; }; DA32EF3E27C7C1D000A9ED72 /* MessageInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageInputView.swift; sourceTree = ""; }; DA32EF4727C8ABFF00A9ED72 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; @@ -475,8 +477,9 @@ DAB1E47B28A4C1D300645FCD /* MessageRenderViews */, DA32EF2327C6249000A9ED72 /* MessagesView.swift */, DA32EF3E27C7C1D000A9ED72 /* MessageInputView.swift */, + 03A188BD2A0FDB7500D5F4BC /* BasicStickerView.swift */, + 03A188BF2A0FDB8A00D5F4BC /* MessageStickerView.swift */, DAB1E48B28A510DC00645FCD /* MessageInputReplyView.swift */, - DA32EF3327C6861800A9ED72 /* StickerView.swift */, DA2384BE27CCBB26009E15E0 /* EmbedView.swift */, DAAFB5C2282AA5C700807B54 /* MessageInfoBarView.swift */, ); @@ -532,6 +535,7 @@ DA4A887B27C0AF3000720909 = { isa = PBXGroup; children = ( + 03A188B82A0F864500D5F4BC /* DiscordKit */, 36004E1C283D63E500F0BA73 /* .swiftlint.yml */, DA4A888627C0AF3000720909 /* Swiftcord */, DA4A891727C4B0DF00720909 /* README.md */, @@ -1175,7 +1179,6 @@ 36429982286801C900483D0A /* LottieLoopMode.swift in Sources */, 36429983286801C900483D0A /* Logger+.swift in Sources */, DAFD4714289A202F0075D71B /* AttachmentProgress.swift in Sources */, - 36429984286801C900483D0A /* StickerView.swift in Sources */, 36429985286801C900483D0A /* ProfileAccentMask.swift in Sources */, 36429986286801C900483D0A /* AudioCenterManager.swift in Sources */, 36429987286801C900483D0A /* LottieView.swift in Sources */, @@ -1237,8 +1240,10 @@ DA4A888A27C0AF3000720909 /* ContentView.swift in Sources */, DA57F44628065209001DC46E /* ChannelButton.swift in Sources */, DA32EF6627CB772300A9ED72 /* CacheModel.xcdatamodeld in Sources */, + 03A188C02A0FDB8A00D5F4BC /* MessageStickerView.swift in Sources */, E7AF1C33282FB02A001F78DF /* UserSettingsAccount.swift in Sources */, DA520AE227D76BEB009FD740 /* Bool+.swift in Sources */, + 03A188BE2A0FDB7500D5F4BC /* BasicStickerView.swift in Sources */, DA2802792808337B00B14E5C /* AppDelegate.swift in Sources */, DA4A891427C49B1100720909 /* ServerButton.swift in Sources */, DAC437792900F3FD00D3A894 /* Snowflake+.swift in Sources */, @@ -1296,7 +1301,6 @@ DA32EF3227C676FE00A9ED72 /* LottieLoopMode.swift in Sources */, DAFD4710289A1FEB0075D71B /* AttachmentAudio.swift in Sources */, DA28027F28095E3100B14E5C /* Logger+.swift in Sources */, - DA32EF3427C6861800A9ED72 /* StickerView.swift in Sources */, DA54D574284497E400B11857 /* ProfileAccentMask.swift in Sources */, DAAFB5C7282AB56B00807B54 /* AudioCenterManager.swift in Sources */, DA32EF2A27C65D2C00A9ED72 /* LottieView.swift in Sources */, @@ -1407,7 +1411,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = Q382QLKDG3; + DEVELOPMENT_TEAM = V4747CQLU2; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1665,7 +1669,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = Q382QLKDG3; + DEVELOPMENT_TEAM = V4747CQLU2; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1699,7 +1703,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = Q382QLKDG3; + DEVELOPMENT_TEAM = V4747CQLU2; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; diff --git a/Swiftcord/Views/Message/BasicStickerView.swift b/Swiftcord/Views/Message/BasicStickerView.swift new file mode 100644 index 00000000..2bfc19d1 --- /dev/null +++ b/Swiftcord/Views/Message/BasicStickerView.swift @@ -0,0 +1,115 @@ +// +// BasicStickerView.swift +// Swiftcord +// +// Created by Vincent Kwok on 23/2/22. +// +import SwiftUI +import Lottie +import CachedAsyncImage +import DiscordKitCore +import DiscordKit + +struct StickerLoadingView: View { + let size: Double + var body: some View { + RoundedRectangle(cornerRadius: 12) + .fill(.gray.opacity(Double.random(in: 0.15...0.3))) + .frame(width: size, height: size) + } +} + +struct StickerErrorView: View { + let size: Double + var body: some View { + Image(systemName: "square.slash") + .font(.system(size: size - 10)) + .opacity(0.5) + .frame(width: size, height: size) + } +} + +enum StickerPlayCondition { + case always + case onHover + case useDefault +} + +// Most basic sticker player +struct StickerItemView: View { + let sticker: StickerItem + let size: Double // Width and height of sticker + let play: StickerPlayCondition + @State private var error = false + @State private var animation: Lottie.LottieAnimation? + @State private var hovered = false + + @AppStorage("stickerAlwaysAnim") private var alwaysAnimStickers = true + + private func playAnimation(value: Bool) { + // Without this check, the sticker animation restarts if it's hovered + if (play == .useDefault && !alwaysAnimStickers) || play == .onHover { + hovered = value + } + } + + var body: some View { + if error { + StickerErrorView(size: size) + } else { + switch sticker.format_type { + case .png: + // Literally a walk in the park compared to lottie + AsyncImage(url: URL(string: "\(DiscordKitConfig.default.cdnURL)stickers/\(sticker.id).png")!) { phase in + switch phase { + case .empty: StickerLoadingView(size: size) + case .success(let image): image.resizable().scaledToFill() + case .failure: StickerErrorView(size: size) + default: StickerErrorView(size: size) + } + } + .frame(width: size, height: size) + .clipShape(RoundedRectangle(cornerRadius: 7)) + case .lottie: + if animation == nil { + StickerLoadingView(size: size).onAppear { + Lottie.LottieAnimation.loadedFrom( + url: URL(string: "\(DiscordKitConfig.default.cdnURL)stickers/\(sticker.id).json")!, + closure: { anim in + guard let anim = anim else { + error = true + return + } + animation = anim + }, + animationCache: Lottie.DefaultAnimationCache.sharedCache + ) + }.transition(.customOpacity) + } else { + LottieView( + animation: animation!, + play: .constant(play == .always || (play == .useDefault && alwaysAnimStickers) || hovered), + width: size, + height: size + ) + .lottieLoopMode(.loop) + .frame(width: size, height: size) + .transition(.customOpacity) + .onHover(perform: playAnimation) + } + default: + // Well it doesn't animate for some reason + CachedAsyncImage(url: URL(string: "\(DiscordKitConfig.default.cdnURL)stickers/\(sticker.id).png?passthrough=true")!) { phase in + switch phase { + case .empty: StickerLoadingView(size: size) + case .success(let image): image.resizable().scaledToFill() + case .failure: StickerErrorView(size: size) + default: StickerErrorView(size: size) + } + } + .frame(width: size, height: size) + .clipShape(RoundedRectangle(cornerRadius: 7)) + } + } + } +} diff --git a/Swiftcord/Views/Message/MessageRenderViews/DefaultMessageView.swift b/Swiftcord/Views/Message/MessageRenderViews/DefaultMessageView.swift index 49ecb8e5..b84d63ec 100644 --- a/Swiftcord/Views/Message/MessageRenderViews/DefaultMessageView.swift +++ b/Swiftcord/Views/Message/MessageRenderViews/DefaultMessageView.swift @@ -43,7 +43,7 @@ struct DefaultMessageView: View { } if let stickerItems = message.sticker_items { ForEach(stickerItems) { sticker in - StickerView(sticker: sticker) + MessageStickerView(sticker: sticker) } } ForEach(message.attachments) { attachment in diff --git a/Swiftcord/Views/Message/MessageStickerView.swift b/Swiftcord/Views/Message/MessageStickerView.swift new file mode 100644 index 00000000..4098fa1f --- /dev/null +++ b/Swiftcord/Views/Message/MessageStickerView.swift @@ -0,0 +1,203 @@ +// +// MessageStickerView.swift +// Swiftcord +// +// Created by Vincent Kwok on 23/2/22. +// + +import SwiftUI +import Lottie +import DiscordKitCore +import DiscordKit +import CachedAsyncImage + + + + +struct StickerPackView: View { + let pack: StickerPack + @Binding var packPresenting: Bool + @State private var stickerHovered: Int? = nil + @State private var listHovered: Bool = false + + var body: some View { + VStack { + if pack.banner_asset_id != nil { + VStack { + CachedAsyncImage(url: pack.banner_asset_id?.stickerPackBannerURL(with: .webp, size: 1024)) { image in + image.resizable().scaledToFill() + } placeholder: { ProgressView().progressViewStyle(.circular)} + }.frame(height: 100) + } + + VStack { + HStack(spacing: 15) { + // Back button + Button { + packPresenting = false + } label: {Image(systemName: "arrow.left")} + .controlSize(.large) + + Text(pack.name).font(.title).fontWeight(.bold) + Spacer() + Text("􀐅 x\(pack.stickers.count)") + .font(.system(size: 16)) + .opacity(0.7) + } + Divider() + Text(pack.description) + .fixedSize(horizontal: false, vertical: true) + .frame(maxWidth: .infinity, alignment: .leading) + + List { + ForEach(0.. some View { + configuration.label + .background(Color.blue) + .cornerRadius(10.0) + .padding() + .contentShape(Rectangle()) + } +} + +struct MessageStickerView: View { + let sticker: StickerItem + @State private var infoShow = false + @State private var error = false + @State private var fullSticker: Sticker? + @State public var packPresenting = false + @State private var fullStickerPack: StickerPack? + + private func openPopoverEvt() { + AnalyticsWrapper.event(type: .openPopout, properties: [ + "type": "Sticker Popout", + "sticker_pack_id": fullSticker?.pack_id ?? "", + "sticker_id": fullSticker?.id ?? "" + ]) + } + + private func loadStickerPack() async -> StickerPack? { + guard let stickerPacks: [StickerPack] = try? await restAPI.listNitroStickerPacks() else {return nil} + for pack in stickerPacks { + if pack.id == fullSticker!.pack_id { + return pack + } + } + return nil + } + + var body: some View { + Button { + if fullSticker == nil { + Task { + fullSticker = try await restAPI.getSticker(sticker.id) + openPopoverEvt() + } + } else { + openPopoverEvt() + } + infoShow.toggle() + packPresenting = false + + } label: { + StickerItemView(sticker: sticker, size: 160, play: .useDefault) + .frame(width: 160, height: 160) + } + .buttonStyle(.borderless) + .popover(isPresented: $infoShow, arrowEdge: .trailing) { + if packPresenting { + if let fullStickerPack = fullStickerPack { + StickerPackView(pack: fullStickerPack, packPresenting: $packPresenting) + } + } else { + VStack(alignment: .leading, spacing: 14) { + if let fullSticker = fullSticker { + StickerItemView(sticker: sticker, size: 240, play: .always) + Divider() + Text(fullSticker.name).font(.title2).fontWeight(.bold) + if let description = fullSticker.description { + Text(description).padding(.top, -8) + } + if sticker.format_type == .aPNG { + Text("Sorry, aPNG stickers can't be played (yet)").font(.footnote) + } + + if fullSticker.pack_id != nil { + Button { + Task { + fullStickerPack = await loadStickerPack() + packPresenting = true + } + } label: { + Label("View Sticker Pack", systemImage: "square.on.square") + .frame(maxWidth: .infinity) + + } + .buttonStyle(FlatButtonStyle()) + .controlSize(.small) + + } + } else { + Text("Loading sticker...").font(.headline) + ProgressView() + .progressViewStyle(.linear) + .frame(width: 240) + .tint(.blue) + } + } + .padding(14) + .frame(width: 268) + } + } + } +} + +struct StickerView_Previews: PreviewProvider { + static var previews: some View { + // StickerView() + EmptyView() + } +} diff --git a/Swiftcord/Views/Message/StickerView.swift b/Swiftcord/Views/Message/StickerView.swift deleted file mode 100644 index 57a950df..00000000 --- a/Swiftcord/Views/Message/StickerView.swift +++ /dev/null @@ -1,177 +0,0 @@ -// -// StickerView.swift -// Swiftcord -// -// Created by Vincent Kwok on 23/2/22. -// - -import SwiftUI -import Lottie -import CachedAsyncImage -import DiscordKitCore - -struct StickerLoadingView: View { - let size: Double - var body: some View { - RoundedRectangle(cornerRadius: 12) - .fill(.gray.opacity(Double.random(in: 0.15...0.3))) - .frame(width: size, height: size) - } -} - -struct StickerErrorView: View { - let size: Double - var body: some View { - Image(systemName: "square.slash") - .font(.system(size: size - 10)) - .opacity(0.5) - .frame(width: size, height: size) - } -} - -// Most basic sticker player -struct StickerItemView: View { - let sticker: StickerItem - let size: Double // Width and height of sticker - @State private var error = false - @State private var animation: Lottie.LottieAnimation? - @Binding var play: Bool - - var body: some View { - if error { - StickerErrorView(size: size) - } else { - switch sticker.format_type { - case .png: - // Literally a walk in the park compared to lottie - AsyncImage(url: URL(string: "\(DiscordKitConfig.default.cdnURL)stickers/\(sticker.id).png")!) { phase in - switch phase { - case .empty: StickerLoadingView(size: size) - case .success(let image): image.resizable().scaledToFill() - case .failure: StickerErrorView(size: size) - default: StickerErrorView(size: size) - } - } - .frame(width: size, height: size) - .clipShape(RoundedRectangle(cornerRadius: 7)) - case .lottie: - if animation == nil { - StickerLoadingView(size: size).onAppear { - Lottie.LottieAnimation.loadedFrom( - url: URL(string: "\(DiscordKitConfig.default.cdnURL)stickers/\(sticker.id).json")!, - closure: { anim in - guard let anim = anim else { - error = true - return - } - animation = anim - }, - animationCache: Lottie.DefaultAnimationCache.sharedCache - ) - }.transition(.customOpacity) - } else { - LottieView( - animation: animation!, - play: $play, - width: size, - height: size - ) - .lottieLoopMode(.loop) - .frame(width: size, height: size) - .transition(.customOpacity) - } - default: - // Well it doesn't animate for some reason - CachedAsyncImage(url: URL(string: "\(DiscordKitConfig.default.cdnURL)stickers/\(sticker.id).png?passthrough=true")!) { phase in - switch phase { - case .empty: StickerLoadingView(size: size) - case .success(let image): image.resizable().scaledToFill() - case .failure: StickerErrorView(size: size) - default: StickerErrorView(size: size) - } - } - .frame(width: size, height: size) - .clipShape(RoundedRectangle(cornerRadius: 7)) - } - } - } -} - -struct StickerView: View { - let sticker: StickerItem - @State private var hovered = false - @State private var infoShow = false - @State private var error = false - @State private var fullSticker: Sticker? - @State private var packPresenting = false - - @AppStorage("stickerAlwaysAnim") private var alwaysAnimStickers = true - - private func openPopoverEvt() { - AnalyticsWrapper.event(type: .openPopout, properties: [ - "type": "Sticker Popout", - "sticker_pack_id": fullSticker?.pack_id ?? "", - "sticker_id": fullSticker?.id ?? "" - ]) - } - - var body: some View { - StickerItemView(sticker: sticker, size: 160, play: .constant(alwaysAnimStickers || hovered)) - .popover(isPresented: $infoShow, arrowEdge: .trailing) { - VStack(alignment: .leading, spacing: 14) { - if let fullSticker = fullSticker { - StickerItemView(sticker: sticker, size: 240, play: .constant(true)) - Divider() - Text(fullSticker.name).font(.title2).fontWeight(.bold) - if let description = fullSticker.description { - Text(description).padding(.top, -8) - } - if sticker.format_type == .aPNG { - Text("Sorry, aPNG stickers can't be played (yet)").font(.footnote) - } - - if fullSticker.pack_id != nil { - Button { packPresenting = true } label: { - Label("View Sticker Pack", systemImage: "square.on.square") - .frame(maxWidth: .infinity) - } - .buttonStyle(FlatButtonStyle()) - .controlSize(.small) - .sheet(isPresented: $packPresenting) { - VStack { - Text("Sticker Pack").font(.title) - Text("Unimplemented").font(.footnote) - Button { packPresenting = false } label: { - Text("Close") - } - }.padding(14) - } - } - } else { - Text("Loading sticker...").font(.headline) - ProgressView() - .progressViewStyle(.linear) - .frame(width: 240) - .tint(.blue) - } - }.padding(14) - } - .onHover { hovered = $0 } - .onTapGesture { - if fullSticker == nil { Task { - fullSticker = try? await restAPI.getSticker(sticker.id) - openPopoverEvt() - }} else { - openPopoverEvt() - } - infoShow.toggle() - } - } -} - -struct StickerView_Previews: PreviewProvider { - static var previews: some View { - // StickerView() - EmptyView() - } -} From 1f806c186b6968ae5922d8f1ba51e7ed5756f257 Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 09:13:32 +0100 Subject: [PATCH 02/13] Update Swiftcord.xcodeproj/project.pbxproj Co-authored-by: CryptoAlgo <64193267+cryptoAlgorithm@users.noreply.github.com> --- Swiftcord.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index 336bcf10..df0cb0e1 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -1411,7 +1411,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = V4747CQLU2; + DEVELOPMENT_TEAM = Q382QLKDG3; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; From 008663922869b98d5c78486985948b052671f74f Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 09:13:39 +0100 Subject: [PATCH 03/13] Update Swiftcord.xcodeproj/project.pbxproj Co-authored-by: CryptoAlgo <64193267+cryptoAlgorithm@users.noreply.github.com> --- Swiftcord.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index df0cb0e1..5cbde31a 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -1669,7 +1669,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = V4747CQLU2; + DEVELOPMENT_TEAM = Q382QLKDG3; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; From cd8f0822b2f125c667c15341a55c3ce9bba1bbc1 Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 09:13:48 +0100 Subject: [PATCH 04/13] Update Swiftcord.xcodeproj/project.pbxproj Co-authored-by: CryptoAlgo <64193267+cryptoAlgorithm@users.noreply.github.com> --- Swiftcord.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index 5cbde31a..ccacb504 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -1703,7 +1703,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = V4747CQLU2; + DEVELOPMENT_TEAM = Q382QLKDG3; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; From c1723aca314af5f737e13e7ae26530477a941955 Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 09:13:57 +0100 Subject: [PATCH 05/13] Update Swiftcord.xcodeproj/project.pbxproj Co-authored-by: CryptoAlgo <64193267+cryptoAlgorithm@users.noreply.github.com> --- Swiftcord.xcodeproj/project.pbxproj | 1 - 1 file changed, 1 deletion(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index ccacb504..65a5e5ce 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -535,7 +535,6 @@ DA4A887B27C0AF3000720909 = { isa = PBXGroup; children = ( - 03A188B82A0F864500D5F4BC /* DiscordKit */, 36004E1C283D63E500F0BA73 /* .swiftlint.yml */, DA4A888627C0AF3000720909 /* Swiftcord */, DA4A891727C4B0DF00720909 /* README.md */, From 159f1c9f27582a3787488878b972a18d975ce60a Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 09:14:46 +0100 Subject: [PATCH 06/13] Update Swiftcord/Views/Message/MessageStickerView.swift Co-authored-by: CryptoAlgo <64193267+cryptoAlgorithm@users.noreply.github.com> --- Swiftcord/Views/Message/MessageStickerView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Swiftcord/Views/Message/MessageStickerView.swift b/Swiftcord/Views/Message/MessageStickerView.swift index 4098fa1f..c8d24e9f 100644 --- a/Swiftcord/Views/Message/MessageStickerView.swift +++ b/Swiftcord/Views/Message/MessageStickerView.swift @@ -141,7 +141,6 @@ struct MessageStickerView: View { } infoShow.toggle() packPresenting = false - } label: { StickerItemView(sticker: sticker, size: 160, play: .useDefault) .frame(width: 160, height: 160) From 584d78985791b2e5ed871855eaa6b6817f73b489 Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 14:20:09 +0100 Subject: [PATCH 07/13] Linting --- .../Views/Message/BasicStickerView.swift | 2 - .../Views/Message/MessageStickerView.swift | 51 +++++++------------ 2 files changed, 17 insertions(+), 36 deletions(-) diff --git a/Swiftcord/Views/Message/BasicStickerView.swift b/Swiftcord/Views/Message/BasicStickerView.swift index 2bfc19d1..39804e25 100644 --- a/Swiftcord/Views/Message/BasicStickerView.swift +++ b/Swiftcord/Views/Message/BasicStickerView.swift @@ -43,9 +43,7 @@ struct StickerItemView: View { @State private var error = false @State private var animation: Lottie.LottieAnimation? @State private var hovered = false - @AppStorage("stickerAlwaysAnim") private var alwaysAnimStickers = true - private func playAnimation(value: Bool) { // Without this check, the sticker animation restarts if it's hovered if (play == .useDefault && !alwaysAnimStickers) || play == .onHover { diff --git a/Swiftcord/Views/Message/MessageStickerView.swift b/Swiftcord/Views/Message/MessageStickerView.swift index 4098fa1f..136678eb 100644 --- a/Swiftcord/Views/Message/MessageStickerView.swift +++ b/Swiftcord/Views/Message/MessageStickerView.swift @@ -11,15 +11,11 @@ import DiscordKitCore import DiscordKit import CachedAsyncImage - - - struct StickerPackView: View { let pack: StickerPack @Binding var packPresenting: Bool - @State private var stickerHovered: Int? = nil + @State private var stickerHovered: Int? @State private var listHovered: Bool = false - var body: some View { VStack { if pack.banner_asset_id != nil { @@ -29,7 +25,6 @@ struct StickerPackView: View { } placeholder: { ProgressView().progressViewStyle(.circular)} }.frame(height: 100) } - VStack { HStack(spacing: 15) { // Back button @@ -37,7 +32,6 @@ struct StickerPackView: View { packPresenting = false } label: {Image(systemName: "arrow.left")} .controlSize(.large) - Text(pack.name).font(.title).fontWeight(.bold) Spacer() Text("􀐅 x\(pack.stickers.count)") @@ -48,26 +42,23 @@ struct StickerPackView: View { Text(pack.description) .fixedSize(horizontal: false, vertical: true) .frame(maxWidth: .infinity, alignment: .leading) - List { ForEach(0.. StickerPack? { guard let stickerPacks: [StickerPack] = try? await restAPI.listNitroStickerPacks() else {return nil} - for pack in stickerPacks { - if pack.id == fullSticker!.pack_id { - return pack - } + for pack in stickerPacks where pack.id == fullSticker!.pack_id { + return pack } return nil } @@ -133,14 +119,14 @@ struct MessageStickerView: View { Button { if fullSticker == nil { Task { - fullSticker = try await restAPI.getSticker(sticker.id) - openPopoverEvt() - } - } else { - openPopoverEvt() - } - infoShow.toggle() - packPresenting = false + fullSticker = try await restAPI.getSticker(sticker.id) + openPopoverEvt() + } + } else { + openPopoverEvt() + } + infoShow.toggle() + packPresenting = false } label: { StickerItemView(sticker: sticker, size: 160, play: .useDefault) @@ -164,7 +150,6 @@ struct MessageStickerView: View { if sticker.format_type == .aPNG { Text("Sorry, aPNG stickers can't be played (yet)").font(.footnote) } - if fullSticker.pack_id != nil { Button { Task { @@ -174,11 +159,9 @@ struct MessageStickerView: View { } label: { Label("View Sticker Pack", systemImage: "square.on.square") .frame(maxWidth: .infinity) - } .buttonStyle(FlatButtonStyle()) .controlSize(.small) - } } else { Text("Loading sticker...").font(.headline) @@ -197,7 +180,7 @@ struct MessageStickerView: View { struct StickerView_Previews: PreviewProvider { static var previews: some View { - // StickerView() + // MessageStickerView(sticker: StickerItem(id: )) EmptyView() } } From dc3a9e1680edd9b3a9204d4a1dfa5573e4c9f469 Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 15:09:56 +0100 Subject: [PATCH 08/13] Remove DiscordKit Reference --- Swiftcord.xcodeproj/project.pbxproj | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index 65a5e5ce..356eb767 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -263,8 +263,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 03A188B82A0F864500D5F4BC /* DiscordKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = DiscordKit; path = ../DiscordKit; sourceTree = ""; }; - 03A188BD2A0FDB7500D5F4BC /* BasicStickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicStickerView.swift; sourceTree = ""; }; + 03A188BD2A0FDB7500D5F4BC /* BasicStickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicStickerView.swift; sourceTree = ""; usesTabs = 0; }; 03A188BF2A0FDB8A00D5F4BC /* MessageStickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageStickerView.swift; sourceTree = ""; }; 13A79FBF298C41C800D19AAB /* View+KeyDown.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+KeyDown.swift"; sourceTree = ""; }; 36004E1C283D63E500F0BA73 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; @@ -1410,7 +1409,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = Q382QLKDG3; + DEVELOPMENT_TEAM = V4747CQLU2; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1668,7 +1667,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = Q382QLKDG3; + DEVELOPMENT_TEAM = V4747CQLU2; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1702,7 +1701,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = Q382QLKDG3; + DEVELOPMENT_TEAM = V4747CQLU2; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; From c89f7f376a7eb6a62a1d61f33ef5c0406f3925b9 Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 15:12:29 +0100 Subject: [PATCH 09/13] Update Package.resolved --- .../xcshareddata/swiftpm/Package.resolved | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 27ecf9ac..c479779f 100644 --- a/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -9,6 +9,15 @@ "revision" : "2214f9ee2476f28af64cb38359defe59e85197a1" } }, + { + "identity" : "discordkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftcordApp/DiscordKit", + "state" : { + "branch" : "main", + "revision" : "c2f7e6a48611fac03456f725f6e4f5d3609d297b" + } + }, { "identity" : "lottie-spm", "kind" : "remoteSourceControl", @@ -54,24 +63,6 @@ "version" : "2.3.2" } }, - { - "identity" : "swift-docc-plugin", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-plugin", - "state" : { - "revision" : "9b1258905c21fc1b97bf03d1b4ca12c4ec4e5fda", - "version" : "1.2.0" - } - }, - { - "identity" : "swift-docc-symbolkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-symbolkit", - "state" : { - "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", - "version" : "1.0.0" - } - }, { "identity" : "swift-log", "kind" : "remoteSourceControl", From e5f1deab8c0b49271c6e9b2c5069df9fa2b5697d Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 15:13:04 +0100 Subject: [PATCH 10/13] Update Package.resolved --- .../xcshareddata/swiftpm/Package.resolved | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index c479779f..48f3f458 100644 --- a/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Swiftcord.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -9,14 +9,14 @@ "revision" : "2214f9ee2476f28af64cb38359defe59e85197a1" } }, - { - "identity" : "discordkit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SwiftcordApp/DiscordKit", - "state" : { - "branch" : "main", - "revision" : "c2f7e6a48611fac03456f725f6e4f5d3609d297b" - } + { + "identity" : "discordkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftcordApp/DiscordKit", + "state" : { + "branch" : "main", + "revision" : "c2f7e6a48611fac03456f725f6e4f5d3609d297b" + } }, { "identity" : "lottie-spm", From cb462cedbb5c6f2970a37efdd45da4f8e2e11a00 Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 15:17:26 +0100 Subject: [PATCH 11/13] Update project.pbxproj --- Swiftcord.xcodeproj/project.pbxproj | 1 - 1 file changed, 1 deletion(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index 65a5e5ce..ac252847 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -263,7 +263,6 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 03A188B82A0F864500D5F4BC /* DiscordKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = DiscordKit; path = ../DiscordKit; sourceTree = ""; }; 03A188BD2A0FDB7500D5F4BC /* BasicStickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicStickerView.swift; sourceTree = ""; }; 03A188BF2A0FDB8A00D5F4BC /* MessageStickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageStickerView.swift; sourceTree = ""; }; 13A79FBF298C41C800D19AAB /* View+KeyDown.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+KeyDown.swift"; sourceTree = ""; }; From 6f1c2e6e92eda6c3399ab3f5e1438021a4417fec Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 15:28:33 +0100 Subject: [PATCH 12/13] DiscordKit main branch --- Swiftcord.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index 356eb767..47cc4e6d 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -1802,8 +1802,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SwiftcordApp/DiscordKit"; requirement = { - kind = revision; - revision = c2f7e6a48611fac03456f725f6e4f5d3609d297b; + branch = main; + kind = branch; }; }; DA8AEA6629029747007BAAEA /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */ = { From 5aa3924b5ae693812b9e4452ed8fa145c5ef0d3d Mon Sep 17 00:00:00 2001 From: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Date: Sun, 14 May 2023 15:38:11 +0100 Subject: [PATCH 13/13] Update project.pbxproj --- Swiftcord.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Swiftcord.xcodeproj/project.pbxproj b/Swiftcord.xcodeproj/project.pbxproj index 47cc4e6d..bb2b5f40 100644 --- a/Swiftcord.xcodeproj/project.pbxproj +++ b/Swiftcord.xcodeproj/project.pbxproj @@ -1409,7 +1409,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = V4747CQLU2; + DEVELOPMENT_TEAM = Q382QLKDG3; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1667,7 +1667,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = V4747CQLU2; + DEVELOPMENT_TEAM = Q382QLKDG3; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -1701,7 +1701,7 @@ CURRENT_PROJECT_VERSION = 16; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"Swiftcord/Preview Content\""; - DEVELOPMENT_TEAM = V4747CQLU2; + DEVELOPMENT_TEAM = Q382QLKDG3; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES;