From f69cc05969e032db5d303014802ea9001aae63a7 Mon Sep 17 00:00:00 2001 From: Ege Sucu Date: Wed, 23 Aug 2023 01:42:38 +0300 Subject: [PATCH 1/2] Added new extension & coinAPIKey check * isNotEmpty is a common usable boolean check for arrays and strings in order to avoid !item.isEmpty * Favorite View would fetch the data without checking the apiKey and would fail because of the missing key --- .../Scenes/Favorites/FavoritesViewModel.swift | 10 ++++++---- .../Utility/Extensions/ArrayExtensions.swift | 5 +++++ .../Utility/Extensions/StringExtensions.swift | 5 +++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/SampleAppSwiftUI/Scenes/Favorites/FavoritesViewModel.swift b/SampleAppSwiftUI/Scenes/Favorites/FavoritesViewModel.swift index 1e326e1..96c07ec 100644 --- a/SampleAppSwiftUI/Scenes/Favorites/FavoritesViewModel.swift +++ b/SampleAppSwiftUI/Scenes/Favorites/FavoritesViewModel.swift @@ -41,10 +41,12 @@ class FavoritesViewModel: ObservableObject { } func fetchFavorites() { - DispatchQueue.main.async { - self.isLoading = false - self.getFavoriteCoinList() - self.startSocketConnection() + if Configuration.coinApiKey.isNotEmpty { + DispatchQueue.main.async { + self.isLoading = false + self.getFavoriteCoinList() + self.startSocketConnection() + } } } diff --git a/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift b/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift index c7d245f..21ae1bf 100644 --- a/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift +++ b/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift @@ -25,4 +25,9 @@ extension Array: RawRepresentable where Element: Codable { } return result } + + public var isNotEmpty: Bool { + + return !self.isEmpty + } } diff --git a/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift b/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift index 32a2a4e..18615d5 100644 --- a/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift +++ b/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift @@ -24,4 +24,9 @@ extension String { static var empty: Self { "" } + + public var isNotEmpty: Bool { + + return !self.isEmpty + } } From 816561b72e99acdcf65e0f6e9225dd281a277f86 Mon Sep 17 00:00:00 2001 From: Ege Sucu Date: Wed, 23 Aug 2023 02:03:04 +0300 Subject: [PATCH 2/2] Formatted spacing & removed query items inside strings into URLQueryItem --- SampleAppSwiftUI/Configs/AppStore.xcconfig | 2 +- SampleAppSwiftUI/Configs/Development.xcconfig | 2 +- SampleAppSwiftUI/Configs/Production.xcconfig | 2 +- SampleAppSwiftUI/Network/WebSocket/WebSocketEndpoint.swift | 2 +- SampleAppSwiftUI/Network/WebSocket/WebSocketProvider.swift | 4 +++- .../Network/WebSocket/WebSocketSubscription.swift | 2 +- SampleAppSwiftUI/Resources/Constants/URLs.swift | 5 +++-- SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift | 5 ++--- SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift | 5 ++--- 9 files changed, 15 insertions(+), 14 deletions(-) diff --git a/SampleAppSwiftUI/Configs/AppStore.xcconfig b/SampleAppSwiftUI/Configs/AppStore.xcconfig index 901eb09..e322645 100644 --- a/SampleAppSwiftUI/Configs/AppStore.xcconfig +++ b/SampleAppSwiftUI/Configs/AppStore.xcconfig @@ -11,6 +11,6 @@ base_url = https:/$()/min-api.cryptocompare.com/data/ -webSocket_base_url = wss:/$()/streamer.cryptocompare.com/v2?api_key=%@ +webSocket_base_url = wss:/$()/streamer.cryptocompare.com/v2 personal_api = diff --git a/SampleAppSwiftUI/Configs/Development.xcconfig b/SampleAppSwiftUI/Configs/Development.xcconfig index 8f47c1b..ca04e8d 100644 --- a/SampleAppSwiftUI/Configs/Development.xcconfig +++ b/SampleAppSwiftUI/Configs/Development.xcconfig @@ -13,6 +13,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.adesso.SampleAppSwiftUI.development base_url = https:/$()/min-api.cryptocompare.com/data/ -webSocket_base_url = wss:/$()/streamer.cryptocompare.com/v2?api_key=%@ +webSocket_base_url = wss:/$()/streamer.cryptocompare.com/v2 personal_api = diff --git a/SampleAppSwiftUI/Configs/Production.xcconfig b/SampleAppSwiftUI/Configs/Production.xcconfig index c0f37a8..bc9d5d3 100644 --- a/SampleAppSwiftUI/Configs/Production.xcconfig +++ b/SampleAppSwiftUI/Configs/Production.xcconfig @@ -13,6 +13,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.adesso.SampleAppSwiftUI.prod base_url = https:/$()/min-api.cryptocompare.com/data/ -webSocket_base_url = wss:/$()/streamer.cryptocompare.com/v2?api_key=%@ +webSocket_base_url = wss:/$()/streamer.cryptocompare.com/v2 personal_api = diff --git a/SampleAppSwiftUI/Network/WebSocket/WebSocketEndpoint.swift b/SampleAppSwiftUI/Network/WebSocket/WebSocketEndpoint.swift index bde842d..8afa565 100644 --- a/SampleAppSwiftUI/Network/WebSocket/WebSocketEndpoint.swift +++ b/SampleAppSwiftUI/Network/WebSocket/WebSocketEndpoint.swift @@ -18,7 +18,7 @@ enum WebSocketEndpoint: TargetEndpointProtocol { var path: String { switch self { case .baseCoinApi: - return String(format: Constants.webSocketEndpoint, Constants.apiKey) + return Constants.webSocketEndpoint } } } diff --git a/SampleAppSwiftUI/Network/WebSocket/WebSocketProvider.swift b/SampleAppSwiftUI/Network/WebSocket/WebSocketProvider.swift index 51e5586..ed70b08 100644 --- a/SampleAppSwiftUI/Network/WebSocket/WebSocketProvider.swift +++ b/SampleAppSwiftUI/Network/WebSocket/WebSocketProvider.swift @@ -15,7 +15,9 @@ class WebSocketProvider: NSObject { init? (endPoint: TargetEndpointProtocol = WebSocketEndpoint.baseCoinApi, session: URLSession = URLSession.shared ) { guard let url = URL(string: WebSocketEndpoint.baseCoinApi.path) else { return nil } - self.socket = WebSocketStream(url: url, + let query = URLQueryItem(name: "api_key", value: Configuration.coinApiKey) + let finalURL = url.appending(queryItems: [query]) + self.socket = WebSocketStream(url: finalURL, session: session) } } diff --git a/SampleAppSwiftUI/Network/WebSocket/WebSocketSubscription.swift b/SampleAppSwiftUI/Network/WebSocket/WebSocketSubscription.swift index becc953..7a16c7f 100644 --- a/SampleAppSwiftUI/Network/WebSocket/WebSocketSubscription.swift +++ b/SampleAppSwiftUI/Network/WebSocket/WebSocketSubscription.swift @@ -42,7 +42,7 @@ class WebSocketSubscription: Subscription where S.Input == URLSes _ = subscriber.receive(message) } } catch { - debugPrint("Someting went wrong") + debugPrint("Something went wrong") } } } diff --git a/SampleAppSwiftUI/Resources/Constants/URLs.swift b/SampleAppSwiftUI/Resources/Constants/URLs.swift index 48c001a..dddcb40 100644 --- a/SampleAppSwiftUI/Resources/Constants/URLs.swift +++ b/SampleAppSwiftUI/Resources/Constants/URLs.swift @@ -9,11 +9,12 @@ import Foundation enum URLs { enum Icons { - static let baseURL = "https://assets.coincap.io/assets/icons/" + static let baseURL = "https://assets.coincap.io" + static let iconPath = "/assets/icons/" static let scaleURL = "@2x.png" static func getURL(from coinCode: CoinCode) -> URL? { - URL(string: "\(baseURL)\(coinCode.lowercased())\(scaleURL)") + URL(string: "\(baseURL)\(iconPath)\(coinCode.lowercased())\(scaleURL)") } } } diff --git a/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift b/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift index 21ae1bf..9aaa33a 100644 --- a/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift +++ b/SampleAppSwiftUI/Utility/Extensions/ArrayExtensions.swift @@ -25,9 +25,8 @@ extension Array: RawRepresentable where Element: Codable { } return result } - + public var isNotEmpty: Bool { - - return !self.isEmpty + !self.isEmpty } } diff --git a/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift b/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift index 18615d5..b6f5802 100644 --- a/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift +++ b/SampleAppSwiftUI/Utility/Extensions/StringExtensions.swift @@ -24,9 +24,8 @@ extension String { static var empty: Self { "" } - + public var isNotEmpty: Bool { - - return !self.isEmpty + !self.isEmpty } }