view LazyBear/UI/CompanyView.swift @ 272:9e23e9b0ab36

Implementing Custom Line Chart
author Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
date Mon, 15 Mar 2021 20:06:24 +0100
parents e8223540f3f3
children 62f2c675b666
line wrap: on
line source

//
//  CompanyView.swift
//  LazyBear
//
//  Created by Dennis Concepción Martín on 19/2/21.
//

import SwiftUI

enum ViewType {
    case stock, insiders
}

struct CompanyView: View {
    var name: String
    var symbol: String
    @EnvironmentObject var hudManager: HudManager
    @EnvironmentObject var companyOption: CompanyOption
    @Environment(\.managedObjectContext) private var moc
    @FetchRequest(entity: Company.entity(), sortDescriptors: []) var companies: FetchedResults<Company>
    
    var body: some View {
        ScrollView {
            //VStack {
                if companyOption.view == .stock {
                    PriceView(symbol: symbol, showVertical: false)
                    ChartView(symbol: symbol)
                    NewsView(symbol: symbol)
                        
                } else if companyOption.view == .insiders {
                    InsiderSummary(symbol: symbol)
                    InsiderTransactions(symbol: symbol)
                }
            //}
        }
        .onAppear { companyOption.view = .stock }
        .toolbar {
            ToolbarItem(placement: .principal) {
                Button(action: { self.hudManager.showAction.toggle() }) {
                    HStack {
                        if companyOption.view == .stock {
                            Text("Stock")
                        } else if companyOption.view == .insiders {
                            Text("Insiders")
                        }
                        Image(systemName: "chevron.down")
                    }
                }
            }
            
            ToolbarItem(placement: .navigationBarTrailing) {
                let symbols = companies.map { $0.symbol }
                if !symbols.contains(symbol) {
                    Button(action: { addCompany() }) {
                        Image(systemName: "star")
                    }
                } else {
                    Button(action: { removeCompany() }) {
                        Image(systemName: "star.fill")
                    }
                }
            }
        }
    }
    
    // Add to watchlist
    private func addCompany() {
        let generator = UINotificationFeedbackGenerator()  // Haptic
        let company = Company(context: moc)
        company.symbol = symbol
        company.name = name
        do {
            try moc.save()
            hudManager.selectHud(type: .notification)
            generator.notificationOccurred(.success)
            print("Company saved")
        } catch {
            print(error.localizedDescription)
        }
    }
    
    private func removeCompany() {
        let symbols = companies.map { $0.symbol }
        let index = symbols.firstIndex(of: symbol)
        let company = companies[index!]
        moc.delete(company)
        do {
            try moc.save()
            print("Company deleted")
        } catch {
            // Error
        }
    }
}

struct CompanyView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            CompanyView(name: "apple inc", symbol: "aapl")
                .environmentObject(HudManager())
                .environmentObject(CompanyOption())
                .navigationTitle("APPL")
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}