Skip to content

Commit e88b3b3

Browse files
committed
ui: HomeView에서 웹페이지 추가 시 툴바 위치에 LoadingView가 뜨도록 수정
1 parent b8de10d commit e88b3b3

6 files changed

Lines changed: 57 additions & 9 deletions

File tree

Application/DevLogPresentation/Sources/Home/Home/HomeFeature+Effects.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ extension HomeFeature {
7676
trackAnalyticsEventUseCase.execute(.webPageCreate)
7777
let pages = try await fetchWebPagesUseCase.execute("")
7878
await send(.store(.updateWebPages(pages.map(WebPageItem.init(from:)))))
79+
await send(.store(.setSheet(nil)))
7980
} catch {
8081
await send(.store(.setAlert(isPresented: true, type: .error)))
8182
}

Application/DevLogPresentation/Sources/Home/Home/HomeFeature.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,6 @@ private extension HomeFeature {
253253
Self.setAlert(&state, isPresented: true, type: .invalidURL)
254254
return .none
255255
}
256-
state.sheet = nil
257256
Self.setAlert(&state, isPresented: false, type: nil)
258257
return addWebPageEffect(normalizedURL)
259258
case .deleteWebPage(let page):

Application/DevLogPresentation/Sources/Home/Home/HomeView.swift

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ struct HomeView: View {
3838
.alert($store.scope(state: \.alert, action: \.alert))
3939
.sheet(item: $store.scope(state: \.sheet, action: \.sheet), content: sheetContent)
4040
.fullScreenCover(item: $store.scope(state: \.fullScreenCover, action: \.fullScreenCover), content: coverContent)
41-
.overlay {
42-
if store.isAppending {
43-
LoadingView()
44-
}
45-
}
4641
}
4742

4843
private var todoSection: some View {
@@ -234,9 +229,18 @@ struct HomeView: View {
234229
.navigationTitle(Text(String(localized: "home_webpage_input_title")))
235230
.navigationBarTitleDisplayMode(.inline) // 설정 안하면 섹션 위에 내비게이션 large 만큼 영역 먹음
236231
.toolbar {
237-
ToolbarItem(placement: .topBarTrailing) {
238-
Button(String(localized: "home_add")) {
239-
store.send(.view(.addWebPage))
232+
if store.isAppending {
233+
if #available(iOS 26.0, *) {
234+
ToolbarSpacer(.fixed, placement: .topBarTrailing)
235+
}
236+
ToolbarItem(placement: .topBarTrailing) {
237+
ProgressView()
238+
}
239+
} else {
240+
ToolbarItem(placement: .topBarTrailing) {
241+
Button(String(localized: "home_add")) {
242+
store.send(.view(.addWebPage))
243+
}
240244
}
241245
}
242246
}

Application/DevLogPresentation/Tests/Home/HomeFeatureTestAssertions.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ func verifyHomeAddWebPage(
101101
fetchWebPagesUseCaseSpy: FetchWebPagesUseCaseSpy,
102102
trackAnalyticsEventUseCaseSpy: HomeTrackAnalyticsEventUseCaseSpy
103103
) async throws {
104+
await adapter.setPresentation(.contentPicker, true)
104105
await adapter.updateWebPageURLInput("openai.com")
105106
await adapter.addWebPage()
106107

@@ -116,9 +117,28 @@ func verifyHomeAddWebPage(
116117
"https://openai.com",
117118
"https://developer.apple.com"
118119
])
120+
#expect(!adapter.showContentPicker)
119121
#expect(!adapter.showAlert)
120122
}
121123

124+
@MainActor
125+
func verifyHomeAddWebPageFailureKeepsSheet(
126+
adapter: HomeStoreTestAdapter,
127+
addWebPageUseCaseSpy: AddWebPageUseCaseSpy
128+
) async throws {
129+
await adapter.setPresentation(.contentPicker, true)
130+
await adapter.updateWebPageURLInput("openai.com")
131+
await adapter.addWebPage()
132+
133+
await waitUntil {
134+
addWebPageUseCaseSpy.calledUrlStrings == ["https://openai.com"]
135+
&& adapter.showAlert
136+
}
137+
138+
#expect(adapter.showContentPicker)
139+
#expect(adapter.alertType == .error)
140+
}
141+
122142
struct HomeFetchDataContext {
123143
let fetchPreferencesUseCaseSpy: FetchTodoCategoryPreferencesUseCaseSpy
124144
let fetchTodosUseCaseSpy: FetchTodosUseCaseSpy

Application/DevLogPresentation/Tests/Home/HomeFeatureTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,22 @@ struct HomeFeatureTests {
7474
)
7575
}
7676

77+
@Test("HomeFeature addWebPage 실패는 입력 시트를 유지한다")
78+
func HomeFeature_addWebPage_실패는_입력_시트를_유지한다() async throws {
79+
let context = makeHomeAddWebPageContext()
80+
context.addWebPageUseCaseSpy.error = HomeTestError.failure
81+
let adapter = HomeStoreTestAdapter(
82+
addWebPageUseCase: context.addWebPageUseCaseSpy,
83+
fetchWebPagesUseCase: context.fetchWebPagesUseCaseSpy,
84+
trackAnalyticsEventUseCase: context.trackAnalyticsEventUseCaseSpy
85+
)
86+
87+
try await verifyHomeAddWebPageFailureKeepsSheet(
88+
adapter: adapter,
89+
addWebPageUseCaseSpy: context.addWebPageUseCaseSpy
90+
)
91+
}
92+
7793
@Test("웹페이지를 삭제하면 항목이 즉시 숨겨지고 삭제 유스케이스가 호출된다")
7894
func 웹페이지를_삭제하면_항목이_즉시_숨겨지고_삭제_유스케이스가_호출된다() async throws {
7995
let context = makeHomeDeleteContext()
@@ -143,3 +159,7 @@ struct HomeFeatureTests {
143159
#expect(!adapter.isNetworkConnected)
144160
}
145161
}
162+
163+
private enum HomeTestError: Error {
164+
case failure
165+
}

Application/DevLogPresentation/Tests/Support/TestSupport.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,14 @@ final class UpdateTodoCategoryPreferencesUseCaseSpy: UpdateTodoCategoryPreferenc
155155
}
156156

157157
final class AddWebPageUseCaseSpy: AddWebPageUseCase {
158+
var error: Error?
158159
private(set) var calledUrlStrings: [String] = []
159160

160161
func execute(_ urlString: String) async throws {
161162
calledUrlStrings.append(urlString)
163+
if let error {
164+
throw error
165+
}
162166
}
163167
}
164168

0 commit comments

Comments
 (0)