-
Notifications
You must be signed in to change notification settings - Fork 0
[#118] iOS 17이하일 때 HomeView에서 시트 -> 얼럿 사이의 상태 변경에 따른 문제를 해결한다 #121
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
f1e9613
56ae35f
0c06967
b671bb3
62ae318
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -12,7 +12,7 @@ final class HomeViewModel: Store { | |||||||||||||||||
| var todoKindPreferences = TodoKind.allCases.map { TodoKindPreference(kind: $0, isVisible: true) } | ||||||||||||||||||
| var pinnedTodos: [PinnedTodoItem] = [] | ||||||||||||||||||
| var webPages: [WebPageItem] = [] | ||||||||||||||||||
| var showTodoKindPicker: Bool = false | ||||||||||||||||||
| var showContentPicker: Bool = false | ||||||||||||||||||
| var showTodoEditor: Bool = false | ||||||||||||||||||
| var showSearchView: Bool = false | ||||||||||||||||||
| var webPageURLInput: String = "https://" | ||||||||||||||||||
|
|
@@ -57,7 +57,7 @@ final class HomeViewModel: Store { | |||||||||||||||||
| case deleteWebPage(String) | ||||||||||||||||||
| case fetchPinnedTodos | ||||||||||||||||||
| case fetchWebPages | ||||||||||||||||||
| case showTodoEditorAfterDelay(Double) | ||||||||||||||||||
| case showModalAfterDelay(ModalType) | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| enum AlertType { | ||||||||||||||||||
|
|
@@ -66,6 +66,11 @@ final class HomeViewModel: Store { | |||||||||||||||||
| case error | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| enum ModalType { | ||||||||||||||||||
| case todoEditor | ||||||||||||||||||
| case urlInputAlert | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| private let upsertTodoUseCase: UpsertTodoUseCase | ||||||||||||||||||
| private let addWebPageUseCase: AddWebPageUseCase | ||||||||||||||||||
| private let deleteWebPageUseCase: DeleteWebPageUseCase | ||||||||||||||||||
|
|
@@ -166,10 +171,15 @@ final class HomeViewModel: Store { | |||||||||||||||||
| send(.setAlert(isPresented: true, type: .error)) | ||||||||||||||||||
| } | ||||||||||||||||||
| } | ||||||||||||||||||
| case .showTodoEditorAfterDelay(let delay): | ||||||||||||||||||
| case .showModalAfterDelay(let type): | ||||||||||||||||||
| Task { | ||||||||||||||||||
| try? await Task.sleep(for: .seconds(delay)) | ||||||||||||||||||
| send(.setShowTodoEditor(true)) | ||||||||||||||||||
| try? await Task.sleep(for: .seconds(0.1)) | ||||||||||||||||||
| switch type { | ||||||||||||||||||
| case .todoEditor: | ||||||||||||||||||
| send(.setShowTodoEditor(true)) | ||||||||||||||||||
| case .urlInputAlert: | ||||||||||||||||||
| send(.setAlert(isPresented: true, type: .webPageInput)) | ||||||||||||||||||
| } | ||||||||||||||||||
| } | ||||||||||||||||||
| } | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
@@ -181,23 +191,27 @@ private extension HomeViewModel { | |||||||||||||||||
| switch action { | ||||||||||||||||||
| case .tapTodoKind(let kind): | ||||||||||||||||||
| state.selectedTodoKind = kind | ||||||||||||||||||
| state.showTodoKindPicker = false | ||||||||||||||||||
| return [.showTodoEditorAfterDelay(0.1)] | ||||||||||||||||||
| state.showContentPicker = false | ||||||||||||||||||
| return [.showModalAfterDelay(.todoEditor)] | ||||||||||||||||||
| case .orderTodoKindPreferences(let preferences): | ||||||||||||||||||
| state.todoKindPreferences = preferences | ||||||||||||||||||
| case .setReorderTodo(let isPresented): | ||||||||||||||||||
| state.reorderTodo = isPresented | ||||||||||||||||||
| case .setShowTodoEditor(let isPresented): | ||||||||||||||||||
| state.showTodoEditor = isPresented | ||||||||||||||||||
| if !isPresented { state.selectedTodoKind = nil } | ||||||||||||||||||
| case .setShowContentPicker(let isPresented): | ||||||||||||||||||
| state.showTodoKindPicker = isPresented | ||||||||||||||||||
| case .setShowSearchView(let isPresented): | ||||||||||||||||||
| state.showSearchView = isPresented | ||||||||||||||||||
| case .setReorderTodo(let presented): | ||||||||||||||||||
| state.reorderTodo = presented | ||||||||||||||||||
| case .setShowTodoEditor(let presented): | ||||||||||||||||||
| state.showTodoEditor = presented | ||||||||||||||||||
| if !presented { state.selectedTodoKind = nil } | ||||||||||||||||||
| case .setShowContentPicker(let presented): | ||||||||||||||||||
| state.showContentPicker = presented | ||||||||||||||||||
| case .setShowSearchView(let presented): | ||||||||||||||||||
| state.showSearchView = presented | ||||||||||||||||||
| case .updateWebPageURLInput(let text): | ||||||||||||||||||
| state.webPageURLInput = text | ||||||||||||||||||
| case .setAlert(let isPresented, let type): | ||||||||||||||||||
| setAlert(&state, isPresented: isPresented, type: type) | ||||||||||||||||||
| case .setAlert(let presented, let type): | ||||||||||||||||||
| if type == .webPageInput && state.showContentPicker { | ||||||||||||||||||
| state.showContentPicker = false | ||||||||||||||||||
| return [.showModalAfterDelay(.urlInputAlert)] | ||||||||||||||||||
| } | ||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The logic should explicitly check if
Suggested change
|
||||||||||||||||||
| setAlert(&state, isPresented: presented, type: type) | ||||||||||||||||||
| default: | ||||||||||||||||||
| break | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -65,7 +65,7 @@ struct HomeView: View { | |
| ) | ||
| } | ||
| .sheet(isPresented: Binding( | ||
| get: { viewModel.state.showTodoKindPicker }, | ||
| get: { viewModel.state.showContentPicker }, | ||
| set: { _, _ in } | ||
| )) { | ||
| contentPicker | ||
|
|
@@ -334,7 +334,9 @@ struct HomeView: View { | |
|
|
||
| Section { | ||
| Button { | ||
| viewModel.send(.setAlert(isPresented: true, type: .webPageInput)) | ||
| DispatchQueue.main.async { | ||
| viewModel.send(.setAlert(isPresented: true, type: .webPageInput)) | ||
| } | ||
|
Comment on lines
+337
to
+339
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This viewModel.send(.setAlert(isPresented: true, type: .webPageInput)) |
||
| } label: { | ||
| labelImage( | ||
| text: "URL", | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using
try?withTask.sleepignores theCancellationError. It is better to usetry awaitso that the task stops executing immediately if it is cancelled (for example, if the ViewModel is deinitialized or the view disappears).