-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathOnboardingView.swift
More file actions
116 lines (103 loc) · 3.9 KB
/
Copy pathOnboardingView.swift
File metadata and controls
116 lines (103 loc) · 3.9 KB
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
//
// OnboardingView.swift
// NativeAppTemplate
//
import SwiftUI
struct OnboardingView: View {
@State private var viewModel: OnboardingViewModel
init(onboardingRepository: OnboardingRepositoryProtocol) {
_viewModel = State(initialValue: OnboardingViewModel(onboardingRepository: onboardingRepository))
}
var body: some View {
NavigationStack {
contentView
}
}
}
// MARK: - private
private extension OnboardingView {
var contentView: some View {
@ViewBuilder var contentView: some View {
VStack {
SwiftUI.TabView {
welcomePage
ForEach(viewModel.onboardings) { onboarding in
let id = onboarding.id
page(
image: "onboarding\(id)",
text: viewModel.onboardingDescription(index: id),
imageOrientation: onboarding.imageOrientation
)
}
}
.tabViewStyle(.page(indexDisplayMode: .always))
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Link(Strings.supportWebsite, destination: URL(string: Strings.supportWebsiteUrl)!)
}
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink(destination: SignUpOrSignInView()) {
Text(verbatim: "Start")
.font(.title)
}
}
}
}
}
return contentView
}
private var logo: some View {
Image("logo")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 256, height: 24)
}
private var welcomePage: some View {
ZStack(alignment: .bottom) {
Image("hero")
.resizable()
.aspectRatio(contentMode: .fit)
.padding(.top, NativeAppTemplateConstants.Spacing.md)
.padding(.bottom, 192)
ZStack(alignment: .top) {
VStack {
Text(Strings.welcomeToApp)
.font(.largeTitle)
.fontWeight(.bold)
.multilineTextAlignment(.center)
.dynamicTypeSize(DynamicTypeSize.accessibility1)
.padding([.top, .horizontal])
.accessibilityIdentifier("OnboardingView_welcome_staticText")
}
.background(Color.backgroundColor)
.frame(maxWidth: .infinity, maxHeight: 192, alignment: .top)
}
.background(Color.backgroundColor)
}
}
private func page(image: String, text: String, imageOrientation: ImageOrientation) -> some View {
ZStack(alignment: .bottom) {
Image(image)
.resizable()
.aspectRatio(contentMode: .fit)
.padding(.top, NativeAppTemplateConstants.Spacing.md)
.padding(.bottom, imageOrientation == .portrait ? 0 : 192)
ZStack(alignment: .top) {
VStack {
Text(.init(text))
.dynamicTypeSize(DynamicTypeSize.accessibility1)
.padding([.top, .horizontal])
.accessibilityIdentifier("OnboardingView_descriptoion_staticText")
}
.background(Color.backgroundColor)
.frame(maxWidth: .infinity, maxHeight: 192, alignment: .top)
}
.background(Color.backgroundColor)
}
}
struct OnboardingView_Previews: PreviewProvider {
static var previews: some View {
OnboardingView(onboardingRepository: OnboardingRepository())
}
}
}