Skip to content

Instantly share code, notes, and snippets.

import Foundation
typealias CompletionHandler = (Data) -> Void
typealias FailureHandler = (APIError) -> Void
struct EmptyRequest: Encodable {} // Added this
struct EmptyResponse: Decodable {} // Added this
enum HTTPMethod: String {
case get
import Foundation
typealias CompletionHandler = (Data) -> Void
typealias FailureHandler = (APIError) -> Void
struct EmptyRequest: Encodable {} // Added this
struct EmptyResponse: Decodable {} // Added this
enum HTTPMethod: String {
case get
...
if viewModel.error == .noInternet {
Text("No internet")
.fontWeight(.bold)
.foregroundColor(.red)
} else if viewModel.error != nil {
Text("Login error")
.fontWeight(.bold)
.foregroundColor(.red)
...
static func call(
scheme: String = Config.shared.scheme,
host: String = Config.shared.host,
path: String,
method: HTTPMethod,
parameters: Parameters? = nil,
completion: @escaping CompletionHandler,
failure: @escaping FailureHandler
import Foundation
enum APIError: String, Error {
case jsonDecoding
case response
case noInternet // Added this
}
import SwiftUI
@main
struct SwiftUIBlueprintApp: App {
init() {
NetworkMonitor.shared.startMonitoring() // Added this
}
var body: some Scene {
import Foundation
import Network
class NetworkMonitor {
static let shared: NetworkMonitor = NetworkMonitor()
let monitor = NWPathMonitor()
private var status: NWPath.Status = .requiresConnection
var isReachable: Bool { status == .satisfied }
import SwiftUI
struct LoginScreen: View {
@ObservedObject var viewModel: LoginViewModel = LoginViewModel()
var body: some View {
VStack {
Spacer()
import Foundation
class LoginViewModel: ObservableObject {
@Published var username: String = ""
@Published var password: String = ""
@Published var error: APIError? // Added this
func login() {
import Foundation
struct LoginAction {
let path = "/login"
let method: HTTPMethod = .post
var parameters: LoginRequest
func call(
completion: @escaping (LoginResponse) -> Void,
failure: @escaping (APIError) -> Void // Added this