view LazyBear/CompanyView.swift @ 465:6953d83060a4

New design
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Sat, 17 Jul 2021 17:58:57 +0100
parents
children
line wrap: on
line source

//
//  CompanyView.swift
//  lazybear
//
//  Created by Dennis Concepción Martín on 17/07/2021.
//

import SwiftUI
import Alamofire
import MapKit

struct CompanyView: View {
    var symbol: String
    @State private var companyInfo = CompanyInfoModel()
    @State private var companyQuote = CompanyQuoteModel()
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest(sortDescriptors: [], animation: .default) private var companies: FetchedResults<Company>
    
    var body: some View {
        ScrollView {
            VStack {
                MapSection(state: companyInfo.state ?? "New York")
                
                VStack(alignment: .leading) {
                    Text(companyInfo.symbol ?? "")
                        .font(.title)
                        .fontWeight(.semibold)
                        .foregroundColor(.primary)
                    
                    HStack {
                        Text(companyInfo.companyName ?? "")
                        Spacer()
                        Text(companyInfo.state ?? "")
                    }
                    .font(.subheadline)
                    .foregroundColor(.secondary)
                    
                    Divider()
                    StockSection(companyQuote: companyQuote)
                        .padding(.bottom)
                    
                    AboutSection(companyInfo: companyInfo)
                    
                    Spacer()
                }
                .padding()
            }
        }
        .ignoresSafeArea(edges: .top)
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                let watchlistSymbols = companies.map { $0.symbol }
                    if watchlistSymbols.contains(symbol) {
                        Button(action: deleteCompanyFromWatchlist) {
                            Image(systemName: "star.fill")
                                .font(.system(size: 25))
                        }
                        
                    } else {
                        Button(action: addCompanyToWatchlist) {
                            Image(systemName: "star")
                                .font(.system(size: 25))
                        }
                    }
            }
        }
        .onAppear(perform: requestApi)
    }
    
    // MARK: - REQUEST API
    private func requestApi() {
        // Request company information
        var url = "https://cloud.iexapis.com/stable/stock/\(symbol)/company?token=pk_58fd944e924e4a70acf8635bc335cec4"
        
        AF.request(url).responseDecodable(of: CompanyInfoModel.self) { response in
            if let value = response.value {
                self.companyInfo = value
            } else {
                // Handle error
            }
        }
        
        // Request quote
        url = "https://cloud.iexapis.com/stable/stock/\(symbol)/quote?token=pk_58fd944e924e4a70acf8635bc335cec4"
        AF.request(url).responseDecodable(of: CompanyQuoteModel.self) { response in
            if let value = response.value {
                self.companyQuote = value
            }
            else {
                // Handle error
            }
        }
    }
    
    // MARK: - ADD CORE DATA
    private func addCompanyToWatchlist() {
        withAnimation {
            let company = Company(context: viewContext)
            company.symbol = symbol
            company.companyName = companyQuote.companyName!

            do {
                try viewContext.save()
            } catch {
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
    
    // MARK: - DELETE CORE DATA
    private func deleteCompanyFromWatchlist() {
        withAnimation {
            let company = companies.first(where: { $0.symbol == symbol })
            viewContext.delete(company!)
            do {
                try viewContext.save()
            } catch {
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
}

struct CompanyView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            CompanyView(symbol: "AAPL")
        }
    }
}