-
Notifications
You must be signed in to change notification settings - Fork 0
/
OnboardingFeature.swift
152 lines (127 loc) ยท 4.54 KB
/
OnboardingFeature.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
152
//
// Onboarding.swift
// Features
//
// Created by ์ด์๋น on 2023/08/10.
// Copyright ยฉ 2023 team.humanwave. All rights reserved.
//
import Foundation
import ComposableArchitecture
import DSKit
import Domain
public enum LottieType: CaseIterable {
case splash1
case splash2
case splash3
case question
var lottie: AnimationAsset {
switch self {
case .splash1:
return AnimationAsset.splash1
case .splash2:
return AnimationAsset.splash2
case .splash3:
return AnimationAsset.splash3
case .question:
return AnimationAsset.question
}
}
var title: String {
switch self {
case .splash1:
return "์น๊ตฌ๋ค์ด ์๊ฐํ๋\n๋์ ์ฑ๊ฒฉ์ ๋ฐ๊ฒฌํ๊ณ "
case .splash2:
return "๋ด๊ฐ ์๊ฐํ ๋์ ์ฑ๊ฒฉ๊ณผ\n๋น๊ตํด๋ณด์ธ์"
case .splash3:
return ""
case .question:
return "ํ์ํด์ ํค๋ฏธ๋!\n์ด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณผ๊น์?" // FIXME: fixme
}
}
}
public struct OnboardingFeature: Reducer {
public enum Status: Equatable {
case notDetermined
case needsOnboarding
case completed
}
public struct State: Equatable {
@PresentationState public var keymeTestsState: KeymeTestsFeature.State?
public var testResultState: TestResultFeature.State?
public var status: Status = .notDetermined
public var testId: Int
public var lottieType: LottieType = .splash1
public var isButtonShown: Bool = false
public var isLoop: Bool = false
public var isBlackBackground: Bool = false
public var isShared: Bool = false
let authorizationToken: String
let nickname: String
public init(authorizationToken: String, nickname: String, testId: Int) {
self.authorizationToken = authorizationToken
self.nickname = nickname
self.testId = testId
}
}
public enum Action: Equatable {
case keymeTests(PresentationAction<KeymeTestsFeature.Action>)
case testResult(TestResultFeature.Action)
case nextButtonDidTap
case lottieEnded
case startButtonDidTap
case showResult(data: KeymeWebViewModel)
case succeeded
case failed
}
@Dependency(\.keymeTestsClient) var keymeTestsClient
public init() { }
public var body: some Reducer<State, Action> {
Reduce { state, action in
switch action {
case .nextButtonDidTap:
if state.lottieType == .splash2 {
state.isBlackBackground = true
}
state.lottieType = state.lottieType.next()
state.isLoop = false
state.isButtonShown = false
case .lottieEnded:
state.isButtonShown = true
if state.lottieType == .splash3 {
state.lottieType = .question
state.isLoop = true
} else {
state.isLoop = true
}
case .startButtonDidTap:
let url = "https://keyme-frontend.vercel.app/test/\(state.testId)"
state.keymeTestsState = KeymeTestsFeature.State(url: url, authorizationToken: state.authorizationToken)
case .keymeTests(.presented(.view(.showResult(let data)))):
return .send(.showResult(data: data))
case .showResult(data: let data):
state.testResultState = TestResultFeature.State(
testResultId: data.testResultId,
testId: state.testId,
nickname: state.nickname
)
case .succeeded, .failed:
return .none
case .keymeTests(.dismiss):
break
case .testResult(.closeButtonDidTap):
state.status = .completed
case .keymeTests(.presented(.close)):
state.keymeTestsState = nil
default:
break
}
return .none
}
.ifLet(\.$keymeTestsState, action: /Action.keymeTests) {
KeymeTestsFeature()
}
.ifLet(\.testResultState, action: /Action.testResult) {
TestResultFeature()
}
}
}