Skip to content

Commit 65f600e

Browse files
committed
feat: update todo
1 parent ac9ffb3 commit 65f600e

33 files changed

+281
-31
lines changed

BaseSwiftUI/BaseSwiftUIApp.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
//
77

88
import SwiftUI
9-
import LinkNavigator
109
import Firebase
11-
import Defaults
12-
import Then
1310

1411
@main
1512
struct BaseSwiftUIApp: App {

BaseSwiftUI/Data/RepositoryImpl/TodosRepositoryImpl.swift

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct TodosRepositoryImpl: TodosRepository {
1616
func addTodo(name: String, date: Date, note: String, category: TodoCategory) -> Observable<Void> {
1717
Future<Void, Error> { promise in
1818
do {
19-
let item = TodoItem(name: name, note: note, category: category, date: date)
19+
let item = TodoItem(name: name, note: note, categoryId: category.id, date: date)
2020
modelContext?.insert(item)
2121
try modelContext?.save()
2222
promise(.success(()))
@@ -40,6 +40,21 @@ struct TodosRepositoryImpl: TodosRepository {
4040
.eraseToAnyPublisher()
4141
}
4242

43+
func getTodos(category: TodoCategory) -> Observable<[TodoItem]> {
44+
Future<[TodoItem], Error> { promise in
45+
do {
46+
let descriptor = FetchDescriptor<TodoItem>(predicate: #Predicate {
47+
$0.categoryId == category.id
48+
})
49+
let items = try modelContext?.fetch(descriptor) ?? []
50+
promise(.success(items))
51+
} catch {
52+
promise(.failure(error))
53+
}
54+
}
55+
.eraseToAnyPublisher()
56+
}
57+
4358
func deleteTodo(item: TodoItem) -> Observable<Void> {
4459
Future<Void, Error> { promise in
4560
do {
@@ -53,11 +68,15 @@ struct TodosRepositoryImpl: TodosRepository {
5368
.eraseToAnyPublisher()
5469
}
5570

71+
func updateCompleted(item: TodoItem) {
72+
item.isCompleted.toggle()
73+
}
74+
5675
private func groupTodoItemsToTodoLists(items: [TodoItem]) -> [TodoList] {
5776
var dict: [TodoCategory: TodoList] = [:]
5877

5978
for todoItem in items {
60-
dict[todoItem.category, default: TodoList(category: todoItem.category)].items.append(todoItem)
79+
dict[TodoCategory.byId(todoItem.categoryId), default: TodoList(category: TodoCategory.byId(todoItem.categoryId))].items.append(todoItem)
6180
}
6281

6382
return Array(dict.values)

BaseSwiftUI/Domain/Model/TodoCategory.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,11 @@ enum TodoCategory: String, CaseIterable, Identifiable, Codable {
3535
var id: String {
3636
return rawValue
3737
}
38+
39+
static func byId(_ name: String) -> TodoCategory {
40+
for category in TodoCategory.allCases where category.name.lowercased() == name.lowercased() {
41+
return category
42+
}
43+
return .all
44+
}
3845
}

BaseSwiftUI/Domain/Model/TodoItem.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ import SwiftData
1212
var id: String
1313
var name: String
1414
var note: String
15-
var category: TodoCategory
15+
var categoryId: String
1616
var isCompleted = false
1717
var date: Date
1818

19-
init(id: String = UUID().uuidString, name: String, note: String, category: TodoCategory, isCompleted: Bool = false, date: Date) {
19+
init(id: String = UUID().uuidString, name: String, note: String, categoryId: String, isCompleted: Bool = false, date: Date) {
2020
self.id = id
2121
self.name = name
2222
self.note = note
23-
self.category = category
23+
self.categoryId = categoryId
2424
self.isCompleted = isCompleted
2525
self.date = date
2626
}

BaseSwiftUI/Domain/Repository/TodosRepository.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import Foundation
99

1010
protocol TodosRepository {
1111
func getTodoLists() -> Observable<[TodoList]>
12+
func getTodos(category: TodoCategory) -> Observable<[TodoItem]>
1213
func addTodo(name: String, date: Date, note: String, category: TodoCategory) -> Observable<Void>
1314
func deleteTodo(item: TodoItem) -> Observable<Void>
15+
func updateCompleted(item: TodoItem)
1416
}

BaseSwiftUI/Domain/UseCase/TodosUseCase.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import Factory
1010

1111
protocol TodosUseCaseType {
1212
func getTodoLists() -> Observable<[TodoList]>
13+
func getTodos(category: TodoCategory) -> Observable<[TodoItem]>
1314
func addTodo(name: String, date: Date, note: String, category: TodoCategory) -> Observable<Void>
1415
func deleteTodo(item: TodoItem) -> Observable<Void>
16+
func updateCompleted(item: TodoItem)
1517
}
1618

1719
struct TodosUseCase: TodosUseCaseType {
@@ -21,11 +23,19 @@ struct TodosUseCase: TodosUseCaseType {
2123
todosRepository.getTodoLists()
2224
}
2325

26+
func getTodos(category: TodoCategory) -> Observable<[TodoItem]> {
27+
todosRepository.getTodos(category: category)
28+
}
29+
2430
func addTodo(name: String, date: Date, note: String, category: TodoCategory) -> Observable<Void> {
2531
todosRepository.addTodo(name: name, date: date, note: note, category: category)
2632
}
2733

2834
func deleteTodo(item: TodoItem) -> Observable<Void> {
2935
todosRepository.deleteTodo(item: item)
3036
}
37+
38+
func updateCompleted(item: TodoItem) {
39+
todosRepository.updateCompleted(item: item)
40+
}
3141
}

BaseSwiftUI/Presentation/Component/Todo/TodoListItem.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,24 @@
88
import SwiftUI
99

1010
struct TodoListItem: View {
11-
var taskList: TodoList
11+
var todoList: TodoList
1212

1313
var body: some View {
1414
HStack {
1515
VStack(alignment: .leading) {
16-
Image(taskList.category.image)
16+
Image(todoList.category.image)
1717
.resizable()
1818
.frame(width: 30, height: 30)
1919

2020
Spacer()
2121
.frame(height: 20)
2222

2323
VStack(alignment: .leading) {
24-
Text(taskList.category.name)
24+
Text(todoList.category.name)
2525
.fontWeight(.medium)
2626
.foregroundColor(Color(R.color.labelPrimary))
2727

28-
Text("\(taskList.items.count) \(R.string.localizable.commonTasks())")
28+
Text("\(todoList.items.count) \(R.string.localizable.commonTasks())")
2929
.foregroundColor(Color(R.color.labelPrimary))
3030
}
3131
}

BaseSwiftUI/Presentation/Navigator/Home/HomeRouteBuilder.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,26 @@ struct NewTodoRouteBuilder<RootNavigator: HomeRootNavigatorType> {
7070
}
7171
}
7272

73+
// MARK: - TodoListScreen
74+
75+
struct ListTodoParams: Codable {
76+
let category: TodoCategory
77+
}
78+
79+
struct ListTodoRouteBuilder<RootNavigator: HomeRootNavigatorType> {
80+
static func generate() -> RouteBuilderOf<RootNavigator> {
81+
var matchPath: String { RoutePath.todoList.rawValue }
82+
return .init(matchPath: matchPath) { _, items, _ -> RouteViewController? in
83+
return WrappingController(matchPath: matchPath, title: "") {
84+
let params: ListTodoParams = items.decoded() ?? .init(category: .all)
85+
let navigator = ListTodoNavigator()
86+
let viewModel = ListTodoViewModel(navigator: navigator, category: params.category)
87+
ListTodoScreen(viewModel: viewModel)
88+
}
89+
}
90+
}
91+
}
92+
7393
// MARK: - SettingsScreen
7494
struct SettingsRouteBuilder<RootNavigator: HomeRootNavigatorType> {
7595
static func generate() -> RouteBuilderOf<RootNavigator> {

BaseSwiftUI/Presentation/Navigator/Home/HomeRouteGroup.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ struct HomeRouteGroup<RootNavigator: HomeRootNavigatorType> {
2020
MoviesDetailRouteBuilder.generate(),
2121
TodosRouteBuilder.generate(),
2222
NewTodoRouteBuilder.generate(),
23+
ListTodoRouteBuilder.generate(),
2324
SettingsRouteBuilder.generate()
2425
]
2526
}

BaseSwiftUI/Presentation/Navigator/RoutePath.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ enum RoutePath: String {
1515
case movieDetail
1616
case todos
1717
case newTodo
18+
case todoList
1819
case settings
1920
}

0 commit comments

Comments
 (0)