Skip to content

Commit c8d808b

Browse files
committed
fix: refreshable 로딩 인디케이터 분리
1 parent 6f95fa8 commit c8d808b

4 files changed

Lines changed: 52 additions & 20 deletions

File tree

Application/DevLogPresentation/Sources/Home/List/TodoListFeature.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,11 @@ private extension TodoListFeature {
201201
func fetchEffect(
202202
query: TodoQuery,
203203
cursor: TodoCursor?,
204-
resetsPagination: Bool = true
204+
resetsPagination: Bool = true,
205+
showsIndicator: Bool = true
205206
) -> Effect<Action> {
206207
.concatenate(
207-
.send(.loading(.begin(target: .default, mode: .delayed))),
208+
showsIndicator ? .send(.loading(.begin(target: .default, mode: .delayed))) : .none,
208209
.run { [fetchTodosUseCase] send in
209210
do {
210211
let page = try await fetchTodosUseCase.execute(query, cursor: cursor)
@@ -216,12 +217,16 @@ private extension TodoListFeature {
216217
nextCursor: page.nextCursor
217218
)))
218219
await send(.store(.setHasMore(page.items.count == query.pageSize && page.nextCursor != nil)))
219-
await send(.loading(.end(target: .default, mode: .delayed)))
220+
if showsIndicator {
221+
await send(.loading(.end(target: .default, mode: .delayed)))
222+
}
220223
} catch is CancellationError {
221224
return
222225
} catch {
223226
await send(.store(.setAlert(true)))
224-
await send(.loading(.end(target: .default, mode: .delayed)))
227+
if showsIndicator {
228+
await send(.loading(.end(target: .default, mode: .delayed)))
229+
}
225230
}
226231
}
227232
)
@@ -277,7 +282,9 @@ private extension TodoListFeature {
277282
state: inout State
278283
) -> Effect<Action> {
279284
switch action {
280-
case .refresh, .onAppear:
285+
case .refresh:
286+
return fetchEffect(query: state.query, cursor: nil, showsIndicator: false)
287+
case .onAppear:
281288
return fetchEffect(query: state.query, cursor: nil)
282289
case .swipeTodo(let todo):
283290
return swipeTodoEffect(todo, state: &state)

Application/DevLogPresentation/Sources/Profile/ProfileFeature.swift

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,11 @@ struct ProfileFeature {
108108
if !settings.isEmpty {
109109
state.selectedActivityKinds = settings
110110
}
111+
let showsIndicator = if case .fetchData = action { true } else { false }
111112
if let selectedQuarterStart = state.selectedQuarterStart {
112113
return .merge(
113114
fetchUserDataEffect(),
114-
fetchActivityQuarterEffect(selectedQuarterStart)
115+
fetchActivityQuarterEffect(selectedQuarterStart, showsIndicator: showsIndicator)
115116
)
116117
}
117118
return fetchUserDataEffect()
@@ -220,9 +221,14 @@ private extension ProfileFeature {
220221
}
221222
}
222223

223-
func fetchActivityQuarterEffect(_ quarterStart: Date) -> Effect<Action> {
224+
func fetchActivityQuarterEffect(
225+
_ quarterStart: Date,
226+
showsIndicator: Bool = true
227+
) -> Effect<Action> {
224228
.run { [fetchTodosUseCase] send in
225-
await send(.loading(.begin(target: .default, mode: .delayed)))
229+
if showsIndicator {
230+
await send(.loading(.begin(target: .default, mode: .delayed)))
231+
}
226232
do {
227233
let data = try await ProfileHeatmapBuilder.fetchQuarterActivityData(
228234
from: quarterStart,
@@ -237,9 +243,13 @@ private extension ProfileFeature {
237243
)
238244
)
239245
)
240-
await send(.loading(.end(target: .default, mode: .delayed)))
246+
if showsIndicator {
247+
await send(.loading(.end(target: .default, mode: .delayed)))
248+
}
241249
} catch {
242-
await send(.loading(.end(target: .default, mode: .delayed)))
250+
if showsIndicator {
251+
await send(.loading(.end(target: .default, mode: .delayed)))
252+
}
243253
await send(.setAlert(true))
244254
}
245255
}

Application/DevLogPresentation/Sources/PushNotification/PushNotificationListFeature.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ private extension PushNotificationListFeature {
153153
switch action {
154154
case .refresh:
155155
state.nextCursor = nil
156-
return fetchNotificationsPageEffect(query: state.query, cursor: nil)
156+
return fetchNotificationsPageEffect(query: state.query, cursor: nil, showsIndicator: false)
157157
case .fetchNotifications:
158158
state.nextCursor = nil
159159
return fetchNotificationsEffect(query: state.query, cursor: nil, existingCount: 0)
@@ -292,10 +292,13 @@ private extension PushNotificationListFeature {
292292

293293
func fetchNotificationsPageEffect(
294294
query: PushNotificationQuery,
295-
cursor: PushNotificationCursor?
295+
cursor: PushNotificationCursor?,
296+
showsIndicator: Bool = true
296297
) -> Effect<Action> {
297298
.run { [fetchPushNotificationsUseCase] send in
298-
await send(.loading(.begin(target: .default, mode: .delayed)))
299+
if showsIndicator {
300+
await send(.loading(.begin(target: .default, mode: .delayed)))
301+
}
299302
do {
300303
let page = try await fetchPushNotificationsUseCase.execute(query, cursor: cursor)
301304
if cursor == nil {
@@ -308,9 +311,13 @@ private extension PushNotificationListFeature {
308311
))
309312
)
310313
await send(.store(.setHasMore(page.items.count == query.pageSize && page.nextCursor != nil)))
311-
await send(.loading(.end(target: .default, mode: .delayed)))
314+
if showsIndicator {
315+
await send(.loading(.end(target: .default, mode: .delayed)))
316+
}
312317
} catch {
313-
await send(.loading(.end(target: .default, mode: .delayed)))
318+
if showsIndicator {
319+
await send(.loading(.end(target: .default, mode: .delayed)))
320+
}
314321
await send(.store(.setAlert))
315322
}
316323
}

Application/DevLogPresentation/Sources/Today/TodayFeature.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@ struct TodayFeature {
185185
return updateDisplayOptionsEffect(state.displayOptions)
186186
case .binding:
187187
break
188-
case .refresh, .fetchData:
188+
case .refresh:
189+
return fetchTodosEffect(showsIndicator: false)
190+
case .fetchData:
189191
return fetchTodosEffect()
190192
case .setSectionScope(let scope):
191193
if state.selectedSectionScope == scope, scope != .all {
@@ -255,9 +257,11 @@ private enum UpdateTodayDisplayOptionsUseCaseKey: DependencyKey {
255257
}
256258

257259
private extension TodayFeature {
258-
func fetchTodosEffect() -> Effect<Action> {
260+
func fetchTodosEffect(showsIndicator: Bool = true) -> Effect<Action> {
259261
.run { [fetchTodosUseCase] send in
260-
await send(.loading(.begin(target: .default, mode: .delayed)))
262+
if showsIndicator {
263+
await send(.loading(.begin(target: .default, mode: .delayed)))
264+
}
261265
do {
262266
async let todosWithDueDatePage = fetchTodosUseCase.execute(
263267
TodoQuery(
@@ -284,9 +288,13 @@ private extension TodayFeature {
284288
let todosWithDueDate = try await todosWithDueDatePage.items.compactMap(TodayTodoItem.init(from:))
285289
let todosWithoutDueDate = try await todosWithoutDueDatePage.items.compactMap(TodayTodoItem.init(from:))
286290
await send(.store(.setTodos(todosWithDueDate + todosWithoutDueDate)))
287-
await send(.loading(.end(target: .default, mode: .delayed)))
291+
if showsIndicator {
292+
await send(.loading(.end(target: .default, mode: .delayed)))
293+
}
288294
} catch {
289-
await send(.loading(.end(target: .default, mode: .delayed)))
295+
if showsIndicator {
296+
await send(.loading(.end(target: .default, mode: .delayed)))
297+
}
290298
await send(.store(.setAlert))
291299
}
292300
}

0 commit comments

Comments
 (0)