view LazyBear/UI/CompanyView.swift @ 287:22eba376075e

Add custom haptics
author Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
date Sat, 20 Mar 2021 15:01:05 +0100
parents 7252f5e62c90
children
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
    @State private var scale: CGFloat = 1
    @EnvironmentObject var hudManager: HudManager
    @EnvironmentObject var companyOption: CompanyOption
    @EnvironmentObject var hapticsManager: HapticsManager
    @Environment(\.managedObjectContext) private var moc
    @FetchRequest(entity: Company.entity(), sortDescriptors: []) var companies: FetchedResults<Company>
    
    var body: some View {
        ScrollView {
            if companyOption.view == .stock {
                PriceView(symbol: symbol, showVertical: false)
                ChartView(symbol: symbol)
                KeyStatsView(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(); hapticsManager.complexSuccess()}) {
                    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")
                    }
                    .scaleEffect(scale)
                    .animation(.easeIn)
                    
                } else {
                    Button(action: { removeCompany() }) {
                        Image(systemName: "star.fill")
                    }
                }
            }
        }
    }
    
    // Add to watchlist
    private func addCompany() {
        let company = Company(context: moc)
        company.symbol = symbol
        company.name = name
        do {
            try moc.save()
            hudManager.selectHud(type: .notification)
            hapticsManager.simpleSuccess()
            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())
    }
}