forked from jellyfin/Swiftfin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathItemEditorCoordinator.swift
151 lines (118 loc) · 4.06 KB
/
ItemEditorCoordinator.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
//
import JellyfinAPI
import Stinsen
import SwiftUI
final class ItemEditorCoordinator: ObservableObject, NavigationCoordinatable {
let stack = NavigationStack(initial: \ItemEditorCoordinator.start)
@Root
var start = makeStart
private let viewModel: ItemViewModel
// MARK: - Route to Metadata
@Route(.modal)
var editMetadata = makeEditMetadata
// MARK: - Route to Genres
@Route(.push)
var editGenres = makeEditGenres
@Route(.modal)
var addGenre = makeAddGenre
// MARK: - Route to Tags
@Route(.push)
var editTags = makeEditTags
@Route(.modal)
var addTag = makeAddTag
// MARK: - Route to Studios
@Route(.push)
var editStudios = makeEditStudios
@Route(.modal)
var addStudio = makeAddStudio
// MARK: - Route to People
@Route(.push)
var editPeople = makeEditPeople
@Route(.modal)
var addPeople = makeAddPeople
// MARK: - Initializer
init(viewModel: ItemViewModel) {
self.viewModel = viewModel
}
// MARK: - Item Metadata
func makeEditMetadata(item: BaseItemDto) -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator {
EditMetadataView(viewModel: ItemEditorViewModel(item: item))
}
}
// MARK: - Item Genres
@ViewBuilder
func makeEditGenres(item: BaseItemDto) -> some View {
EditItemElementView<String>(
viewModel: GenreEditorViewModel(item: item),
type: .genres,
route: { router, viewModel in
router.route(to: \.addGenre, viewModel as! GenreEditorViewModel)
}
)
}
func makeAddGenre(viewModel: GenreEditorViewModel) -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator {
AddItemElementView(viewModel: viewModel, type: .genres)
}
}
// MARK: - Item Tags
@ViewBuilder
func makeEditTags(item: BaseItemDto) -> some View {
EditItemElementView<String>(
viewModel: TagEditorViewModel(item: item),
type: .tags,
route: { router, viewModel in
router.route(to: \.addTag, viewModel as! TagEditorViewModel)
}
)
}
func makeAddTag(viewModel: TagEditorViewModel) -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator {
AddItemElementView(viewModel: viewModel, type: .tags)
}
}
// MARK: - Item Studios
@ViewBuilder
func makeEditStudios(item: BaseItemDto) -> some View {
EditItemElementView<NameGuidPair>(
viewModel: StudioEditorViewModel(item: item),
type: .studios,
route: { router, viewModel in
router.route(to: \.addStudio, viewModel as! StudioEditorViewModel)
}
)
}
func makeAddStudio(viewModel: StudioEditorViewModel) -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator {
AddItemElementView(viewModel: viewModel, type: .studios)
}
}
// MARK: - Item People
@ViewBuilder
func makeEditPeople(item: BaseItemDto) -> some View {
EditItemElementView<BaseItemPerson>(
viewModel: PeopleEditorViewModel(item: item),
type: .people,
route: { router, viewModel in
router.route(to: \.addPeople, viewModel as! PeopleEditorViewModel)
}
)
}
func makeAddPeople(viewModel: PeopleEditorViewModel) -> NavigationViewCoordinator<BasicNavigationViewCoordinator> {
NavigationViewCoordinator {
AddItemElementView(viewModel: viewModel, type: .people)
}
}
// MARK: - Start
@ViewBuilder
func makeStart() -> some View {
ItemEditorView(viewModel: viewModel)
}
}