Skip to content

Commit 2919e21

Browse files
feat (settings): add ability to set sidebar icon from assets
1 parent 044efa4 commit 2919e21

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

Swiftcord/Views/Settings/SettingsView.swift

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,13 @@ private extension SettingsView {
7575
let icon: Icon?
7676

7777
struct Icon: Hashable {
78+
enum IconResource: Equatable, Hashable {
79+
case system(_ name: String)
80+
case asset(_ name: String)
81+
}
82+
7883
let baseColor: Color
79-
let icon: String
84+
let icon: IconResource
8085
}
8186

8287
enum Name: String {
@@ -110,27 +115,27 @@ private extension SettingsView {
110115
}
111116
private static let pages: [Page] = [
112117
.init(.userSection, children: [
113-
.init(.account, icon: .init(baseColor: .blue, icon: "person.fill")),
114-
.init(.profile, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
115-
.init(.privacy, icon: .init(baseColor: .red, icon: "shield.lefthalf.filled"))
118+
.init(.account, icon: .init(baseColor: .blue, icon: .system("person.fill"))),
119+
.init(.profile, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
120+
.init(.privacy, icon: .init(baseColor: .red, icon: .system("shield.lefthalf.filled")))
116121
]),
117122
.init(.paymentSection, children: [
118-
.init(.nitro, icon: .init(baseColor: .accentColor, icon: "person.crop.circle")),
119-
.init(.boost, icon: .init(baseColor: .green, icon: "person.crop.circle")),
120-
.init(.subscriptions, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
121-
.init(.gift, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
122-
.init(.billing, icon: .init(baseColor: .blue, icon: "person.crop.circle"))
123+
.init(.nitro, icon: .init(baseColor: .gray, icon: .asset("NitroSubscriber"))),
124+
.init(.boost, icon: .init(baseColor: .green, icon: .system("person.crop.circle"))),
125+
.init(.subscriptions, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
126+
.init(.gift, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
127+
.init(.billing, icon: .init(baseColor: .blue, icon: .system("person.crop.circle")))
123128
]),
124129
.init(.appSection, children: [
125-
.init(.appearance, icon: .init(baseColor: .black, icon: "person.crop.circle")),
126-
.init(.accessibility, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
127-
.init(.voiceVideo, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
128-
.init(.textImages, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
129-
.init(.notifs, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
130-
.init(.keybinds, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
131-
.init(.lang, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
132-
.init(.streamer, icon: .init(baseColor: .blue, icon: "person.crop.circle")),
133-
.init(.advanced, icon: .init(baseColor: .blue, icon: "person.crop.circle"))
130+
.init(.appearance, icon: .init(baseColor: .black, icon: .system("person.crop.circle"))),
131+
.init(.accessibility, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
132+
.init(.voiceVideo, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
133+
.init(.textImages, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
134+
.init(.notifs, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
135+
.init(.keybinds, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
136+
.init(.lang, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
137+
.init(.streamer, icon: .init(baseColor: .blue, icon: .system("person.crop.circle"))),
138+
.init(.advanced, icon: .init(baseColor: .blue, icon: .system("person.crop.circle")))
134139
])
135140
]
136141

@@ -156,10 +161,17 @@ private extension SettingsView {
156161
Text(item.nameString)
157162
} icon: {
158163
if let icon = item.icon {
159-
Image(systemName: icon.icon)
160-
.foregroundColor(.primary)
161-
.frame(width: 20, height: 20)
162-
.background(RoundedRectangle(cornerRadius: 5, style: .continuous).fill(icon.baseColor.gradient))
164+
Group {
165+
switch icon.icon {
166+
case .system(let name):
167+
Image(systemName: name)
168+
case .asset(let name):
169+
Image(name).resizable().padding(2)
170+
}
171+
}
172+
.foregroundColor(.primary)
173+
.frame(width: 20, height: 20)
174+
.background(RoundedRectangle(cornerRadius: 5, style: .continuous).fill(icon.baseColor.gradient))
163175
} else {
164176
EmptyView()
165177
}

0 commit comments

Comments
 (0)