Mercurial > public > lazybear
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 { + +}