diff --git a/Pocket Poster/Assets.xcassets/Credits/Contents.json b/Pocket Poster/Assets.xcassets/Credits/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Credits/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Pocket Poster/Assets.xcassets/Credits/Nathan.imageset/Contents.json b/Pocket Poster/Assets.xcassets/Credits/Nathan.imageset/Contents.json
new file mode 100644
index 0000000..ec16c04
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Credits/Nathan.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Nathan@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Pocket Poster/Assets.xcassets/Credits/Nathan.imageset/Nathan@2x.png b/Pocket Poster/Assets.xcassets/Credits/Nathan.imageset/Nathan@2x.png
new file mode 100644
index 0000000..8935cc5
Binary files /dev/null and b/Pocket Poster/Assets.xcassets/Credits/Nathan.imageset/Nathan@2x.png differ
diff --git a/Pocket Poster/Assets.xcassets/Credits/duy.imageset/Contents.json b/Pocket Poster/Assets.xcassets/Credits/duy.imageset/Contents.json
new file mode 100644
index 0000000..93a02c2
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Credits/duy.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "duy@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Pocket Poster/Assets.xcassets/Credits/duy.imageset/duy@2x.png b/Pocket Poster/Assets.xcassets/Credits/duy.imageset/duy@2x.png
new file mode 100644
index 0000000..2d49a5f
Binary files /dev/null and b/Pocket Poster/Assets.xcassets/Credits/duy.imageset/duy@2x.png differ
diff --git a/Pocket Poster/Assets.xcassets/Credits/leminlimez.imageset/Contents.json b/Pocket Poster/Assets.xcassets/Credits/leminlimez.imageset/Contents.json
new file mode 100644
index 0000000..c875ab3
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Credits/leminlimez.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "LeminLimez.jpg",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Pocket Poster/Assets.xcassets/Credits/leminlimez.imageset/LeminLimez.jpg b/Pocket Poster/Assets.xcassets/Credits/leminlimez.imageset/LeminLimez.jpg
new file mode 100644
index 0000000..94bb0a0
Binary files /dev/null and b/Pocket Poster/Assets.xcassets/Credits/leminlimez.imageset/LeminLimez.jpg differ
diff --git a/Pocket Poster/Assets.xcassets/Credits/sky.imageset/Contents.json b/Pocket Poster/Assets.xcassets/Credits/sky.imageset/Contents.json
new file mode 100644
index 0000000..4fbde9b
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Credits/sky.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "sky@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Pocket Poster/Assets.xcassets/Credits/sky.imageset/sky@2x.png b/Pocket Poster/Assets.xcassets/Credits/sky.imageset/sky@2x.png
new file mode 100644
index 0000000..0a20990
Binary files /dev/null and b/Pocket Poster/Assets.xcassets/Credits/sky.imageset/sky@2x.png differ
diff --git a/Pocket Poster/Assets.xcassets/Symbols/Contents.json b/Pocket Poster/Assets.xcassets/Symbols/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Pocket Poster/Assets.xcassets/Symbols/discord.fill.symbolset/Contents.json b/Pocket Poster/Assets.xcassets/Symbols/discord.fill.symbolset/Contents.json
new file mode 100644
index 0000000..3e33952
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/discord.fill.symbolset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "symbols" : [
+ {
+ "filename" : "discord.fill.svg",
+ "idiom" : "universal"
+ }
+ ]
+}
diff --git a/Pocket Poster/Assets.xcassets/Symbols/discord.fill.symbolset/discord.fill.svg b/Pocket Poster/Assets.xcassets/Symbols/discord.fill.symbolset/discord.fill.svg
new file mode 100644
index 0000000..4819b03
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/discord.fill.symbolset/discord.fill.svg
@@ -0,0 +1,200 @@
+
+
+
+
diff --git a/Pocket Poster/Assets.xcassets/Symbols/discord.symbolset/Contents.json b/Pocket Poster/Assets.xcassets/Symbols/discord.symbolset/Contents.json
new file mode 100644
index 0000000..24f139d
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/discord.symbolset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "symbols" : [
+ {
+ "filename" : "discord.svg",
+ "idiom" : "universal"
+ }
+ ]
+}
diff --git a/Pocket Poster/Assets.xcassets/Symbols/discord.symbolset/discord.svg b/Pocket Poster/Assets.xcassets/Symbols/discord.symbolset/discord.svg
new file mode 100644
index 0000000..baa9398
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/discord.symbolset/discord.svg
@@ -0,0 +1,199 @@
+
+
+
+
diff --git a/Pocket Poster/Assets.xcassets/Symbols/github.fill.symbolset/Contents.json b/Pocket Poster/Assets.xcassets/Symbols/github.fill.symbolset/Contents.json
new file mode 100644
index 0000000..092d1f2
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/github.fill.symbolset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "symbols" : [
+ {
+ "filename" : "github.fill.svg",
+ "idiom" : "universal"
+ }
+ ]
+}
diff --git a/Pocket Poster/Assets.xcassets/Symbols/github.fill.symbolset/github.fill.svg b/Pocket Poster/Assets.xcassets/Symbols/github.fill.symbolset/github.fill.svg
new file mode 100644
index 0000000..9964bc1
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/github.fill.symbolset/github.fill.svg
@@ -0,0 +1,167 @@
+
+
+
+
diff --git a/Pocket Poster/Assets.xcassets/Symbols/ko-fi.symbolset/Contents.json b/Pocket Poster/Assets.xcassets/Symbols/ko-fi.symbolset/Contents.json
new file mode 100644
index 0000000..2df279c
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/ko-fi.symbolset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "symbols" : [
+ {
+ "filename" : "ko-fi.svg",
+ "idiom" : "universal"
+ }
+ ]
+}
diff --git a/Pocket Poster/Assets.xcassets/Symbols/ko-fi.symbolset/ko-fi.svg b/Pocket Poster/Assets.xcassets/Symbols/ko-fi.symbolset/ko-fi.svg
new file mode 100644
index 0000000..c9d3a71
--- /dev/null
+++ b/Pocket Poster/Assets.xcassets/Symbols/ko-fi.symbolset/ko-fi.svg
@@ -0,0 +1,157 @@
+
+
+
diff --git a/Pocket Poster/Views/Accessory Views/LinkCell.swift b/Pocket Poster/Views/Accessory Views/LinkCell.swift
new file mode 100644
index 0000000..7fdd2a9
--- /dev/null
+++ b/Pocket Poster/Views/Accessory Views/LinkCell.swift
@@ -0,0 +1,59 @@
+//
+// LinkCell.swift
+// Pocket Poster
+//
+// Created by lemin on 6/3/25.
+//
+
+import SwiftUI
+
+struct LinkCell: View {
+ var imageName: String
+ var url: String
+ var title: String
+ var contribution: String
+ var systemImage: Bool = false
+ var circle: Bool = false
+
+ var body: some View {
+ HStack(alignment: .center) {
+ Group {
+ if systemImage {
+ Image(systemName: imageName)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ } else {
+ if imageName != "" {
+ Image(imageName)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ }
+ }
+ }
+ .cornerRadius(circle ? .infinity : 0)
+ .frame(width: 24, height: 24)
+
+ VStack {
+ HStack {
+ Button(action: {
+ if url != "" {
+ UIApplication.shared.open(URL(string: url)!)
+ }
+ }) {
+ Text(title)
+ .fontWeight(.bold)
+ }
+ .padding(.horizontal, 6)
+ Spacer()
+ }
+ HStack {
+ Text(contribution)
+ .padding(.horizontal, 6)
+ .font(.footnote)
+ Spacer()
+ }
+ }
+ }
+ .foregroundColor(.blue)
+ }
+ }
diff --git a/Pocket Poster/Views/SettingsView.swift b/Pocket Poster/Views/SettingsView.swift
index 3516eb7..f2f0cb9 100644
--- a/Pocket Poster/Views/SettingsView.swift
+++ b/Pocket Poster/Views/SettingsView.swift
@@ -100,7 +100,30 @@ struct SettingsView: View {
Label("Links", systemImage: "link")
}
- // TODO: Credits
+ // MARK: Socials
+ Section {
+ Link(destination: URL(string: "https://github.com/leminlimez/Pocket-Poster")!) {
+ Label("View on GitHub", image: "github.fill")
+ }
+ Link(destination: URL(string: "https://discord.gg/MN8JgqSAqT")!) {
+ Label("Join the Discord", image: "discord.fill")
+ }
+ Link(destination: URL(string: "https://ko-fi.com/leminlimez")!) {
+ Label("Support on Ko-Fi", image: "ko-fi")
+ }
+ } header: {
+ Label("Socials", systemImage: "globe")
+ }
+
+ // MARK: Credits
+ Section {
+ LinkCell(imageName: "leminlimez", url: "https://github.com/leminlimez", title: "LeminLimez", contribution: NSLocalizedString("Main Developer", comment: "leminlimez's contribution"), circle: true)
+ LinkCell(imageName: "sky", url: "https://bsky.app/profile/did:plc:xykfeb7ieeo335g3aly6vev4", title: "dootskyre", contribution: "Shortcut Creator", circle: true)
+ LinkCell(imageName: "Nathan", url: "https://github.com/verygenericname", title: "Nathan", contribution: "Exploit", circle: true)
+ LinkCell(imageName: "duy", url: "https://github.com/khanhduytran0", title: "DuyKhanhTran", contribution: "Exploit", circle: true)
+ } header: {
+ Label("Credits", systemImage: "wrench.and.screwdriver")
+ }
}
.padding()
.alert(errorAlertTitle ?? "Error", isPresented: $showErrorAlert) {