File Viewer

Download
//
//  TaskListView.swift
//  TrackMyDay
//
//  Created by Pranav Zagade on 10/30/24.
//

import SwiftUI
import FirebaseFirestore

struct TaskListView: View {
    @EnvironmentObject var authManager: AuthenticationManager
    @State private var tasks: [Task] = []
    @State private var navigateToAddTask = false

    var body: some View {
        NavigationStack {
            VStack {

                Text("Welcome, \(authManager.displayName)!")
                    .font(.headline)
                    .padding(.top)

                
                if tasks.isEmpty {
                    Text("No tasks yet. Add a task to get started!")
                        .padding()
                } else {
                    List {
                        Section(header: Text("To-Do")) {
                            ForEach(tasks.filter { !$0.completed }) { task in
                                NavigationLink(destination: TaskDetailView(task: task, onTaskUpdated: { updatedTask in
                                    updateTask(updatedTask)
                                })) {
                                    HStack {
                                        categoryIcon(for: task.category)
                                        VStack(alignment: .leading) {
                                            Text(task.name)
                                                .font(.headline)
                                            Text("Date: \(task.dateString)")
                                            Text("Time: \(task.time)")
                                        }
                                    }
                                }
                            }
                        }

                        Section(header: Text("Completed")) {
                            ForEach(tasks.filter { $0.completed }) { task in
                                NavigationLink(destination: TaskDetailView(task: task, onTaskUpdated: { updatedTask in
                                    updateTask(updatedTask)
                                })) {
                                    HStack {
                                        categoryIcon(for: task.category)
                                        VStack(alignment: .leading) {
                                            Text(task.name)
                                                .font(.headline)
                                                .strikethrough()
                                                .foregroundColor(.gray)
                                            Text("Date: \(task.dateString)")
                                            Text("Time: \(task.time)")
                                        }
                                    }
                                }
                            }
                        }
                    }
                    .listStyle(InsetGroupedListStyle())
                }
            }
            .navigationTitle("Today's Tasks")
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Add Task") {
                        navigateToAddTask = true
                    }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    Button("Sign Out") {
                        authManager.signOut()
                    }
                }
            }
            .navigationDestination(isPresented: $navigateToAddTask) {
                AddTaskView()
            }
            .onAppear {
                fetchTasks()
            }
        }
    }

    private func updateTask(_ updatedTask: Task) {
        if let index = tasks.firstIndex(where: { $0.id == updatedTask.id }) {
            tasks[index] = updatedTask
        }
    }

    private func fetchTasks() {
        guard let userID = authManager.user?.uid else { return }

        let db = Firestore.firestore()
        db.collection("tasks").document(userID).collection("userTasks").getDocuments { snapshot, error in
            if let error = error {
                print("Error fetching tasks: \(error.localizedDescription)")
                return
            }

            if let documents = snapshot?.documents {
                self.tasks = documents.compactMap { doc -> Task? in
                    let data = doc.data()
                    return Task(
                        id: doc.documentID,
                        name: data["name"] as? String ?? "",
                        date: (data["date"] as? Timestamp)?.dateValue() ?? Date(),
                        time: data["time"] as? String ?? "",
                        description: data["description"] as? String ?? "",
                        category: data["category"] as? String ?? "Other",
                        latitude: data["latitude"] as? Double ?? 0.0,
                        longitude: data["longitude"] as? Double ?? 0.0,
                        completed: data["completed"] as? Bool ?? false
                    )
                }
            }
        }
    }

    private func categoryIcon(for category: String) -> some View {
        switch category {
        case "Personal":
            return Image(systemName: "star.fill").foregroundColor(.red)
        case "Work":
            return Image(systemName: "star.fill").foregroundColor(.green)
        case "School":
            return Image(systemName: "star.fill").foregroundColor(.blue)
        case "Other":
            return Image(systemName: "star.fill").foregroundColor(.orange)
        default:
            return Image(systemName: "star.fill").foregroundColor(.gray)
        }
    }
}

#Preview {
    TaskListView().environmentObject(AuthenticationManager())
}