Skip to content

Commit a84968f

Browse files
authored
[#199] HomeView에서 TodayView와 겹치는 기능을 제거하고 새로운 기능을 추가한다 (#204)
* feat: TodayView와 중복되는 기능 제거 * feat: 최근 수정된 Todo (최대 5개) 를 보여주도록 추가 * feat: lineLimit이 있을 경우, '...' 이 보이도록 추가 * feat: lineLimit이 걸릴 시 태그 마지막에 '...'가 보이도록 추가 * feat: 태그와 중요 표시가 보이도록 추가하고, 업데이트 시간이 1초마다 업데이트되도록 개선
1 parent 850f373 commit a84968f

10 files changed

Lines changed: 285 additions & 105 deletions

File tree

DevLog/Presentation/Structure/PinnedTodoItem.swift

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// RecentTodoItem.swift
3+
// DevLog
4+
//
5+
// Created by Codex on 3/6/26.
6+
//
7+
8+
import Foundation
9+
10+
struct RecentTodoItem: Identifiable, Hashable {
11+
let id: String
12+
let title: String
13+
let isPinned: Bool
14+
let updatedAt: Date
15+
let tags: [String]
16+
let kind: TodoKind
17+
18+
init(from todo: Todo) {
19+
self.id = todo.id
20+
self.title = todo.title
21+
self.isPinned = todo.isPinned
22+
self.updatedAt = todo.updatedAt
23+
self.tags = todo.tags
24+
self.kind = todo.kind
25+
}
26+
}

DevLog/Presentation/ViewModel/HomeViewModel.swift

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Foundation
1111
final class HomeViewModel: Store {
1212
struct State: Equatable {
1313
var todoKindPreferences = TodoKind.allCases.map { TodoKindPreference(kind: $0, isVisible: true) }
14-
var pinnedTodos: [PinnedTodoItem] = []
14+
var recentTodos: [RecentTodoItem] = []
1515
var webPages: [WebPageItem] = []
1616
var showContentPicker: Bool = false
1717
var showTodoEditor: Bool = false
@@ -21,7 +21,7 @@ final class HomeViewModel: Store {
2121
var searchText: String = ""
2222
var isSearching: Bool = false
2323
var reorderTodo: Bool = false
24-
var isPinnedLoading: Bool = false
24+
var isRecentTodosLoading: Bool = false
2525
var isWebPageLoading: Bool = false
2626
var isWebPageInputLoading: Bool = false
2727
var showAlert: Bool = false
@@ -51,9 +51,9 @@ final class HomeViewModel: Store {
5151
case undoDeleteWebPage
5252
case confirmDeleteWebPage
5353
case setToast(isPresented: Bool, type: ToastType? = nil)
54-
case fetchPinnedTodos([PinnedTodoItem])
54+
case fetchRecentTodos([RecentTodoItem])
5555
case fetchWebPages([WebPageItem])
56-
case setPinnedLoading(Bool)
56+
case setRecentTodosLoading(Bool)
5757
case setWebPageLoading(Bool)
5858
case setWebPageInputLoading(Bool)
5959
}
@@ -62,7 +62,7 @@ final class HomeViewModel: Store {
6262
case upsertTodo(Todo)
6363
case addWebPage(String)
6464
case deleteWebPage(String)
65-
case fetchPinnedTodos
65+
case fetchRecentTodos
6666
case fetchWebPages
6767
case showModalAfterDelay(ModalType)
6868
}
@@ -119,7 +119,7 @@ final class HomeViewModel: Store {
119119
.addWebPage, .confirmDeleteWebPage:
120120
effects = reduceByView(action, state: &state)
121121

122-
case .fetchPinnedTodos, .fetchWebPages, .setPinnedLoading,
122+
case .fetchRecentTodos, .fetchWebPages, .setRecentTodosLoading,
123123
.setWebPageLoading, .setWebPageInputLoading:
124124
effects = reduceByRun(action, state: &state)
125125
}
@@ -134,6 +134,27 @@ final class HomeViewModel: Store {
134134
Task {
135135
do {
136136
try await upsertTodoUseCase.execute(todo)
137+
let page = try await fetchRecentTodos()
138+
let items = page.items
139+
.filter { $0.createdAt != $0.updatedAt }
140+
.prefix(5)
141+
.map { RecentTodoItem(from: $0) }
142+
send(.fetchRecentTodos(items))
143+
} catch {
144+
send(.setAlert(isPresented: true, type: .error))
145+
}
146+
}
147+
case .fetchRecentTodos:
148+
Task {
149+
do {
150+
defer { send(.setRecentTodosLoading(false)) }
151+
send(.setRecentTodosLoading(true))
152+
let page = try await fetchRecentTodos()
153+
let items = page.items
154+
.filter { $0.createdAt != $0.updatedAt }
155+
.prefix(5)
156+
.map { RecentTodoItem(from: $0) }
157+
send(.fetchRecentTodos(items))
137158
} catch {
138159
send(.setAlert(isPresented: true, type: .error))
139160
}
@@ -164,18 +185,6 @@ final class HomeViewModel: Store {
164185
send(.setAlert(isPresented: true, type: .error))
165186
}
166187
}
167-
case .fetchPinnedTodos:
168-
Task {
169-
do {
170-
defer { send(.setPinnedLoading(false)) }
171-
send(.setPinnedLoading(true))
172-
let page = try await fetchTodosUseCase.execute(TodoQuery(isPinned: true), cursor: nil)
173-
let todos = page.items
174-
send(.fetchPinnedTodos(todos.map { PinnedTodoItem(from: $0) }))
175-
} catch {
176-
send(.setAlert(isPresented: true, type: .error))
177-
}
178-
}
179188
case .fetchWebPages:
180189
Task {
181190
do {
@@ -249,7 +258,7 @@ private extension HomeViewModel {
249258
func reduceByView(_ action: Action, state: inout State) -> [SideEffect] {
250259
switch action {
251260
case .onAppear:
252-
return [.fetchPinnedTodos, .fetchWebPages]
261+
return [.fetchRecentTodos, .fetchWebPages]
253262
case .updateSearching(let isSearching):
254263
state.isSearching = isSearching
255264
case .updateSearchText(let text):
@@ -275,8 +284,8 @@ private extension HomeViewModel {
275284

276285
func reduceByRun(_ action: Action, state: inout State) -> [SideEffect] {
277286
switch action {
278-
case .fetchPinnedTodos(let todos):
279-
state.pinnedTodos = todos
287+
case .fetchRecentTodos(let todos):
288+
state.recentTodos = todos
280289
case .fetchWebPages(let pages):
281290
let filteredPages: [WebPageItem]
282291
if let (pendingPage, _) = pendingTask {
@@ -285,8 +294,8 @@ private extension HomeViewModel {
285294
filteredPages = pages
286295
}
287296
state.webPages = filteredPages
288-
case .setPinnedLoading(let isLoading):
289-
state.isPinnedLoading = isLoading
297+
case .setRecentTodosLoading(let isLoading):
298+
state.isRecentTodosLoading = isLoading
290299
case .setWebPageLoading(let isLoading):
291300
state.isWebPageLoading = isLoading
292301
case .setWebPageInputLoading(let isLoading):
@@ -350,4 +359,15 @@ private extension HomeViewModel {
350359
}
351360
return "https://" + trimmed
352361
}
362+
363+
func fetchRecentTodos() async throws -> TodoPage {
364+
try await fetchTodosUseCase.execute(
365+
TodoQuery(
366+
sortTarget: .updatedAt,
367+
sortOrder: .latest,
368+
pageSize: 100
369+
),
370+
cursor: nil
371+
)
372+
}
353373
}

DevLog/Resource/Localizable.xcstrings

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,10 @@
400400
"최근 검색" : {
401401

402402
},
403-
"최근에 중요 표시를 한 Todo가 표시됩니다." : {
403+
"최근 수정" : {
404+
405+
},
406+
"최근 수정한 Todo가 없습니다." : {
404407

405408
},
406409
"추가" : {

0 commit comments

Comments
 (0)