Skip to content

Commit eb19e38

Browse files
committed
fix: TodoEditor에서 Todo를 생성, 수정하면서 윈도우가 닫히지 않는 현상 해결
1 parent a01d071 commit eb19e38

1 file changed

Lines changed: 59 additions & 29 deletions

File tree

Application/DevLogPresentation/Sources/Home/TodoEditorWindowView.swift

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,48 +11,78 @@ import DevLogDomain
1111

1212
public struct TodoEditorWindowView: View {
1313
@Environment(\.diContainer) private var container: DIContainer
14-
@Environment(\.dismissWindow) private var dismissWindow
1514
@Environment(TodoEditorWindowEvent.self) private var windowEvent
15+
@State private var windowScene: UIWindowScene?
1616
private let value: TodoEditorWindowValue
1717

1818
public init(value: TodoEditorWindowValue) {
1919
self.value = value
2020
}
2121

2222
public var body: some View {
23-
switch value {
24-
case .create(let windowCategory, _):
25-
TodoEditorView(
26-
viewModel: TodoEditorViewModel(
27-
category: windowCategory.todoCategory,
28-
fetchPreferencesUseCase: container.resolve(FetchTodoCategoryPreferencesUseCase.self),
29-
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self),
30-
upsertTodoUseCase: container.resolve(UpsertTodoUseCase.self),
31-
trackAnalyticsEventUseCase: container.resolve(TrackAnalyticsEventUseCase.self),
32-
onUpsertSuccess: upsert
33-
),
34-
onClose: closeWindow
35-
)
36-
case .edit(let windowTodo):
37-
TodoEditorView(
38-
viewModel: TodoEditorViewModel(
39-
todo: windowTodo.todo,
40-
fetchPreferencesUseCase: container.resolve(FetchTodoCategoryPreferencesUseCase.self),
41-
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self),
42-
upsertTodoUseCase: container.resolve(UpsertTodoUseCase.self),
43-
onUpsertSuccess: upsert
44-
),
45-
onClose: closeWindow
46-
)
23+
Group {
24+
switch value {
25+
case .create(let windowCategory, _):
26+
TodoEditorView(
27+
viewModel: TodoEditorViewModel(
28+
category: windowCategory.todoCategory,
29+
fetchPreferencesUseCase: container.resolve(FetchTodoCategoryPreferencesUseCase.self),
30+
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self),
31+
upsertTodoUseCase: container.resolve(UpsertTodoUseCase.self),
32+
trackAnalyticsEventUseCase: container.resolve(TrackAnalyticsEventUseCase.self),
33+
onUpsertSuccess: upsert
34+
),
35+
onClose: closeWindow
36+
)
37+
case .edit(let windowTodo):
38+
TodoEditorView(
39+
viewModel: TodoEditorViewModel(
40+
todo: windowTodo.todo,
41+
fetchPreferencesUseCase: container.resolve(FetchTodoCategoryPreferencesUseCase.self),
42+
fetchReferenceItemsUseCase: container.resolve(FetchReferenceItemsUseCase.self),
43+
upsertTodoUseCase: container.resolve(UpsertTodoUseCase.self),
44+
onUpsertSuccess: upsert
45+
),
46+
onClose: closeWindow
47+
)
48+
}
49+
}
50+
.background {
51+
WindowSceneReader { windowScene = $0 }
4752
}
48-
}
49-
50-
private func closeWindow() {
51-
dismissWindow(id: TodoEditorWindowValue.sceneId, value: value)
5253
}
5354

5455
private func upsert(_ todo: Todo) {
5556
windowEvent.submit(value: value, todo: todo)
5657
closeWindow()
5758
}
59+
60+
private func closeWindow() {
61+
guard let windowScene else { return }
62+
UIApplication.shared.requestSceneSessionDestruction(
63+
windowScene.session,
64+
options: nil,
65+
errorHandler: nil
66+
)
67+
}
68+
}
69+
70+
private struct WindowSceneReader: UIViewRepresentable {
71+
let onResolve: (UIWindowScene?) -> Void
72+
73+
func makeUIView(context: Context) -> UIView {
74+
let view = UIView()
75+
resolve(from: view)
76+
return view
77+
}
78+
79+
func updateUIView(_ view: UIView, context: Context) {
80+
resolve(from: view)
81+
}
82+
83+
private func resolve(from view: UIView) {
84+
DispatchQueue.main.async {
85+
onResolve(view.window?.windowScene)
86+
}
87+
}
5888
}

0 commit comments

Comments
 (0)