Skip to content

Commit e3c80b5

Browse files
committed
refactor: TodoDetail 시트 상태 enum 정리
1 parent 00b46c1 commit e3c80b5

3 files changed

Lines changed: 38 additions & 55 deletions

File tree

Application/DevLogPresentation/Sources/Home/Detail/TodoDetailFeature.swift

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,27 @@ struct TodoDetailFeature {
2424
}
2525

2626
@ObservableState
27-
struct SheetState: Equatable {
28-
var destination: Destination
27+
@CasePathable
28+
enum SheetState: Equatable {
29+
case info
30+
case todo(TodoDetailFeature.State)
2931

3032
var todoDetail: TodoDetailFeature.State? {
3133
get {
32-
guard case .todo(let state) = destination else { return nil }
34+
guard case .todo(let state) = self else { return nil }
3335
return state
3436
}
3537
set {
3638
guard let newValue else { return }
37-
destination = .todo(newValue)
39+
self = .todo(newValue)
3840
}
3941
}
4042

41-
enum Destination: Equatable {
42-
case info
43-
case todo(TodoDetailFeature.State)
44-
}
45-
46-
static let info = Self(destination: .info)
47-
4843
static func todo(_ todoId: TodoIdItem) -> Self {
49-
Self(
50-
destination: .todo(
51-
TodoDetailFeature.State(
52-
todoId: todoId.id,
53-
showEditButton: false
54-
)
44+
.todo(
45+
TodoDetailFeature.State(
46+
todoId: todoId.id,
47+
showEditButton: false
5548
)
5649
)
5750
}
@@ -139,7 +132,7 @@ private struct TodoDetailSheetFeature: Reducer {
139132

140133
var body: some ReducerOf<Self> {
141134
EmptyReducer()
142-
.ifLet(\.todoDetail, action: \.todo) {
135+
.ifCaseLet(\.todo, action: \.todo) {
143136
TodoDetailFeature()
144137
}
145138
}

Application/DevLogPresentation/Sources/Home/Detail/TodoDetailView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ struct TodoDetailView: View {
111111
private func sheetContent(
112112
_ sheetStore: Store<TodoDetailFeature.SheetState, TodoDetailFeature.Action.Sheet>
113113
) -> some View {
114-
switch sheetStore.destination {
114+
switch sheetStore.state {
115115
case .info:
116116
if let todo = store.todo {
117117
TodoDetailInfoSheetView(todo: todo) {

Application/DevLogPresentation/Tests/Home/TodoDetailFeatureTests.swift

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,14 @@ struct TodoDetailFeatureTests {
141141

142142
@Test("시트와 편집 화면 상태를 액션에 맞게 변경한다")
143143
func 시트와_편집_화면_상태를_액션에_맞게_변경한다() async {
144-
let fetchSpy = FetchTodoByIdUseCaseSpy(todo: makeTodo(id: "todo-2"))
144+
let reference = makeTodoReference(id: "todo-7", title: "Reference 7")
145+
let fetchSpy = FetchTodoByIdUseCaseSpy(
146+
todo: makeTodo(id: "todo-2", content: "- refs #7")
147+
)
148+
let referenceSpy = FetchReferenceItemsUseCaseSpy(references: [7: reference])
145149
let adapter = TodoDetailStoreTestAdapter(
146150
fetchUseCase: fetchSpy,
147-
referenceUseCase: FetchReferenceItemsUseCaseSpy(),
151+
referenceUseCase: referenceSpy,
148152
todoId: "todo-1",
149153
showEditButton: false
150154
)
@@ -158,16 +162,18 @@ struct TodoDetailFeatureTests {
158162

159163
adapter.setSheet(.todo(TodoIdItem(id: "todo-2")))
160164

161-
#expect(adapter.sheet?.todoDetail?.todoId == "todo-2")
162-
#expect(adapter.sheet?.todoDetail?.showEditButton == false)
165+
#expect(todoDetailState(in: adapter.sheet)?.todoId == "todo-2")
166+
#expect(todoDetailState(in: adapter.sheet)?.showEditButton == false)
163167

164168
adapter.onSheetTodoAppear()
165169

166170
await waitUntil {
167-
adapter.sheet?.todoDetail?.todo?.id == "todo-2"
171+
todoDetailState(in: adapter.sheet)?.referenceItems[7] == TodoReferenceItem(from: reference)
168172
}
169173

170174
#expect(fetchSpy.todoIds == ["todo-2"])
175+
#expect(referenceSpy.numbers == [[7]])
176+
#expect(adapter.referenceItems.isEmpty)
171177

172178
adapter.dismissSheet()
173179
adapter.dismissFullScreenCover()
@@ -202,37 +208,14 @@ private protocol TodoDetailTestAdapter {
202208
private struct TodoDetailStoreTestAdapter: TodoDetailTestAdapter {
203209
private let store: StoreOf<TodoDetailFeature>
204210

205-
var todoId: String {
206-
store.todoId
207-
}
208-
209-
var showEditButton: Bool {
210-
store.showEditButton
211-
}
212-
213-
var todo: Todo? {
214-
store.todo
215-
}
216-
217-
var referenceItems: [Int: TodoReferenceItem] {
218-
store.referenceItems
219-
}
220-
221-
var isLoading: Bool {
222-
store.isLoading
223-
}
224-
225-
var alert: AlertState<Never>? {
226-
store.alert
227-
}
228-
229-
var sheet: TodoDetailFeature.SheetState? {
230-
store.sheet
231-
}
232-
233-
var fullScreenCover: TodoDetailFeature.FullScreenCoverState? {
234-
store.fullScreenCover
235-
}
211+
var todoId: String { store.todoId }
212+
var showEditButton: Bool { store.showEditButton }
213+
var todo: Todo? { store.todo }
214+
var referenceItems: [Int: TodoReferenceItem] { store.referenceItems }
215+
var isLoading: Bool { store.isLoading }
216+
var alert: AlertState<Never>? { store.alert }
217+
var sheet: TodoDetailFeature.SheetState? { store.sheet }
218+
var fullScreenCover: TodoDetailFeature.FullScreenCoverState? { store.fullScreenCover }
236219

237220
init(
238221
fetchUseCase: FetchTodoByIdUseCase,
@@ -284,6 +267,13 @@ private struct TodoDetailStoreTestAdapter: TodoDetailTestAdapter {
284267
}
285268
}
286269

270+
private func todoDetailState(
271+
in sheet: TodoDetailFeature.SheetState?
272+
) -> TodoDetailFeature.State? {
273+
guard case .todo(let state) = sheet else { return nil }
274+
return state
275+
}
276+
287277
private func expectedErrorAlert() -> AlertState<Never> {
288278
AlertState {
289279
TextState(String(localized: "common_error_title"))

0 commit comments

Comments
 (0)