Skip to content

Commit 9f863d9

Browse files
committed
Use alternative image url if needed for coins in widgets
1 parent 06b61a6 commit 9f863d9

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

UnstoppableWallet/Widget/Misc/ApiProvider.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class ApiProvider {
2424
func topCoins(limit: Int) async throws -> [Coin] {
2525
let parameters: Parameters = [
2626
"limit": limit,
27-
"fields": "uid,name,code",
27+
"fields": "uid,name,code,image",
2828
"order_by_rank": "true",
2929
]
3030

@@ -48,7 +48,7 @@ class ApiProvider {
4848
func coinWithPrice(uid: String, currencyCode: String) async throws -> Coin {
4949
let parameters: Parameters = [
5050
"uids": uid,
51-
"fields": "uid,name,code,price,price_change_24h,price_change_1d",
51+
"fields": "uid,name,code,price,price_change_24h,price_change_1d,image",
5252
"currency": currencyCode.lowercased(),
5353
]
5454

@@ -102,6 +102,7 @@ struct Coin: ImmutableMappable {
102102
let priceChange1w: Decimal?
103103
let priceChange1m: Decimal?
104104
let priceChange3m: Decimal?
105+
let imageUrl: String?
105106

106107
init(map: Map) throws {
107108
uid = try map.value("uid")
@@ -115,6 +116,7 @@ struct Coin: ImmutableMappable {
115116
priceChange1w = try? map.value("price_change_1w", using: Transform.stringToDecimalTransform)
116117
priceChange1m = try? map.value("price_change_1m", using: Transform.stringToDecimalTransform)
117118
priceChange3m = try? map.value("price_change_3m", using: Transform.stringToDecimalTransform)
119+
imageUrl = try? map.value("image")
118120
}
119121
}
120122

UnstoppableWallet/Widget/Misc/Extensions.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import SwiftUI
22

33
extension Coin {
44
var image: Image? {
5-
let iconUrl = "https://cdn.blocksdecoded.com/coin-icons/32px/\(uid)@3x.png"
6-
7-
guard let url = URL(string: iconUrl) else { return nil }
8-
guard let data = try? Data(contentsOf: url) else { return nil }
9-
guard let uiImage = UIImage(data: data) else { return nil }
10-
11-
return Image(uiImage: uiImage)
5+
do {
6+
let iconUrl = "https://cdn.blocksdecoded.com/coin-icons/32px/\(uid)@3x.png"
7+
return try image(url: iconUrl)
8+
} catch {
9+
guard let alternativeUrl = imageUrl else { return nil }
10+
return try? image(url: alternativeUrl)
11+
}
1212
}
1313

1414
func formattedPrice(currency: Currency) -> String {
@@ -27,6 +27,14 @@ extension Coin {
2727
return priceChange >= 0 ? .up : .down
2828
}
2929

30+
private func image(url: String) throws -> Image? {
31+
guard let url = URL(string: url) else { return nil }
32+
let data = try Data(contentsOf: url)
33+
34+
guard let uiImage = UIImage(data: data) else { return nil }
35+
return Image(uiImage: uiImage)
36+
}
37+
3038
private func priceChange(timePeriod: WatchlistTimePeriod) -> Decimal? {
3139
switch timePeriod {
3240
case .hour24: return priceChange24h

0 commit comments

Comments
 (0)