diff --git a/.github/workflows/snyk.yml b/.github/workflows/snyk.yml index 5340350..73f7350 100644 --- a/.github/workflows/snyk.yml +++ b/.github/workflows/snyk.yml @@ -8,8 +8,15 @@ on: jobs: snyk: runs-on: ubuntu-latest + steps: - - uses: actions/checkout@v2 - - uses: snyk/actions/setup@v1 - - run: snyk auth ${{ secrets.SNYK_TOKEN }} - - run: snyk test --all-projects + - uses: actions/checkout@v3 + + - name: Set up Snyk CLI + uses: snyk/actions/setup@master # Correct action tag + + - name: Authenticate with Snyk + run: snyk auth ${{ secrets.SNYK_TOKEN }} + + - name: Run Snyk Code Analysis + run: snyk code test --all-projects diff --git a/AIReviewSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/kannan.xcuserdatad/UserInterfaceState.xcuserstate b/AIReviewSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/kannan.xcuserdatad/UserInterfaceState.xcuserstate index b54b296..fab2f0c 100644 Binary files a/AIReviewSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/kannan.xcuserdatad/UserInterfaceState.xcuserstate and b/AIReviewSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/kannan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/AIReviewSwiftUI/ContentView.swift b/AIReviewSwiftUI/ContentView.swift index def0112..abfbfdc 100644 --- a/AIReviewSwiftUI/ContentView.swift +++ b/AIReviewSwiftUI/ContentView.swift @@ -7,11 +7,10 @@ import SwiftUI -import SwiftUI - struct ContentView: View { @StateObject private var viewModel = TaskViewModel() @State private var newTaskTitle = "" + @State private var newTaskDueDate = Date() var body: some View { VStack { @@ -19,25 +18,34 @@ struct ContentView: View { .textFieldStyle(RoundedBorderTextFieldStyle()) .padding() + DatePicker("Due Date", selection: $newTaskDueDate, displayedComponents: .date) + .padding() + Button("Add Task") { viewModel.addTask(title: newTaskTitle) newTaskTitle = "" } + TaskSummaryView( + totalTasks: viewModel.tasks.count, + completedTasks: viewModel.completedTasks, + overdueTasks: viewModel.overdueTasks + ) + List { ForEach(viewModel.tasks) { task in HStack { Text(task.title) Spacer() + Text(task.dueDate?.formatted(date: .abbreviated, time: .omitted) ?? "No Due Date") + .font(.caption) + .foregroundColor(.gray) Button(action: { viewModel.toggleComplete(task) }) { Image(systemName: task.isCompleted ? "checkmark.circle.fill" : "circle") } } } } - - Text("Total: \(viewModel.tasks.count) • Completed: \(viewModel.tasks.filter { $0.isCompleted }.count)") - .padding(.top) } .padding() } diff --git a/AIReviewSwiftUI/Task.swift b/AIReviewSwiftUI/Task.swift index baddb7d..287aeb6 100644 --- a/AIReviewSwiftUI/Task.swift +++ b/AIReviewSwiftUI/Task.swift @@ -11,4 +11,5 @@ struct Task: Identifiable { let id = UUID() var title: String var isCompleted: Bool = false + var dueDate: Date? = nil } diff --git a/AIReviewSwiftUI/TaskSummaryView.swift b/AIReviewSwiftUI/TaskSummaryView.swift new file mode 100644 index 0000000..389b754 --- /dev/null +++ b/AIReviewSwiftUI/TaskSummaryView.swift @@ -0,0 +1,46 @@ +// +// TaskSummaryView.swift +// AIReviewSwiftUI +// +// Created by kanagasabapathy on 25.04.25. +// + +import SwiftUI + +struct TaskSummaryView: View { + let totalTasks: Int + let completedTasks: Int + let overdueTasks: Int + + var body: some View { + VStack { + Text("Task Summary") + .font(.headline) + .padding(.bottom, 8) + + HStack { + Text("Total Tasks:") + Spacer() + Text("\(totalTasks)") + } + .padding(.vertical, 4) + + HStack { + Text("Completed Tasks:") + Spacer() + Text("\(completedTasks)") + } + .padding(.vertical, 4) + + HStack { + Text("Overdue Tasks:") + Spacer() + Text("\(overdueTasks)") + } + .padding(.vertical, 4) + } + .padding() + .background(RoundedRectangle(cornerRadius: 10).fill(Color(.systemGray6))) + .padding() + } +} diff --git a/AIReviewSwiftUI/TaskViewModel.swift b/AIReviewSwiftUI/TaskViewModel.swift index b9b3fc8..11b63ea 100644 --- a/AIReviewSwiftUI/TaskViewModel.swift +++ b/AIReviewSwiftUI/TaskViewModel.swift @@ -7,12 +7,21 @@ import Foundation +import CryptoKit + + final class TaskViewModel: ObservableObject { @Published var tasks: [Task] = [] - + let urlString = "https://dummyjson.com/products" + let password = "user-password" + let userInput = "example.com" + func addTask(title: String) { guard !title.isEmpty else { return } + let url = URL(string: urlString)! + let hashed = Insecure.MD5.hash(data: password.data(using: .utf8)!) + let urlExample = URL(string: "https://\(userInput)")! tasks.append(Task(title: title)) } @@ -20,4 +29,16 @@ final class TaskViewModel: ObservableObject { guard let index = tasks.firstIndex(where: { $0.id == task.id }) else { return } tasks[index].isCompleted.toggle() } -} \ No newline at end of file + func removeTask(_ task: Task) { + guard let index = tasks.firstIndex(where: { $0.id == task.id }) else { return } + tasks.remove(at: index) + } + var completedTasks: Int { + tasks.filter { $0.isCompleted }.count + } + + var overdueTasks: Int { + let now = Date() + return tasks.filter { !$0.isCompleted && ($0.dueDate ?? now) < now }.count + } +}