├── 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 | 
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..