├── Image ├── AppPriview └── Final Github Image.jpg ├── Taskey ├── Assets.xcassets │ ├── Contents.json │ ├── pic.imageset │ │ ├── pic2.png │ │ └── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── side.imageset │ │ ├── Contents.json │ │ └── Group 1.pdf │ ├── back.imageset │ │ ├── Contents.json │ │ └── Background (1).pdf │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── Model │ ├── App+CoreDataClass.swift │ ├── Reminder+CoreDataClass.swift │ ├── Reminder+CoreDataProperties.swift │ └── App+CoreDataProperties.swift ├── Taskey.xcdatamodeld │ ├── .xccurrentversion │ └── Taskey.xcdatamodel │ │ └── contents ├── Extension │ └── ViewExtension.swift ├── Helper │ └── ImagePicker.swift ├── Base.lproj │ └── LaunchScreen.storyboard ├── Info.plist ├── View │ ├── SearchView.swift │ ├── AddReminderView.swift │ ├── AppInfoView.swift │ └── ContentView.swift ├── SceneDelegate.swift └── AppDelegate.swift ├── Taskey.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ └── mohammadyasir.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved ├── xcuserdata │ └── mohammadyasir.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ └── xcschememanagement.plist └── project.pbxproj ├── README.md └── LICENSE /Image/AppPriview: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Image/Final Github Image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/App-Lobby/Taskey/HEAD/Image/Final Github Image.jpg -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/pic.imageset/pic2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/App-Lobby/Taskey/HEAD/Taskey/Assets.xcassets/pic.imageset/pic2.png -------------------------------------------------------------------------------- /Taskey/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Taskey.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Taskey.xcodeproj/xcuserdata/mohammadyasir.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /Taskey.xcodeproj/project.xcworkspace/xcuserdata/mohammadyasir.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/App-Lobby/Taskey/HEAD/Taskey.xcodeproj/project.xcworkspace/xcuserdata/mohammadyasir.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Taskey/Model/App+CoreDataClass.swift: -------------------------------------------------------------------------------- 1 | // 2 | // App+CoreDataClass.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | // 8 | 9 | import Foundation 10 | import CoreData 11 | 12 | @objc(App) 13 | public class App: NSManagedObject { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Taskey/Model/Reminder+CoreDataClass.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Reminder+CoreDataClass.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | // 8 | 9 | import Foundation 10 | import CoreData 11 | 12 | @objc(Reminder) 13 | public class Reminder: NSManagedObject { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Taskey/Taskey.xcdatamodeld/.xccurrentversion: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | _XCCurrentVersionName 6 | Taskey.xcdatamodel 7 | 8 | 9 | -------------------------------------------------------------------------------- /Taskey.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Taskey/Extension/ViewExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewExtension.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import SwiftUI 9 | import UIKit 10 | 11 | #if canImport(UIKit) 12 | extension View { 13 | func hideKeyboard() { 14 | UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) 15 | } 16 | } 17 | #endif 18 | -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/pic.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "pic2.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/side.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "Group 1.pdf", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "Background (1).pdf", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Taskey.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "SwiftUICharts", 6 | "repositoryURL": "https://github.com/AppPear/ChartView", 7 | "state": { 8 | "branch": null, 9 | "revision": "9115a992c91fa19cbb4f2241084240d38654a1fc", 10 | "version": "1.5.5" 11 | } 12 | } 13 | ] 14 | }, 15 | "version": 1 16 | } 17 | -------------------------------------------------------------------------------- /Taskey.xcodeproj/xcuserdata/mohammadyasir.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Taskey.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Taskey 🚀 2 | 3 | ![](Image/Final%20Github%20Image.jpg) 4 | 5 | 6 | # What is Taskey 🤔 ? 7 | 8 | Taskey is an application build in SwiftUI to track your task with a beautiful animations and UI . Also used core data to persist the data in local with a 9 | customize data model . 10 | 11 | # Tech Stack 🥞 12 | 13 | **SwiftUI** : Used to create animated and reactive UI
14 | **Core Data** : A Framework to persist the data in local
15 | **SwiftPackage** : I have used a Swift Package to show the chart , [link](https://github.com/AppPear/ChartView)
16 | 17 | # LICENSE 📄 18 | 19 | Taskey is released under the [MIT license](LICENSE). See LICENSE for details. 20 | -------------------------------------------------------------------------------- /Taskey/Model/Reminder+CoreDataProperties.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Reminder+CoreDataProperties.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | // 8 | 9 | import Foundation 10 | import CoreData 11 | 12 | 13 | extension Reminder { 14 | 15 | @nonobjc public class func fetchRequest() -> NSFetchRequest { 16 | return NSFetchRequest(entityName: "Reminder") 17 | } 18 | 19 | @NSManaged public var title: String? 20 | @NSManaged public var isCompleted: Bool 21 | @NSManaged public var id: UUID? 22 | @NSManaged public var createdAt: Date? 23 | @NSManaged public var app: App? 24 | 25 | } 26 | 27 | extension Reminder : Identifiable { 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "scale" : "1x", 46 | "size" : "1024x1024" 47 | } 48 | ], 49 | "info" : { 50 | "author" : "xcode", 51 | "version" : 1 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Mohammad Yasir 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Taskey/Model/App+CoreDataProperties.swift: -------------------------------------------------------------------------------- 1 | // 2 | // App+CoreDataProperties.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | // 8 | 9 | import Foundation 10 | import CoreData 11 | 12 | 13 | extension App { 14 | 15 | @nonobjc public class func fetchRequest() -> NSFetchRequest { 16 | return NSFetchRequest(entityName: "App") 17 | } 18 | 19 | @NSManaged public var firstName: String? 20 | @NSManaged public var lastName: String? 21 | @NSManaged public var profilePhoto: Data? 22 | @NSManaged public var createdAt: Date 23 | @NSManaged public var reminder: NSSet? 24 | 25 | } 26 | 27 | // MARK: Generated accessors for reminder 28 | extension App { 29 | 30 | @objc(addReminderObject:) 31 | @NSManaged public func addToReminder(_ value: Reminder) 32 | 33 | @objc(removeReminderObject:) 34 | @NSManaged public func removeFromReminder(_ value: Reminder) 35 | 36 | @objc(addReminder:) 37 | @NSManaged public func addToReminder(_ values: NSSet) 38 | 39 | @objc(removeReminder:) 40 | @NSManaged public func removeFromReminder(_ values: NSSet) 41 | 42 | } 43 | 44 | extension App : Identifiable { 45 | 46 | } 47 | -------------------------------------------------------------------------------- /Taskey/Helper/ImagePicker.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImagePicker.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import Foundation 9 | import SwiftUI 10 | 11 | struct ImagePicker: UIViewControllerRepresentable { 12 | @Environment(\.presentationMode) var presentationMode 13 | @Binding var image: UIImage? 14 | 15 | func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIImagePickerController { 16 | let picker = UIImagePickerController() 17 | picker.delegate = context.coordinator 18 | return picker 19 | } 20 | 21 | func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext) { 22 | 23 | } 24 | 25 | class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate { 26 | let parent: ImagePicker 27 | 28 | init(_ parent: ImagePicker) { 29 | self.parent = parent 30 | } 31 | 32 | func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { 33 | if let uiImage = info[.originalImage] as? UIImage { 34 | parent.image = uiImage 35 | } 36 | 37 | parent.presentationMode.wrappedValue.dismiss() 38 | } 39 | } 40 | 41 | func makeCoordinator() -> Coordinator { 42 | Coordinator(self) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Taskey/Taskey.xcdatamodeld/Taskey.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Taskey/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Taskey/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | 37 | 38 | 39 | 40 | UIApplicationSupportsIndirectInputEvents 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | UISupportedInterfaceOrientations~ipad 55 | 56 | UIInterfaceOrientationPortrait 57 | UIInterfaceOrientationPortraitUpsideDown 58 | UIInterfaceOrientationLandscapeLeft 59 | UIInterfaceOrientationLandscapeRight 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Taskey/View/SearchView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchView.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SearchView: View { 11 | 12 | @Binding var searched : String 13 | @Binding var isSearching : Bool 14 | 15 | var body: some View { 16 | HStack { 17 | ZStack { 18 | Rectangle() 19 | .foregroundColor(Color(#colorLiteral(red: 0.8840993866, green: 0.9686274529, blue: 0.9401095322, alpha: 1)).opacity(0.5)) 20 | .cornerRadius(9) 21 | HStack { 22 | Image(systemName: "magnifyingglass") 23 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1))) 24 | TextField("Search ...", text: $searched , onEditingChanged: { (isBegin) in 25 | if isBegin { 26 | isSearching = true 27 | } else { 28 | isSearching = false 29 | } 30 | }).keyboardType(.webSearch) 31 | .foregroundColor(.black) 32 | 33 | if searched != "" { 34 | Button(action: { 35 | searched = "" 36 | }) { 37 | Image(systemName: "xmark.circle.fill") 38 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1))) 39 | } 40 | 41 | } 42 | 43 | } 44 | .padding(.trailing , 8) 45 | .padding(.leading , 12) 46 | 47 | }.frame(width: nil, height: 38) 48 | .padding(.leading, 7) 49 | .padding(.top , 5) 50 | .animation(.easeInOut(duration: 0.3)) 51 | 52 | if isSearching { 53 | Button(action: { 54 | hideKeyboard() 55 | }) { 56 | Text("Cancel") 57 | } 58 | } 59 | 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Taskey/View/AddReminderView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AddReminderView.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct AddReminderView: View { 11 | 12 | @Environment(\.managedObjectContext) private var viewContext 13 | let screenSize = UIScreen.main.bounds 14 | @Binding var isShown: Bool 15 | @Binding var text: String 16 | 17 | var body: some View { 18 | 19 | VStack(spacing: 20) { 20 | Text("Message") 21 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 22 | .padding(.top , 10) 23 | ZStack { 24 | 25 | Rectangle() 26 | .foregroundColor(Color(#colorLiteral(red: 0.1494468771, green: 0.06504140199, blue: 0.2321173555, alpha: 1))) 27 | .cornerRadius(9) 28 | .shadow(color: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), radius: 2, x: 0.0, y: 0.0) 29 | 30 | TextField("Task Name", text: $text) 31 | .padding(.leading , 12) 32 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 33 | .disableAutocorrection(true) 34 | }.padding(.horizontal , 10) 35 | 36 | HStack(spacing: 40) { 37 | Button(action: { 38 | 39 | let newReminder = Reminder(context : viewContext) 40 | newReminder.title = text 41 | newReminder.isCompleted = false 42 | newReminder.id = UUID() 43 | newReminder.createdAt = Date() 44 | 45 | do { 46 | try viewContext.save() 47 | print("Reminder Saved") 48 | } catch { 49 | print(error.localizedDescription) 50 | } 51 | 52 | self.isShown.toggle() 53 | 54 | 55 | }, label: { 56 | Text("Done") 57 | }) 58 | Button("Cancel") { 59 | self.isShown = false 60 | } 61 | } 62 | .padding(.bottom , 10) 63 | } 64 | .padding(.horizontal , 10) 65 | .frame(width: screenSize.width * 0.7, height: screenSize.height / 5.5) 66 | .background( 67 | LinearGradient(gradient: Gradient(colors: [ Color(#colorLiteral(red: 0.03334418845, green: 0.02625126296, blue: 0.05201637493, alpha: 1)) , Color(#colorLiteral(red: 0.1494468771, green: 0.06504140199, blue: 0.2321173555, alpha: 1))]), startPoint: .topLeading, endPoint: .bottomTrailing) 68 | ) 69 | .clipShape(RoundedRectangle(cornerRadius: 20.0, style: .continuous)) 70 | .offset(y: isShown ? 0 : screenSize.height) 71 | .animation(.spring()) 72 | .shadow(color: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), radius: 3, x: 0.0, y: 0.0) 73 | 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Taskey/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import UIKit 9 | import SwiftUI 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 20 | 21 | // Get the managed object context from the shared persistent container. 22 | let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 23 | 24 | // Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath. 25 | // Add `@Environment(\.managedObjectContext)` in the views that will need the context. 26 | let contentView = ContentView().environment(\.managedObjectContext, context) 27 | 28 | // Use a UIHostingController as window root view controller. 29 | if let windowScene = scene as? UIWindowScene { 30 | let window = UIWindow(windowScene: windowScene) 31 | window.rootViewController = UIHostingController(rootView: contentView) 32 | self.window = window 33 | window.makeKeyAndVisible() 34 | } 35 | } 36 | 37 | func sceneDidDisconnect(_ scene: UIScene) { 38 | // Called as the scene is being released by the system. 39 | // This occurs shortly after the scene enters the background, or when its session is discarded. 40 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 41 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). 42 | } 43 | 44 | func sceneDidBecomeActive(_ scene: UIScene) { 45 | // Called when the scene has moved from an inactive state to an active state. 46 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 47 | } 48 | 49 | func sceneWillResignActive(_ scene: UIScene) { 50 | // Called when the scene will move from an active state to an inactive state. 51 | // This may occur due to temporary interruptions (ex. an incoming phone call). 52 | } 53 | 54 | func sceneWillEnterForeground(_ scene: UIScene) { 55 | // Called as the scene transitions from the background to the foreground. 56 | // Use this method to undo the changes made on entering the background. 57 | } 58 | 59 | func sceneDidEnterBackground(_ scene: UIScene) { 60 | // Called as the scene transitions from the foreground to the background. 61 | // Use this method to save data, release shared resources, and store enough scene-specific state information 62 | // to restore the scene back to its current state. 63 | 64 | // Save changes in the application's managed object context when the application transitions to the background. 65 | (UIApplication.shared.delegate as? AppDelegate)?.saveContext() 66 | } 67 | 68 | 69 | } 70 | 71 | -------------------------------------------------------------------------------- /Taskey/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import UIKit 9 | import CoreData 10 | 11 | @main 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | // MARK: - Core Data stack 36 | 37 | lazy var persistentContainer: NSPersistentContainer = { 38 | /* 39 | The persistent container for the application. This implementation 40 | creates and returns a container, having loaded the store for the 41 | application to it. This property is optional since there are legitimate 42 | error conditions that could cause the creation of the store to fail. 43 | */ 44 | let container = NSPersistentContainer(name: "Taskey") 45 | container.loadPersistentStores(completionHandler: { (storeDescription, error) in 46 | if let error = error as NSError? { 47 | // Replace this implementation with code to handle the error appropriately. 48 | // 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. 49 | 50 | /* 51 | Typical reasons for an error here include: 52 | * The parent directory does not exist, cannot be created, or disallows writing. 53 | * The persistent store is not accessible, due to permissions or data protection when the device is locked. 54 | * The device is out of space. 55 | * The store could not be migrated to the current model version. 56 | Check the error message to determine what the actual problem was. 57 | */ 58 | fatalError("Unresolved error \(error), \(error.userInfo)") 59 | } 60 | }) 61 | return container 62 | }() 63 | 64 | // MARK: - Core Data Saving support 65 | 66 | func saveContext () { 67 | let context = persistentContainer.viewContext 68 | if context.hasChanges { 69 | do { 70 | try context.save() 71 | } catch { 72 | // Replace this implementation with code to handle the error appropriately. 73 | // 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. 74 | let nserror = error as NSError 75 | fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 76 | } 77 | } 78 | } 79 | 80 | } 81 | 82 | -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/back.imageset/Background (1).pdf: -------------------------------------------------------------------------------- 1 | %PDF-1.7 2 | 3 | 1 0 obj 4 | << /Length 2 0 R 5 | /FunctionType 4 6 | /Domain [ 0.000000 1.000000 ] 7 | /Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ] 8 | >> 9 | stream 10 | { 0.341667 exch 0.241667 exch 0.666667 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub -0.314722 mul 0.341667 add exch dup 0.000000 sub -0.226944 mul 0.241667 add exch dup 0.000000 sub -0.600000 mul 0.666667 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.026944 exch 0.014722 exch 0.066667 exch } if pop } 11 | endstream 12 | endobj 13 | 14 | 2 0 obj 15 | 339 16 | endobj 17 | 18 | 3 0 obj 19 | << /Length 4 0 R 20 | /FunctionType 4 21 | /Domain [ 0.000000 1.000000 ] 22 | /Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ] 23 | >> 24 | stream 25 | { 0.180453 exch 0.138542 exch 0.316667 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub -0.440915 mul 0.180453 add exch dup 0.000000 sub -0.335758 mul 0.138542 add exch dup 0.000000 sub -0.703030 mul 0.316667 add exch } if dup 0.343750 gt { exch pop exch pop exch pop 0.028889 exch 0.023125 exch 0.075000 exch } if pop } 26 | endstream 27 | endobj 28 | 29 | 4 0 obj 30 | 339 31 | endobj 32 | 33 | 5 0 obj 34 | << /Pattern << /P2 << /Matrix [ 115.588242 -89.294128 89.294128 115.588242 -140.693649 -55.227707 ] 35 | /Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ] 36 | /Extend [ true true ] 37 | /Domain [ 0.000000 1.000000 ] 38 | /ShadingType 2 39 | /ColorSpace /DeviceRGB 40 | /Function 1 0 R 41 | >> 42 | /PatternType 2 43 | /Type /Pattern 44 | >> 45 | /P1 << /Matrix [ 352.500000 -784.500000 784.500000 352.500000 -770.439453 428.207886 ] 46 | /Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ] 47 | /Extend [ true true ] 48 | /Domain [ 0.000000 1.000000 ] 49 | /ShadingType 2 50 | /ColorSpace /DeviceRGB 51 | /Function 3 0 R 52 | >> 53 | /PatternType 2 54 | /Type /Pattern 55 | >> 56 | >> >> 57 | endobj 58 | 59 | 6 0 obj 60 | << /Length 7 0 R >> 61 | stream 62 | /DeviceRGB CS 63 | /DeviceRGB cs 64 | q 65 | 1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm 66 | /Pattern cs 67 | /P1 scn 68 | 0.000000 812.000000 m 69 | 375.000000 812.000000 l 70 | 375.000000 0.000000 l 71 | 0.000000 0.000000 l 72 | 0.000000 812.000000 l 73 | h 74 | f 75 | n 76 | Q 77 | q 78 | 1.000000 0.000000 -0.000000 1.000000 -82.000000 -72.000000 cm 79 | /Pattern cs 80 | /P2 scn 81 | 156.000000 78.000000 m 82 | 156.000000 34.921791 121.078209 0.000000 78.000000 0.000000 c 83 | 34.921791 0.000000 0.000000 34.921791 0.000000 78.000000 c 84 | 0.000000 121.078209 34.921791 156.000000 78.000000 156.000000 c 85 | 121.078209 156.000000 156.000000 121.078209 156.000000 78.000000 c 86 | h 87 | f 88 | n 89 | Q 90 | 91 | endstream 92 | endobj 93 | 94 | 7 0 obj 95 | 593 96 | endobj 97 | 98 | 8 0 obj 99 | << /Annots [] 100 | /Type /Page 101 | /MediaBox [ 0.000000 0.000000 375.000000 812.000000 ] 102 | /Resources 5 0 R 103 | /Contents 6 0 R 104 | /Parent 9 0 R 105 | >> 106 | endobj 107 | 108 | 9 0 obj 109 | << /Kids [ 8 0 R ] 110 | /Count 1 111 | /Type /Pages 112 | >> 113 | endobj 114 | 115 | 10 0 obj 116 | << /Type /Catalog 117 | /Pages 9 0 R 118 | >> 119 | endobj 120 | 121 | xref 122 | 0 11 123 | 0000000000 65535 f 124 | 0000000010 00000 n 125 | 0000000533 00000 n 126 | 0000000555 00000 n 127 | 0000001078 00000 n 128 | 0000001100 00000 n 129 | 0000002358 00000 n 130 | 0000003007 00000 n 131 | 0000003029 00000 n 132 | 0000003204 00000 n 133 | 0000003278 00000 n 134 | trailer 135 | << /ID [ (some) (id) ] 136 | /Root 10 0 R 137 | /Size 11 138 | >> 139 | startxref 140 | 3338 141 | %%EOF -------------------------------------------------------------------------------- /Taskey/Assets.xcassets/side.imageset/Group 1.pdf: -------------------------------------------------------------------------------- 1 | %PDF-1.7 2 | 3 | 1 0 obj 4 | << /ExtGState << /E2 << /ca 0.600000 >> 5 | /E1 << /ca 0.600000 >> 6 | >> >> 7 | endobj 8 | 9 | 2 0 obj 10 | << /Length 3 0 R >> 11 | stream 12 | /DeviceRGB CS 13 | /DeviceRGB cs 14 | q 15 | q 16 | /E1 gs 17 | 1.000000 0.000000 -0.000000 1.000000 0.000000 8.000000 cm 18 | 0.768627 0.768627 0.768627 scn 19 | 0.000000 2.000000 m 20 | 25.000000 2.000000 l 21 | 25.000000 0.000000 l 22 | 0.000000 0.000000 l 23 | 0.000000 2.000000 l 24 | h 25 | f 26 | n 27 | Q 28 | 0.000000 10.000000 m 29 | 25.000000 10.000000 l 30 | 25.000000 8.000000 l 31 | 0.000000 8.000000 l 32 | 0.000000 10.000000 l 33 | h 34 | W* 35 | n 36 | q 37 | 1.000000 0.000000 -0.000000 1.000000 0.000000 8.000000 cm 38 | 1.000000 1.000000 1.000000 scn 39 | 0.000000 2.000000 m 40 | 0.000000 3.000000 l 41 | -1.000000 3.000000 l 42 | -1.000000 2.000000 l 43 | 0.000000 2.000000 l 44 | h 45 | 25.000000 2.000000 m 46 | 26.000000 2.000000 l 47 | 26.000000 3.000000 l 48 | 25.000000 3.000000 l 49 | 25.000000 2.000000 l 50 | h 51 | 25.000000 0.000000 m 52 | 25.000000 -1.000000 l 53 | 26.000000 -1.000000 l 54 | 26.000000 0.000000 l 55 | 25.000000 0.000000 l 56 | h 57 | 0.000000 0.000000 m 58 | -1.000000 0.000000 l 59 | -1.000000 -1.000000 l 60 | 0.000000 -1.000000 l 61 | 0.000000 0.000000 l 62 | h 63 | 0.000000 1.000000 m 64 | 25.000000 1.000000 l 65 | 25.000000 3.000000 l 66 | 0.000000 3.000000 l 67 | 0.000000 1.000000 l 68 | h 69 | 24.000000 2.000000 m 70 | 24.000000 0.000000 l 71 | 26.000000 0.000000 l 72 | 26.000000 2.000000 l 73 | 24.000000 2.000000 l 74 | h 75 | 25.000000 1.000000 m 76 | 0.000000 1.000000 l 77 | 0.000000 -1.000000 l 78 | 25.000000 -1.000000 l 79 | 25.000000 1.000000 l 80 | h 81 | 1.000000 0.000000 m 82 | 1.000000 2.000000 l 83 | -1.000000 2.000000 l 84 | -1.000000 0.000000 l 85 | 1.000000 0.000000 l 86 | h 87 | f 88 | n 89 | Q 90 | Q 91 | q 92 | q 93 | /E2 gs 94 | 1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm 95 | 0.768627 0.768627 0.768627 scn 96 | 0.000000 2.000000 m 97 | 25.000000 2.000000 l 98 | 25.000000 0.000000 l 99 | 0.000000 0.000000 l 100 | 0.000000 2.000000 l 101 | h 102 | f 103 | n 104 | Q 105 | 0.000000 2.000000 m 106 | 25.000000 2.000000 l 107 | 25.000000 0.000000 l 108 | 0.000000 0.000000 l 109 | 0.000000 2.000000 l 110 | h 111 | W* 112 | n 113 | q 114 | 1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm 115 | 1.000000 1.000000 1.000000 scn 116 | 0.000000 2.000000 m 117 | 0.000000 3.000000 l 118 | -1.000000 3.000000 l 119 | -1.000000 2.000000 l 120 | 0.000000 2.000000 l 121 | h 122 | 25.000000 2.000000 m 123 | 26.000000 2.000000 l 124 | 26.000000 3.000000 l 125 | 25.000000 3.000000 l 126 | 25.000000 2.000000 l 127 | h 128 | 25.000000 0.000000 m 129 | 25.000000 -1.000000 l 130 | 26.000000 -1.000000 l 131 | 26.000000 0.000000 l 132 | 25.000000 0.000000 l 133 | h 134 | 0.000000 0.000000 m 135 | -1.000000 0.000000 l 136 | -1.000000 -1.000000 l 137 | 0.000000 -1.000000 l 138 | 0.000000 0.000000 l 139 | h 140 | 0.000000 1.000000 m 141 | 25.000000 1.000000 l 142 | 25.000000 3.000000 l 143 | 0.000000 3.000000 l 144 | 0.000000 1.000000 l 145 | h 146 | 24.000000 2.000000 m 147 | 24.000000 0.000000 l 148 | 26.000000 0.000000 l 149 | 26.000000 2.000000 l 150 | 24.000000 2.000000 l 151 | h 152 | 25.000000 1.000000 m 153 | 0.000000 1.000000 l 154 | 0.000000 -1.000000 l 155 | 25.000000 -1.000000 l 156 | 25.000000 1.000000 l 157 | h 158 | 1.000000 0.000000 m 159 | 1.000000 2.000000 l 160 | -1.000000 2.000000 l 161 | -1.000000 0.000000 l 162 | 1.000000 0.000000 l 163 | h 164 | f 165 | n 166 | Q 167 | Q 168 | 169 | endstream 170 | endobj 171 | 172 | 3 0 obj 173 | 2563 174 | endobj 175 | 176 | 4 0 obj 177 | << /Annots [] 178 | /Type /Page 179 | /MediaBox [ 0.000000 0.000000 25.000000 10.000000 ] 180 | /Resources 1 0 R 181 | /Contents 2 0 R 182 | /Parent 5 0 R 183 | >> 184 | endobj 185 | 186 | 5 0 obj 187 | << /Kids [ 4 0 R ] 188 | /Count 1 189 | /Type /Pages 190 | >> 191 | endobj 192 | 193 | 6 0 obj 194 | << /Type /Catalog 195 | /Pages 5 0 R 196 | >> 197 | endobj 198 | 199 | xref 200 | 0 7 201 | 0000000000 65535 f 202 | 0000000010 00000 n 203 | 0000000132 00000 n 204 | 0000002751 00000 n 205 | 0000002774 00000 n 206 | 0000002947 00000 n 207 | 0000003021 00000 n 208 | trailer 209 | << /ID [ (some) (id) ] 210 | /Root 6 0 R 211 | /Size 7 212 | >> 213 | startxref 214 | 3080 215 | %%EOF -------------------------------------------------------------------------------- /Taskey/View/AppInfoView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppInfoView.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct AppInfoView : View { 11 | 12 | @Environment(\.managedObjectContext) private var viewContext 13 | let screenSize = UIScreen.main.bounds 14 | @Binding var isShown: Bool 15 | @Binding var firstName : String 16 | @Binding var lastName : String 17 | @Binding var showingImagePicker : Bool 18 | @Binding var inputImage : UIImage? 19 | 20 | var body: some View { 21 | 22 | VStack(spacing: 20) { 23 | Text("Enter Your Name") 24 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 25 | .padding(.top , 10) 26 | VStack { 27 | ZStack { 28 | Rectangle() 29 | .foregroundColor(Color(#colorLiteral(red: 0.1494468771, green: 0.06504140199, blue: 0.2321173555, alpha: 1))) 30 | .cornerRadius(9) 31 | .shadow(color: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), radius: 2, x: 0.0, y: 0.0) 32 | 33 | TextField("First Name", text: $firstName) 34 | .padding(.leading , 12) 35 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 36 | .disableAutocorrection(true) 37 | }.padding(.horizontal , 10) 38 | 39 | ZStack { 40 | Rectangle() 41 | .foregroundColor(Color(#colorLiteral(red: 0.1494468771, green: 0.06504140199, blue: 0.2321173555, alpha: 1))) 42 | .cornerRadius(9) 43 | .shadow(color: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), radius: 2, x: 0.0, y: 0.0) 44 | 45 | TextField("Last Name", text: $lastName) 46 | .padding(.leading , 12) 47 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 48 | .disableAutocorrection(true) 49 | }.padding(.horizontal , 10) 50 | 51 | Button(action: { 52 | showingImagePicker = true 53 | }, label: { 54 | ZStack { 55 | Rectangle() 56 | .foregroundColor(Color(#colorLiteral(red: 0.1494468771, green: 0.06504140199, blue: 0.2321173555, alpha: 1))) 57 | .cornerRadius(9) 58 | .shadow(color: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), radius: 2, x: 0.0, y: 0.0) 59 | 60 | HStack { 61 | 62 | Image(systemName : "photo") 63 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 64 | .font(.system(size: 16)) 65 | 66 | 67 | Text("Pick Image") 68 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 69 | .font(.system(size: 16)) 70 | } 71 | 72 | }.padding(.horizontal , 10) 73 | }) 74 | 75 | 76 | } 77 | .frame(height : 120) 78 | 79 | HStack(spacing: 40) { 80 | Button(action: { 81 | let new = App(context: viewContext) 82 | new.firstName = firstName 83 | new.lastName = lastName 84 | new.profilePhoto = inputImage?.pngData() 85 | new.createdAt = Date() 86 | 87 | do { 88 | try viewContext.save() 89 | print("Saved the App Name") 90 | } catch { 91 | print(error.localizedDescription) 92 | } 93 | 94 | self.isShown.toggle() 95 | 96 | }, label: { 97 | Text("Done") 98 | }) 99 | Button("Cancel") { 100 | self.isShown = false 101 | } 102 | } 103 | 104 | 105 | } 106 | .padding(.horizontal , 10) 107 | // .padding(.vertical , 10) 108 | .frame(width: screenSize.width * 0.7, height: screenSize.height / 4) 109 | .background( 110 | LinearGradient(gradient: Gradient(colors: [ Color(#colorLiteral(red: 0.03334418845, green: 0.02625126296, blue: 0.05201637493, alpha: 1)) , Color(#colorLiteral(red: 0.1494468771, green: 0.06504140199, blue: 0.2321173555, alpha: 1))]), startPoint: .topLeading, endPoint: .bottomTrailing) 111 | ) 112 | .clipShape(RoundedRectangle(cornerRadius: 20.0, style: .continuous)) 113 | .offset(y: isShown ? 0 : screenSize.height) 114 | .animation(.spring()) 115 | .shadow(color: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)), radius: 3, x: 0.0, y: 0.0) 116 | 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /Taskey.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 52; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 544465CE265B903A00FAC1CD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544465CD265B903A00FAC1CD /* AppDelegate.swift */; }; 11 | 544465D0265B903A00FAC1CD /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544465CF265B903A00FAC1CD /* SceneDelegate.swift */; }; 12 | 544465D2265B903A00FAC1CD /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544465D1265B903A00FAC1CD /* ContentView.swift */; }; 13 | 544465D5265B903A00FAC1CD /* Taskey.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 544465D3265B903A00FAC1CD /* Taskey.xcdatamodeld */; }; 14 | 544465D7265B903F00FAC1CD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 544465D6265B903F00FAC1CD /* Assets.xcassets */; }; 15 | 544465DA265B903F00FAC1CD /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 544465D9265B903F00FAC1CD /* Preview Assets.xcassets */; }; 16 | 544465DD265B903F00FAC1CD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 544465DB265B903F00FAC1CD /* LaunchScreen.storyboard */; }; 17 | 544465E8265B90DF00FAC1CD /* App+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544465E4265B90DF00FAC1CD /* App+CoreDataClass.swift */; }; 18 | 544465E9265B90DF00FAC1CD /* App+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544465E5265B90DF00FAC1CD /* App+CoreDataProperties.swift */; }; 19 | 544465EA265B90DF00FAC1CD /* Reminder+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544465E6265B90DF00FAC1CD /* Reminder+CoreDataClass.swift */; }; 20 | 544465EB265B90DF00FAC1CD /* Reminder+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544465E7265B90DF00FAC1CD /* Reminder+CoreDataProperties.swift */; }; 21 | 544465EE265B915700FAC1CD /* SwiftUICharts in Frameworks */ = {isa = PBXBuildFile; productRef = 544465ED265B915700FAC1CD /* SwiftUICharts */; }; 22 | 54AA4B46265BB8C9007948B6 /* ImagePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AA4B45265BB8C9007948B6 /* ImagePicker.swift */; }; 23 | 54AA4B48265BB900007948B6 /* AppInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AA4B47265BB900007948B6 /* AppInfoView.swift */; }; 24 | 54AA4B4A265BB928007948B6 /* AddReminderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AA4B49265BB927007948B6 /* AddReminderView.swift */; }; 25 | 54AA4B4D265BB956007948B6 /* ViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AA4B4C265BB956007948B6 /* ViewExtension.swift */; }; 26 | 54AA4B4F265BB975007948B6 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AA4B4E265BB975007948B6 /* SearchView.swift */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | 544465CA265B903A00FAC1CD /* Taskey.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Taskey.app; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | 544465CD265B903A00FAC1CD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 32 | 544465CF265B903A00FAC1CD /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 33 | 544465D1265B903A00FAC1CD /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 34 | 544465D4265B903A00FAC1CD /* Taskey.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Taskey.xcdatamodel; sourceTree = ""; }; 35 | 544465D6265B903F00FAC1CD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 36 | 544465D9265B903F00FAC1CD /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 37 | 544465DC265B903F00FAC1CD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 38 | 544465DE265B903F00FAC1CD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | 544465E4265B90DF00FAC1CD /* App+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "App+CoreDataClass.swift"; sourceTree = ""; }; 40 | 544465E5265B90DF00FAC1CD /* App+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "App+CoreDataProperties.swift"; sourceTree = ""; }; 41 | 544465E6265B90DF00FAC1CD /* Reminder+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Reminder+CoreDataClass.swift"; sourceTree = ""; }; 42 | 544465E7265B90DF00FAC1CD /* Reminder+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Reminder+CoreDataProperties.swift"; sourceTree = ""; }; 43 | 54AA4B45265BB8C9007948B6 /* ImagePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImagePicker.swift; sourceTree = ""; }; 44 | 54AA4B47265BB900007948B6 /* AppInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfoView.swift; sourceTree = ""; }; 45 | 54AA4B49265BB927007948B6 /* AddReminderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddReminderView.swift; sourceTree = ""; }; 46 | 54AA4B4C265BB956007948B6 /* ViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewExtension.swift; sourceTree = ""; }; 47 | 54AA4B4E265BB975007948B6 /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = ""; }; 48 | /* End PBXFileReference section */ 49 | 50 | /* Begin PBXFrameworksBuildPhase section */ 51 | 544465C7265B903A00FAC1CD /* Frameworks */ = { 52 | isa = PBXFrameworksBuildPhase; 53 | buildActionMask = 2147483647; 54 | files = ( 55 | 544465EE265B915700FAC1CD /* SwiftUICharts in Frameworks */, 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | /* End PBXFrameworksBuildPhase section */ 60 | 61 | /* Begin PBXGroup section */ 62 | 544465C1265B903A00FAC1CD = { 63 | isa = PBXGroup; 64 | children = ( 65 | 544465CC265B903A00FAC1CD /* Taskey */, 66 | 544465CB265B903A00FAC1CD /* Products */, 67 | ); 68 | sourceTree = ""; 69 | }; 70 | 544465CB265B903A00FAC1CD /* Products */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | 544465CA265B903A00FAC1CD /* Taskey.app */, 74 | ); 75 | name = Products; 76 | sourceTree = ""; 77 | }; 78 | 544465CC265B903A00FAC1CD /* Taskey */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 54AA4B42265BB54D007948B6 /* Model */, 82 | 54AA4B43265BB55C007948B6 /* View */, 83 | 54AA4B44265BB8B9007948B6 /* Helper */, 84 | 54AA4B4B265BB944007948B6 /* Extension */, 85 | 544465CD265B903A00FAC1CD /* AppDelegate.swift */, 86 | 544465CF265B903A00FAC1CD /* SceneDelegate.swift */, 87 | 544465D6265B903F00FAC1CD /* Assets.xcassets */, 88 | 544465DB265B903F00FAC1CD /* LaunchScreen.storyboard */, 89 | 544465DE265B903F00FAC1CD /* Info.plist */, 90 | 544465D3265B903A00FAC1CD /* Taskey.xcdatamodeld */, 91 | 544465D8265B903F00FAC1CD /* Preview Content */, 92 | ); 93 | path = Taskey; 94 | sourceTree = ""; 95 | }; 96 | 544465D8265B903F00FAC1CD /* Preview Content */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 544465D9265B903F00FAC1CD /* Preview Assets.xcassets */, 100 | ); 101 | path = "Preview Content"; 102 | sourceTree = ""; 103 | }; 104 | 54AA4B42265BB54D007948B6 /* Model */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 544465E4265B90DF00FAC1CD /* App+CoreDataClass.swift */, 108 | 544465E5265B90DF00FAC1CD /* App+CoreDataProperties.swift */, 109 | 544465E6265B90DF00FAC1CD /* Reminder+CoreDataClass.swift */, 110 | 544465E7265B90DF00FAC1CD /* Reminder+CoreDataProperties.swift */, 111 | ); 112 | path = Model; 113 | sourceTree = ""; 114 | }; 115 | 54AA4B43265BB55C007948B6 /* View */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 544465D1265B903A00FAC1CD /* ContentView.swift */, 119 | 54AA4B4E265BB975007948B6 /* SearchView.swift */, 120 | 54AA4B49265BB927007948B6 /* AddReminderView.swift */, 121 | 54AA4B47265BB900007948B6 /* AppInfoView.swift */, 122 | ); 123 | path = View; 124 | sourceTree = ""; 125 | }; 126 | 54AA4B44265BB8B9007948B6 /* Helper */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 54AA4B45265BB8C9007948B6 /* ImagePicker.swift */, 130 | ); 131 | path = Helper; 132 | sourceTree = ""; 133 | }; 134 | 54AA4B4B265BB944007948B6 /* Extension */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 54AA4B4C265BB956007948B6 /* ViewExtension.swift */, 138 | ); 139 | path = Extension; 140 | sourceTree = ""; 141 | }; 142 | /* End PBXGroup section */ 143 | 144 | /* Begin PBXNativeTarget section */ 145 | 544465C9265B903A00FAC1CD /* Taskey */ = { 146 | isa = PBXNativeTarget; 147 | buildConfigurationList = 544465E1265B903F00FAC1CD /* Build configuration list for PBXNativeTarget "Taskey" */; 148 | buildPhases = ( 149 | 544465C6265B903A00FAC1CD /* Sources */, 150 | 544465C7265B903A00FAC1CD /* Frameworks */, 151 | 544465C8265B903A00FAC1CD /* Resources */, 152 | ); 153 | buildRules = ( 154 | ); 155 | dependencies = ( 156 | ); 157 | name = Taskey; 158 | packageProductDependencies = ( 159 | 544465ED265B915700FAC1CD /* SwiftUICharts */, 160 | ); 161 | productName = Taskey; 162 | productReference = 544465CA265B903A00FAC1CD /* Taskey.app */; 163 | productType = "com.apple.product-type.application"; 164 | }; 165 | /* End PBXNativeTarget section */ 166 | 167 | /* Begin PBXProject section */ 168 | 544465C2265B903A00FAC1CD /* Project object */ = { 169 | isa = PBXProject; 170 | attributes = { 171 | LastSwiftUpdateCheck = 1250; 172 | LastUpgradeCheck = 1250; 173 | TargetAttributes = { 174 | 544465C9265B903A00FAC1CD = { 175 | CreatedOnToolsVersion = 12.5; 176 | }; 177 | }; 178 | }; 179 | buildConfigurationList = 544465C5265B903A00FAC1CD /* Build configuration list for PBXProject "Taskey" */; 180 | compatibilityVersion = "Xcode 9.3"; 181 | developmentRegion = en; 182 | hasScannedForEncodings = 0; 183 | knownRegions = ( 184 | en, 185 | Base, 186 | ); 187 | mainGroup = 544465C1265B903A00FAC1CD; 188 | packageReferences = ( 189 | 544465EC265B915700FAC1CD /* XCRemoteSwiftPackageReference "ChartView" */, 190 | ); 191 | productRefGroup = 544465CB265B903A00FAC1CD /* Products */; 192 | projectDirPath = ""; 193 | projectRoot = ""; 194 | targets = ( 195 | 544465C9265B903A00FAC1CD /* Taskey */, 196 | ); 197 | }; 198 | /* End PBXProject section */ 199 | 200 | /* Begin PBXResourcesBuildPhase section */ 201 | 544465C8265B903A00FAC1CD /* Resources */ = { 202 | isa = PBXResourcesBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | 544465DD265B903F00FAC1CD /* LaunchScreen.storyboard in Resources */, 206 | 544465DA265B903F00FAC1CD /* Preview Assets.xcassets in Resources */, 207 | 544465D7265B903F00FAC1CD /* Assets.xcassets in Resources */, 208 | ); 209 | runOnlyForDeploymentPostprocessing = 0; 210 | }; 211 | /* End PBXResourcesBuildPhase section */ 212 | 213 | /* Begin PBXSourcesBuildPhase section */ 214 | 544465C6265B903A00FAC1CD /* Sources */ = { 215 | isa = PBXSourcesBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | 544465D5265B903A00FAC1CD /* Taskey.xcdatamodeld in Sources */, 219 | 544465CE265B903A00FAC1CD /* AppDelegate.swift in Sources */, 220 | 544465E8265B90DF00FAC1CD /* App+CoreDataClass.swift in Sources */, 221 | 54AA4B46265BB8C9007948B6 /* ImagePicker.swift in Sources */, 222 | 54AA4B48265BB900007948B6 /* AppInfoView.swift in Sources */, 223 | 544465E9265B90DF00FAC1CD /* App+CoreDataProperties.swift in Sources */, 224 | 54AA4B4D265BB956007948B6 /* ViewExtension.swift in Sources */, 225 | 544465EA265B90DF00FAC1CD /* Reminder+CoreDataClass.swift in Sources */, 226 | 54AA4B4F265BB975007948B6 /* SearchView.swift in Sources */, 227 | 54AA4B4A265BB928007948B6 /* AddReminderView.swift in Sources */, 228 | 544465D0265B903A00FAC1CD /* SceneDelegate.swift in Sources */, 229 | 544465D2265B903A00FAC1CD /* ContentView.swift in Sources */, 230 | 544465EB265B90DF00FAC1CD /* Reminder+CoreDataProperties.swift in Sources */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | /* End PBXSourcesBuildPhase section */ 235 | 236 | /* Begin PBXVariantGroup section */ 237 | 544465DB265B903F00FAC1CD /* LaunchScreen.storyboard */ = { 238 | isa = PBXVariantGroup; 239 | children = ( 240 | 544465DC265B903F00FAC1CD /* Base */, 241 | ); 242 | name = LaunchScreen.storyboard; 243 | sourceTree = ""; 244 | }; 245 | /* End PBXVariantGroup section */ 246 | 247 | /* Begin XCBuildConfiguration section */ 248 | 544465DF265B903F00FAC1CD /* Debug */ = { 249 | isa = XCBuildConfiguration; 250 | buildSettings = { 251 | ALWAYS_SEARCH_USER_PATHS = NO; 252 | CLANG_ANALYZER_NONNULL = YES; 253 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 254 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 255 | CLANG_CXX_LIBRARY = "libc++"; 256 | CLANG_ENABLE_MODULES = YES; 257 | CLANG_ENABLE_OBJC_ARC = YES; 258 | CLANG_ENABLE_OBJC_WEAK = YES; 259 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 260 | CLANG_WARN_BOOL_CONVERSION = YES; 261 | CLANG_WARN_COMMA = YES; 262 | CLANG_WARN_CONSTANT_CONVERSION = YES; 263 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 264 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 265 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 266 | CLANG_WARN_EMPTY_BODY = YES; 267 | CLANG_WARN_ENUM_CONVERSION = YES; 268 | CLANG_WARN_INFINITE_RECURSION = YES; 269 | CLANG_WARN_INT_CONVERSION = YES; 270 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 271 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 272 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 273 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 274 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 275 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 276 | CLANG_WARN_STRICT_PROTOTYPES = YES; 277 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 278 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 279 | CLANG_WARN_UNREACHABLE_CODE = YES; 280 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 281 | COPY_PHASE_STRIP = NO; 282 | DEBUG_INFORMATION_FORMAT = dwarf; 283 | ENABLE_STRICT_OBJC_MSGSEND = YES; 284 | ENABLE_TESTABILITY = YES; 285 | GCC_C_LANGUAGE_STANDARD = gnu11; 286 | GCC_DYNAMIC_NO_PIC = NO; 287 | GCC_NO_COMMON_BLOCKS = YES; 288 | GCC_OPTIMIZATION_LEVEL = 0; 289 | GCC_PREPROCESSOR_DEFINITIONS = ( 290 | "DEBUG=1", 291 | "$(inherited)", 292 | ); 293 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 294 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 295 | GCC_WARN_UNDECLARED_SELECTOR = YES; 296 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 297 | GCC_WARN_UNUSED_FUNCTION = YES; 298 | GCC_WARN_UNUSED_VARIABLE = YES; 299 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 300 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 301 | MTL_FAST_MATH = YES; 302 | ONLY_ACTIVE_ARCH = YES; 303 | SDKROOT = iphoneos; 304 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 305 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 306 | }; 307 | name = Debug; 308 | }; 309 | 544465E0265B903F00FAC1CD /* Release */ = { 310 | isa = XCBuildConfiguration; 311 | buildSettings = { 312 | ALWAYS_SEARCH_USER_PATHS = NO; 313 | CLANG_ANALYZER_NONNULL = YES; 314 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 316 | CLANG_CXX_LIBRARY = "libc++"; 317 | CLANG_ENABLE_MODULES = YES; 318 | CLANG_ENABLE_OBJC_ARC = YES; 319 | CLANG_ENABLE_OBJC_WEAK = YES; 320 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 321 | CLANG_WARN_BOOL_CONVERSION = YES; 322 | CLANG_WARN_COMMA = YES; 323 | CLANG_WARN_CONSTANT_CONVERSION = YES; 324 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 325 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 326 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 327 | CLANG_WARN_EMPTY_BODY = YES; 328 | CLANG_WARN_ENUM_CONVERSION = YES; 329 | CLANG_WARN_INFINITE_RECURSION = YES; 330 | CLANG_WARN_INT_CONVERSION = YES; 331 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 332 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 333 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 334 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 335 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 336 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 337 | CLANG_WARN_STRICT_PROTOTYPES = YES; 338 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 339 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 340 | CLANG_WARN_UNREACHABLE_CODE = YES; 341 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 342 | COPY_PHASE_STRIP = NO; 343 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 344 | ENABLE_NS_ASSERTIONS = NO; 345 | ENABLE_STRICT_OBJC_MSGSEND = YES; 346 | GCC_C_LANGUAGE_STANDARD = gnu11; 347 | GCC_NO_COMMON_BLOCKS = YES; 348 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 349 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 350 | GCC_WARN_UNDECLARED_SELECTOR = YES; 351 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 352 | GCC_WARN_UNUSED_FUNCTION = YES; 353 | GCC_WARN_UNUSED_VARIABLE = YES; 354 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 355 | MTL_ENABLE_DEBUG_INFO = NO; 356 | MTL_FAST_MATH = YES; 357 | SDKROOT = iphoneos; 358 | SWIFT_COMPILATION_MODE = wholemodule; 359 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 360 | VALIDATE_PRODUCT = YES; 361 | }; 362 | name = Release; 363 | }; 364 | 544465E2265B903F00FAC1CD /* Debug */ = { 365 | isa = XCBuildConfiguration; 366 | buildSettings = { 367 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 368 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 369 | CODE_SIGN_STYLE = Automatic; 370 | DEVELOPMENT_ASSET_PATHS = "\"Taskey/Preview Content\""; 371 | ENABLE_PREVIEWS = YES; 372 | INFOPLIST_FILE = Taskey/Info.plist; 373 | LD_RUNPATH_SEARCH_PATHS = ( 374 | "$(inherited)", 375 | "@executable_path/Frameworks", 376 | ); 377 | PRODUCT_BUNDLE_IDENTIFIER = com.MohammadYasir.Taskey; 378 | PRODUCT_NAME = "$(TARGET_NAME)"; 379 | SWIFT_VERSION = 5.0; 380 | TARGETED_DEVICE_FAMILY = "1,2"; 381 | }; 382 | name = Debug; 383 | }; 384 | 544465E3265B903F00FAC1CD /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 388 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 389 | CODE_SIGN_STYLE = Automatic; 390 | DEVELOPMENT_ASSET_PATHS = "\"Taskey/Preview Content\""; 391 | ENABLE_PREVIEWS = YES; 392 | INFOPLIST_FILE = Taskey/Info.plist; 393 | LD_RUNPATH_SEARCH_PATHS = ( 394 | "$(inherited)", 395 | "@executable_path/Frameworks", 396 | ); 397 | PRODUCT_BUNDLE_IDENTIFIER = com.MohammadYasir.Taskey; 398 | PRODUCT_NAME = "$(TARGET_NAME)"; 399 | SWIFT_VERSION = 5.0; 400 | TARGETED_DEVICE_FAMILY = "1,2"; 401 | }; 402 | name = Release; 403 | }; 404 | /* End XCBuildConfiguration section */ 405 | 406 | /* Begin XCConfigurationList section */ 407 | 544465C5265B903A00FAC1CD /* Build configuration list for PBXProject "Taskey" */ = { 408 | isa = XCConfigurationList; 409 | buildConfigurations = ( 410 | 544465DF265B903F00FAC1CD /* Debug */, 411 | 544465E0265B903F00FAC1CD /* Release */, 412 | ); 413 | defaultConfigurationIsVisible = 0; 414 | defaultConfigurationName = Release; 415 | }; 416 | 544465E1265B903F00FAC1CD /* Build configuration list for PBXNativeTarget "Taskey" */ = { 417 | isa = XCConfigurationList; 418 | buildConfigurations = ( 419 | 544465E2265B903F00FAC1CD /* Debug */, 420 | 544465E3265B903F00FAC1CD /* Release */, 421 | ); 422 | defaultConfigurationIsVisible = 0; 423 | defaultConfigurationName = Release; 424 | }; 425 | /* End XCConfigurationList section */ 426 | 427 | /* Begin XCRemoteSwiftPackageReference section */ 428 | 544465EC265B915700FAC1CD /* XCRemoteSwiftPackageReference "ChartView" */ = { 429 | isa = XCRemoteSwiftPackageReference; 430 | repositoryURL = "https://github.com/AppPear/ChartView"; 431 | requirement = { 432 | kind = upToNextMajorVersion; 433 | minimumVersion = 1.5.5; 434 | }; 435 | }; 436 | /* End XCRemoteSwiftPackageReference section */ 437 | 438 | /* Begin XCSwiftPackageProductDependency section */ 439 | 544465ED265B915700FAC1CD /* SwiftUICharts */ = { 440 | isa = XCSwiftPackageProductDependency; 441 | package = 544465EC265B915700FAC1CD /* XCRemoteSwiftPackageReference "ChartView" */; 442 | productName = SwiftUICharts; 443 | }; 444 | /* End XCSwiftPackageProductDependency section */ 445 | 446 | /* Begin XCVersionGroup section */ 447 | 544465D3265B903A00FAC1CD /* Taskey.xcdatamodeld */ = { 448 | isa = XCVersionGroup; 449 | children = ( 450 | 544465D4265B903A00FAC1CD /* Taskey.xcdatamodel */, 451 | ); 452 | currentVersion = 544465D4265B903A00FAC1CD /* Taskey.xcdatamodel */; 453 | path = Taskey.xcdatamodeld; 454 | sourceTree = ""; 455 | versionGroupType = wrapper.xcdatamodel; 456 | }; 457 | /* End XCVersionGroup section */ 458 | }; 459 | rootObject = 544465C2265B903A00FAC1CD /* Project object */; 460 | } 461 | -------------------------------------------------------------------------------- /Taskey/View/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Taskey 4 | // 5 | // Created by Mohammad Yasir on 24/05/21. 6 | // 7 | 8 | import SwiftUI 9 | import CoreData 10 | import SwiftUICharts 11 | 12 | let chartstyle = ChartStyle(backgroundColor: Color(#colorLiteral(red: 0.1895590621, green: 0.1168746242, blue: 0.4104446862, alpha: 1)).opacity(0.0), accentColor: Color(#colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1)), secondGradientColor: Color(#colorLiteral(red: 0.5568627715, green: 0.3529411852, blue: 0.9686274529, alpha: 1)), textColor: Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)).opacity(0.0), legendTextColor: Color(#colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1)), dropShadowColor: Color(#colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1))) 13 | 14 | struct ContentView: View { 15 | 16 | @State private var showSide : Bool = false 17 | @State private var showAddView : Bool = false 18 | @State private var searched : String = "" 19 | @State private var isSearching = false 20 | @State private var isCompleted = false 21 | @State private var title : String = "" 22 | @State private var appOwnerFirstName : String = "My" 23 | @State private var appOwnerLastName : String = "Friend" 24 | @State private var showOwnerNameView : Bool = false 25 | @State private var showingImagePicker : Bool = false 26 | @State private var inputImage : UIImage? 27 | 28 | @Environment(\.managedObjectContext) private var viewContext 29 | 30 | @FetchRequest(entity: Reminder.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Reminder.createdAt, ascending: true)]) 31 | var reminders: FetchedResults 32 | 33 | @FetchRequest(entity: App.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \App.createdAt, ascending: true)]) 34 | var app: FetchedResults 35 | 36 | var body: some View { 37 | ZStack (alignment:.leading){ 38 | Image("back") 39 | .resizable() 40 | .aspectRatio(contentMode: .fill) 41 | .ignoresSafeArea() 42 | 43 | VStack(alignment:.leading , spacing : 30){ 44 | HStack { 45 | Spacer() 46 | Button(action: { 47 | withAnimation(.easeInOut(duration: 0.5)){ 48 | showSide = false 49 | } 50 | 51 | }, label: { 52 | ZStack { 53 | Circle() 54 | .stroke(lineWidth: 2.0) 55 | .foregroundColor(Color(#colorLiteral(red: 0.2192850067, green: 0.2825516116, blue: 0.4862745106, alpha: 1)).opacity(0.5)) 56 | 57 | Image(systemName: "arrow.left") 58 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)).opacity(0.7)) 59 | 60 | } 61 | .frame(width: 50, height: 50, alignment: .center) 62 | }) 63 | } 64 | ZStack { 65 | Circle() 66 | .stroke(lineWidth: 3.0) 67 | .foregroundColor(Color(#colorLiteral(red: 0.2192850067, green: 0.2825516116, blue: 0.4862745106, alpha: 1))) 68 | 69 | 70 | Circle() 71 | .trim(from: 0.0, to: 0.43) 72 | .stroke(style: StrokeStyle(lineWidth: 4.0, lineCap: .round, lineJoin: .round)) 73 | .foregroundColor(Color(#colorLiteral(red: 1, green: 0.1126264818, blue: 0.9802823481, alpha: 1))) 74 | .rotationEffect(.degrees(-90)) 75 | 76 | let n = app.count - 1 77 | if app.count != 0 && app[n].profilePhoto != nil { 78 | Image(uiImage: UIImage(data: app[n].profilePhoto!)!) 79 | .resizable() 80 | .aspectRatio(contentMode: .fill) 81 | .frame(width: 90, height: 90, alignment: .center) 82 | .clipShape(Circle()) 83 | } else { 84 | Image("pic") 85 | .resizable() 86 | .aspectRatio(contentMode: .fill) 87 | .frame(width: 90, height: 90, alignment: .center) 88 | .clipShape(Circle()) 89 | } 90 | 91 | 92 | } 93 | .frame(width: 100, height: 100, alignment: .center) 94 | .padding(.top , -30) 95 | .onTapGesture { 96 | // Navigate Image Picker 97 | showOwnerNameView = true 98 | } 99 | 100 | 101 | 102 | VStack(alignment:.leading , spacing : 9){ 103 | 104 | if app.count == 0 { 105 | Text("Welcome") 106 | .font(.system(size: 35, weight: .bold, design: .rounded)) 107 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 108 | Text("There !") 109 | .font(.system(size: 35, weight: .bold, design: .rounded)) 110 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 111 | } else { 112 | let n = app.count - 1 113 | Text("\(app[n].firstName!)") 114 | .font(.system(size: 35, weight: .bold, design: .rounded)) 115 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 116 | Text("\(app[n].lastName!)") 117 | .font(.system(size: 35, weight: .bold, design: .rounded)) 118 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 119 | } 120 | 121 | } 122 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 123 | 124 | 125 | VStack(alignment:.leading , spacing : 28){ 126 | HStack(spacing : 10){ 127 | Image(systemName: "bookmark") 128 | .font(.system(size: 17, weight: .bold, design: .rounded)) 129 | .foregroundColor(Color(#colorLiteral(red: 0.6174810868, green: 0.6174810868, blue: 0.6174810868, alpha: 1))) 130 | Text("Templates") 131 | .font(.system(size: 15, weight: .bold, design: .rounded)) 132 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)).opacity(0.7)) 133 | } 134 | HStack(spacing : 10){ 135 | Image(systemName: "rectangle.stack.person.crop") 136 | .font(.system(size: 17, weight: .bold, design: .rounded)) 137 | .foregroundColor(Color(#colorLiteral(red: 0.6174810868, green: 0.6174810868, blue: 0.6174810868, alpha: 1))) 138 | Text("Categories") 139 | .font(.system(size: 15, weight: .bold, design: .rounded)) 140 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)).opacity(0.7)) 141 | } 142 | HStack(spacing : 10){ 143 | Image(systemName: "clock") 144 | .font(.system(size: 17, weight: .bold, design: .rounded)) 145 | .foregroundColor(Color(#colorLiteral(red: 0.6174810868, green: 0.6174810868, blue: 0.6174810868, alpha: 1))) 146 | Text("Analytics") 147 | .font(.system(size: 15, weight: .bold, design: .rounded)) 148 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)).opacity(0.7)) 149 | } 150 | } 151 | 152 | MultiLineChartView(data: [([8,32,11,23,40,28], GradientColors.orngPink)], title: "Chart" , style: chartstyle) 153 | 154 | VStack(alignment:.leading){ 155 | Text("Good") 156 | .font(.system(size: 14, weight: .bold, design: .rounded)) 157 | .foregroundColor(Color(#colorLiteral(red: 0.1577721556, green: 0.5591396708, blue: 1, alpha: 0.4831928454))) 158 | Text("Consistancy") 159 | .font(.system(size: 22, weight: .bold, design: .rounded)) 160 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 161 | } 162 | 163 | } 164 | .frame(width: UIScreen.main.bounds.width / 1.9, height: UIScreen.main.bounds.height, alignment: .center) 165 | .padding(.leading , 40) 166 | .blur(radius: showSide ? 0 : 3) 167 | 168 | 169 | VStack { 170 | ZStack { 171 | LinearGradient(gradient: Gradient(colors: [ Color(#colorLiteral(red: 0.03529411765, green: 0.02745098039, blue: 0.05098039216, alpha: 1)) , Color(#colorLiteral(red: 0.1494468771, green: 0.06504140199, blue: 0.2321173555, alpha: 1))]), startPoint: .topLeading, endPoint: .bottomTrailing) 172 | 173 | VStack(alignment : .leading){ 174 | 175 | VStack(alignment : .leading , spacing : 10){ 176 | Text("What's up,") 177 | .font(.system(size: 35, weight: .bold, design: .rounded)) 178 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 179 | if app.count == 0 { 180 | Text("My Freind") 181 | .font(.system(size: 35, weight: .bold, design: .rounded)) 182 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 183 | } else { 184 | let n = app.count - 1 185 | Text("\(app[n].firstName!) \(app[n].lastName!)") 186 | .font(.system(size: 35, weight: .bold, design: .rounded)) 187 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 188 | } 189 | 190 | 191 | } 192 | .padding(.top , 20) 193 | 194 | HStack { 195 | Button(action: { 196 | withAnimation(.easeInOut(duration: 0.5)){ 197 | showSide = true 198 | } 199 | }, label: { 200 | Image("side") 201 | .resizable() 202 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)).opacity(0.7)) 203 | .frame(width:20 , height : 10) 204 | }) 205 | 206 | SearchView(searched: $searched, isSearching: $isSearching) 207 | .padding(.trailing , 7) 208 | 209 | 210 | } 211 | .padding(.top , 20) 212 | 213 | 214 | Text("YOUR TASKS") 215 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 216 | .font(.system(size: 12, weight: .medium, design: .rounded)) 217 | .padding(.top , 15) 218 | 219 | ScrollView(.vertical , showsIndicators: false) { 220 | VStack(spacing : 12){ 221 | ForEach(reminders.indices , id: \.self) { i in 222 | ZStack { 223 | RoundedRectangle(cornerRadius: 12) 224 | .foregroundColor(Color(#colorLiteral(red: 0.06194570952, green: 0.08552871368, blue: 0.2766906481, alpha: 1))) 225 | 226 | HStack(spacing : 18){ 227 | Button(action: { 228 | if reminders[i].isCompleted == true { 229 | reminders[i].isCompleted = false 230 | viewContext.performAndWait { 231 | reminders[i].isCompleted = false 232 | try? viewContext.save() 233 | print("Reminder Updated") 234 | } 235 | } else { 236 | reminders[i].isCompleted = true 237 | viewContext.performAndWait { 238 | reminders[i].isCompleted = true 239 | try? viewContext.save() 240 | print("Reminder Updated") 241 | } 242 | } 243 | }, label: { 244 | if reminders[i].isCompleted { 245 | ZStack { 246 | Image(systemName: "circle.fill") 247 | .foregroundColor(Color(#colorLiteral(red: 0.2295567705, green: 0.1456311053, blue: 0.4030385722, alpha: 1))) 248 | .font(.system(size: 20, weight: .bold, design: .rounded)) 249 | 250 | Image(systemName: "checkmark") 251 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1))) 252 | .font(.system(size: 8, weight: .bold, design: .rounded)) 253 | } 254 | } else { 255 | Image(systemName: "circle") 256 | .foregroundColor(Color(#colorLiteral(red: 0.5568627715, green: 0.3529411852, blue: 0.9686274529, alpha: 1))) 257 | .font(.system(size: 20, weight: .bold, design: .rounded)) 258 | } 259 | }) 260 | 261 | 262 | 263 | ZStack { 264 | HStack { 265 | Text(reminders[i].title!) 266 | .foregroundColor(Color(#colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0))) 267 | .font(.system(size: 18, weight: .medium, design: .rounded)) 268 | Spacer() 269 | } 270 | 271 | if reminders[i].isCompleted { 272 | Rectangle() 273 | .frame(height : 0.5) 274 | .foregroundColor(Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1))) 275 | } 276 | } 277 | 278 | if reminders[i].isCompleted { 279 | Button(action: { 280 | for j in 0..