@@ -11,48 +11,78 @@ import DevLogDomain
1111
1212public 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