-
Notifications
You must be signed in to change notification settings - Fork 6
/
SakatsuInputScreen.swift
103 lines (96 loc) · 4.2 KB
/
SakatsuInputScreen.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
import SwiftUI
import SakatsuData
struct SakatsuInputScreen: View {
@StateObject private var viewModel: SakatsuInputViewModel<SakatsuUserDefaultsClient>
private let onSakatsuSave: () -> Void
@Environment(\.dismiss) private var dismiss
var body: some View {
SakatsuInputView(
sakatsu: viewModel.uiState.sakatsu,
onAddNewSaunaSetButtonClick: {
viewModel.onAddNewSaunaSetButtonClick()
}, onFacilityNameChange: { facilityName in
viewModel.onFacilityNameChange(facilityName: facilityName)
}, onVisitingDateChange: { visitingDate in
viewModel.onVisitingDateChange(visitingDate: visitingDate)
}, onForewordChange: { foreword in
viewModel.onForewordChange(foreword: foreword)
}, onSaunaTitleChange: { saunaSetIndex, saunaTitle in
viewModel.onSaunaTitleChange(saunaSetIndex: saunaSetIndex, saunaTitle: saunaTitle)
}, onSaunaTimeChange: { saunaSetIndex, saunaTime in
viewModel.onSaunaTimeChange(saunaSetIndex: saunaSetIndex, saunaTime: saunaTime)
}, onCoolBathTitleChange: { saunaSetIndex, coolBathTitle in
viewModel.onCoolBathTitleChange(saunaSetIndex: saunaSetIndex, coolBathTitle: coolBathTitle)
}, onCoolBathTimeChange: { saunaSetIndex, coolBathTime in
viewModel.onCoolBathTimeChange(saunaSetIndex: saunaSetIndex, coolBathTime: coolBathTime)
}, onRelaxationTitleChange: { saunaSetIndex, relaxationTitle in
viewModel.onRelaxationTitleChange(saunaSetIndex: saunaSetIndex, relaxationTitle: relaxationTitle)
}, onRelaxationTimeChange: { saunaSetIndex, relaxationTime in
viewModel.onRelaxationTimeChange(saunaSetIndex: saunaSetIndex, relaxationTime: relaxationTime)
}, onRemoveSaunaSetButtonClick: { saunaSetIndex in
viewModel.onRemoveSaunaSetButtonClick(saunaSetIndex: saunaSetIndex)
}, onAfterwordChange: { afterword in
viewModel.onAfterwordChange(afterword: afterword)
}, onTemperatureTitleChange: { temperatureIndex, temperatureTitle in
viewModel.onTemperatureTitleChange(temperatureIndex: temperatureIndex, temperatureTitle: temperatureTitle)
}, onTemperatureChange: { temperatureIndex, temperature in
viewModel.onTemperatureChange(temperatureIndex: temperatureIndex, temperature: temperature)
}
)
.navigationTitle("サ活登録")
.navigationBarTitleDisplayMode(.inline)
.sakatsuInputScreenToolbar(
saveButtonDisabled: viewModel.uiState.sakatsu.facilityName.isEmpty,
onSaveButtonClick: {
viewModel.onSaveButtonClick()
onSakatsuSave()
}, onCloseButtonClick: { dismiss() }
)
.errorAlert(
error: viewModel.uiState.sakatsuInputError,
onDismiss: { viewModel.onErrorAlertDismiss() }
)
}
init(
sakatsu: Sakatsu?,
onSakatsuSave: @escaping () -> Void
) {
self._viewModel = StateObject(wrappedValue: SakatsuInputViewModel(sakatsu: sakatsu ?? .init()))
self.onSakatsuSave = onSakatsuSave
}
}
private extension View {
func sakatsuInputScreenToolbar(
saveButtonDisabled: Bool,
onSaveButtonClick: @escaping () -> Void,
onCloseButtonClick: @escaping () -> Void
) -> some View {
toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("保存") {
onSaveButtonClick()
}
.disabled(saveButtonDisabled)
}
ToolbarItem(placement: .navigationBarLeading) {
Button {
onCloseButtonClick()
} label: {
Image(systemName: "xmark")
}
}
}
}
}
#if DEBUG
struct SakatsuInputScreen_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
SakatsuInputScreen(
sakatsu: .preview,
onSakatsuSave: {}
)
}
}
}
#endif