changeset 165:125d268db489

Update UI
author Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
date Fri, 19 Feb 2021 20:25:06 +0100
parents f74a364441ca
children e457c2f62e50
files Company+CoreDataClass.swift Company+CoreDataProperties.swift LazyBear/ContentView.swift LazyBear/Functions/ReadJson.swift LazyBear/LazyBear.entitlements LazyBear/LazyBearApp.swift LazyBear/Local data/companies.json LazyBear/Models/CompanyModel.swift LazyBear/Models/ThemeModel.swift LazyBear/UI/CompanyView.swift LazyBear/UI/Row.swift LazyBear/UI/Search.swift LazyBear/UI/SearchBar.swift LazyBear/UI/Settings.swift LazyBear/UI/Watchlist.swift UserSettings+CoreDataClass.swift UserSettings+CoreDataProperties.swift
diffstat 16 files changed, 416 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Company+CoreDataClass.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,15 @@
+//
+//  Company+CoreDataClass.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+//
+
+import Foundation
+import CoreData
+
+@objc(Company)
+public class Company: NSManagedObject {
+ 
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Company+CoreDataProperties.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,28 @@
+//
+//  Company+CoreDataProperties.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+//
+
+import Foundation
+import CoreData
+
+
+extension Company {
+
+    @nonobjc public class func fetchRequest() -> NSFetchRequest<Company> {
+        return NSFetchRequest<Company>(entityName: "Company")
+    }
+
+    @NSManaged public var symbol: String
+    @NSManaged public var exchange: String
+    @NSManaged public var exchangeName: String
+    @NSManaged public var name: String
+    @NSManaged public var region: String
+    @NSManaged public var currency: String
+    @NSManaged public var cik: String
+
+}
+
--- a/LazyBear/ContentView.swift	Wed Feb 17 20:27:04 2021 +0100
+++ b/LazyBear/ContentView.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -6,75 +6,34 @@
 //
 
 import SwiftUI
-import CoreData
 
 struct ContentView: View {
-    @Environment(\.managedObjectContext) private var viewContext
-
-    @FetchRequest(
-        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
-        animation: .default)
-    private var items: FetchedResults<Item>
-
     var body: some View {
-        List {
-            ForEach(items) { item in
-                Text("Item at \(item.timestamp!, formatter: itemFormatter)")
-            }
-            .onDelete(perform: deleteItems)
-        }
-        .toolbar {
-            #if os(iOS)
-            EditButton()
-            #endif
-
-            Button(action: addItem) {
-                Label("Add Item", systemImage: "plus")
-            }
-        }
-    }
-
-    private func addItem() {
-        withAnimation {
-            let newItem = Item(context: viewContext)
-            newItem.timestamp = Date()
-
-            do {
-                try viewContext.save()
-            } catch {
-                // Replace this implementation with code to handle the error appropriately.
-                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
-                let nsError = error as NSError
-                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
-            }
-        }
-    }
-
-    private func deleteItems(offsets: IndexSet) {
-        withAnimation {
-            offsets.map { items[$0] }.forEach(viewContext.delete)
-
-            do {
-                try viewContext.save()
-            } catch {
-                // Replace this implementation with code to handle the error appropriately.
-                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
-                let nsError = error as NSError
-                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
-            }
+        TabView {
+            // First view
+            Watchlist()
+                .tabItem {
+                    Label("Watchlist", systemImage: "list.dash")
+                }
+            
+            // First view
+            Search()
+                .tabItem {
+                    Label("Search", systemImage: "magnifyingglass")
+                }
+            
+            // First view
+            Settings()
+                .tabItem {
+                    Label("Settings", systemImage: "gear")
+                }
         }
     }
 }
 
-private let itemFormatter: DateFormatter = {
-    let formatter = DateFormatter()
-    formatter.dateStyle = .short
-    formatter.timeStyle = .medium
-    return formatter
-}()
 
 struct ContentView_Previews: PreviewProvider {
     static var previews: some View {
-        ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
+        ContentView()
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/Functions/ReadJson.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,20 @@
+//
+//  ReadJson.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct ReadJson: View {
+    var body: some View {
+        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
+    }
+}
+
+struct ReadJson_Previews: PreviewProvider {
+    static var previews: some View {
+        ReadJson()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/LazyBear.entitlements	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.developer.icloud-container-identifiers</key>
+	<array/>
+</dict>
+</plist>
--- a/LazyBear/LazyBearApp.swift	Wed Feb 17 20:27:04 2021 +0100
+++ b/LazyBear/LazyBearApp.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -9,7 +9,7 @@
 
 @main
 struct LazyBearApp: App {
-    let persistenceController = PersistenceController.shared
+    let persistenceController = PersistenceController.shared  // Core Data init
 
     var body: some Scene {
         WindowGroup {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/Models/CompanyModel.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,18 @@
+//
+//  LocalCompany.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct CompanyModel: Hashable, Codable {
+    var symbol: String
+    var exchange: String
+    var exchangeName: String
+    var name: String
+    var region: String
+    var currency: String
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/Models/ThemeModel.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,20 @@
+//
+//  ThemeModel.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct ThemeModel: View {
+    var body: some View {
+        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
+    }
+}
+
+struct ThemeModel_Previews: PreviewProvider {
+    static var previews: some View {
+        ThemeModel()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/UI/CompanyView.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,20 @@
+//
+//  CompanyView.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct CompanyView: View {
+    var body: some View {
+        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
+    }
+}
+
+struct CompanyView_Previews: PreviewProvider {
+    static var previews: some View {
+        CompanyView()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/UI/Row.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,37 @@
+//
+//  Row.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct Row: View {
+    var baseText: String
+    var subText: String?
+    var lefView: AnyView?
+    var rightView: AnyView?
+    
+    var body: some View {
+        HStack {
+            lefView
+            VStack(alignment: .leading) {
+                Text(baseText.uppercased())
+                    .fontWeight(.semibold)
+                
+                Text(subText?.capitalized ?? "")
+                    .lineLimit(1)
+            }
+            
+            Spacer()
+            rightView
+        }
+    }
+}
+
+struct Row_Previews: PreviewProvider {
+    static var previews: some View {
+        Row(baseText: "aapl", subText: "apple inc")
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/UI/Search.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,32 @@
+//
+//  Search.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct Search: View {
+    @State private var company = String()
+    
+    var body: some View {
+        NavigationView {
+            VStack {
+                SearchBar(searchedText: $company)
+                    List(companies.filter({company.isEmpty ? false : $0.name.localizedStandardContains(company)}),id: \.symbol) { company in
+                        Row(baseText: company.symbol, subText: company.name)
+                    }
+                    .id(UUID())
+            }
+            .navigationTitle("Search 🔍")
+        }
+        .navigationViewStyle(StackNavigationViewStyle())
+    }
+}
+
+struct Search_Previews: PreviewProvider {
+    static var previews: some View {
+        Search()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/UI/SearchBar.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,63 @@
+//
+//  SearchBar.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct SearchBar: View {
+    @Binding var searchedText: String
+    @State private var isEditing = false
+    
+    var body: some View {
+        HStack {
+            TextField("Search ...", text: $searchedText)
+                .padding(.horizontal, 45)
+                .padding(.vertical, 10)
+                .background(Color(.systemGray6).cornerRadius(10))
+                .overlay(overlay, alignment: .leading)
+            
+            
+            if isEditing {
+                cancel
+                    .transition(.move(edge: .trailing))
+            }
+        }
+        .padding(.horizontal)
+        .onTapGesture {
+            withAnimation {
+                self.isEditing = true
+            }
+        }
+    }
+    
+    var overlay: some View {
+        Image(systemName: "magnifyingglass")
+            .opacity(0.2)
+            .padding(.leading)
+    }
+    
+    var cancel: some View {
+        Button(action: {
+            withAnimation {
+            self.searchedText = ""
+            self.isEditing = false
+            // Force hide keyboard
+            UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
+            }
+        }) {
+            Text("Cancel")
+        }
+    }
+}
+
+struct SearchBar_Previews: PreviewProvider {
+    static var previews: some View {
+        VStack {
+            SearchBar(searchedText: .constant(""))
+            Spacer()
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/UI/Settings.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,50 @@
+//
+//  Settings.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+import CoreData
+
+struct Settings: View {
+    @Environment(\.managedObjectContext) private var moc
+    @FetchRequest(entity: UserSettings.entity(), sortDescriptors: []) var userSettings: FetchedResults<UserSettings>
+    @State var theme = ""
+
+    var body: some View {
+        NavigationView {
+            Form {
+                Picker("Themes", selection: $theme) {
+                    ForEach(themes, id: \.name) { theme in
+                        Text(theme.name)
+                            .tag(theme.name)
+                    }
+                }
+                .onChange(of: theme, perform: { theme in
+                    save(change: theme)
+                })
+            }
+            .navigationTitle("Settings 👨🏻‍🔧")
+        }
+    }
+    
+    private func save(change: Any) {
+        let userSettings = UserSettings(context: moc)
+        userSettings.theme = change as! String
+        do {
+            try moc.save()
+            print("Core Data saved")
+        } catch {
+            print(error.localizedDescription)
+        }
+    }
+}
+
+
+struct Settings_Previews: PreviewProvider {
+    static var previews: some View {
+        return Settings()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LazyBear/UI/Watchlist.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,44 @@
+//
+//  Watchlist.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+
+import SwiftUI
+
+struct Watchlist: View {
+    @Environment(\.managedObjectContext) private var moc
+    @FetchRequest(entity: Company.entity(), sortDescriptors: []) var companies: FetchedResults<Company>
+    
+    var body: some View {
+        NavigationView {
+            List {
+                ForEach(companies, id: \.cik) { company in
+                    Row(baseText: company.symbol, subText: company.name)
+                }
+                .onDelete(perform: removeCompany)
+            }
+            .navigationTitle("Watchlist 👀")
+            .toolbar {
+                ToolbarItem(placement: .navigationBarTrailing) {
+                    EditButton()
+                }
+            }
+        }
+    }
+    
+    private func removeCompany(at offsets: IndexSet) {
+        for index in offsets {
+            let company = companies[index]
+            moc.delete(company)
+        }
+        try? moc.save()
+    }
+}
+
+struct Watchlist_Previews: PreviewProvider {
+    static var previews: some View {
+        Watchlist()
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UserSettings+CoreDataClass.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,15 @@
+//
+//  UserSettings+CoreDataClass.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+//
+
+import Foundation
+import CoreData
+
+@objc(UserSettings)
+public class UserSettings: NSManagedObject {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UserSettings+CoreDataProperties.swift	Fri Feb 19 20:25:06 2021 +0100
@@ -0,0 +1,26 @@
+//
+//  UserSettings+CoreDataProperties.swift
+//  LazyBear
+//
+//  Created by Dennis Concepción Martín on 19/2/21.
+//
+//
+
+import Foundation
+import CoreData
+
+
+extension UserSettings {
+
+    @nonobjc public class func fetchRequest() -> NSFetchRequest<UserSettings> {
+        return NSFetchRequest<UserSettings>(entityName: "UserSettings")
+    }
+
+    @NSManaged public var appIcon: String?
+    @NSManaged public var theme: String?
+
+}
+
+extension UserSettings : Identifiable {
+
+}