Skip to content

Commit bb19540

Browse files
authored
Merge pull request #31 from YAPP-Github/feature/#20-onboarding
[Feature/#20] 온보딩 화면 구현
2 parents 2d2ccf7 + e98e196 commit bb19540

48 files changed

Lines changed: 2113 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/src/main/java/com/threegap/bitnagil/di/data/DataSourceModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import com.threegap.bitnagil.data.auth.datasource.AuthLocalDataSource
44
import com.threegap.bitnagil.data.auth.datasource.AuthRemoteDataSource
55
import com.threegap.bitnagil.data.auth.datasourceimpl.AuthLocalDataSourceImpl
66
import com.threegap.bitnagil.data.auth.datasourceimpl.AuthRemoteDataSourceImpl
7+
import com.threegap.bitnagil.data.onboarding.datasource.OnBoardingDataSource
8+
import com.threegap.bitnagil.data.onboarding.datasourceImpl.OnBoardingDataSourceImpl
79
import dagger.Binds
810
import dagger.Module
911
import dagger.hilt.InstallIn
@@ -21,4 +23,8 @@ abstract class DataSourceModule {
2123
@Binds
2224
@Singleton
2325
abstract fun bindAuthLocalDataSource(authLocalDataSourceImpl: AuthLocalDataSourceImpl): AuthLocalDataSource
26+
27+
@Binds
28+
@Singleton
29+
abstract fun bindOnBoardingDataSource(onBoardingDataSourceImpl: OnBoardingDataSourceImpl): OnBoardingDataSource
2430
}

app/src/main/java/com/threegap/bitnagil/di/data/RepositoryModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.threegap.bitnagil.di.data
22

33
import com.threegap.bitnagil.data.auth.repositoryimpl.AuthRepositoryImpl
4+
import com.threegap.bitnagil.data.onboarding.repositoryImpl.OnBoardingRepositoryImpl
45
import com.threegap.bitnagil.domain.auth.repository.AuthRepository
6+
import com.threegap.bitnagil.domain.onboarding.repository.OnBoardingRepository
57
import dagger.Binds
68
import dagger.Module
79
import dagger.hilt.InstallIn
@@ -15,4 +17,8 @@ abstract class RepositoryModule {
1517
@Binds
1618
@Singleton
1719
abstract fun bindAuthRepository(authRepositoryImpl: AuthRepositoryImpl): AuthRepository
20+
21+
@Binds
22+
@Singleton
23+
abstract fun bindOnBoardingRepository(onBoardingRepositoryImpl: OnBoardingRepositoryImpl): OnBoardingRepository
1824
}

app/src/main/java/com/threegap/bitnagil/di/data/ServiceModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.threegap.bitnagil.di.data
22

33
import com.threegap.bitnagil.data.auth.service.AuthService
4+
import com.threegap.bitnagil.data.onboarding.service.OnBoardingService
45
import com.threegap.bitnagil.di.core.Auth
56
import dagger.Module
67
import dagger.Provides
@@ -17,4 +18,9 @@ object ServiceModule {
1718
@Singleton
1819
fun provideAuthService(@Auth retrofit: Retrofit): AuthService =
1920
retrofit.create(AuthService::class.java)
21+
22+
@Provides
23+
@Singleton
24+
fun providerOnBoardingService(@Auth retrofit: Retrofit): OnBoardingService =
25+
retrofit.create(OnBoardingService::class.java)
2026
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.threegap.bitnagil.data.onboarding.datasource
2+
3+
import com.threegap.bitnagil.data.onboarding.model.dto.OnBoardingAbstractDto
4+
import com.threegap.bitnagil.data.onboarding.model.dto.OnBoardingDto
5+
import com.threegap.bitnagil.data.onboarding.model.request.GetOnBoardingRecommendRoutinesRequest
6+
import com.threegap.bitnagil.data.onboarding.model.response.GetOnBoardingRecommendRoutinesResponse
7+
8+
interface OnBoardingDataSource {
9+
suspend fun getOnBoardingList(): List<OnBoardingDto>
10+
suspend fun getOnBoardingRecommendRoutines(request: GetOnBoardingRecommendRoutinesRequest): Result<GetOnBoardingRecommendRoutinesResponse>
11+
suspend fun getOnBoardingAbstract(selectedOnBoardingItemIdList: List<Pair<String, List<String>>>): OnBoardingAbstractDto
12+
suspend fun registerRecommendRoutineList(selectedRecommendRoutineIds: List<Int>): Result<Unit>
13+
}
Lines changed: 282 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
package com.threegap.bitnagil.data.onboarding.datasourceImpl
2+
3+
import com.threegap.bitnagil.data.common.safeApiCall
4+
import com.threegap.bitnagil.data.onboarding.datasource.OnBoardingDataSource
5+
import com.threegap.bitnagil.data.onboarding.model.dto.OnBoardingAbstractDto
6+
import com.threegap.bitnagil.data.onboarding.model.dto.OnBoardingAbstractTextDto
7+
import com.threegap.bitnagil.data.onboarding.model.dto.OnBoardingAbstractTextItemDto
8+
import com.threegap.bitnagil.data.onboarding.model.dto.OnBoardingDto
9+
import com.threegap.bitnagil.data.onboarding.model.dto.OnBoardingItemDto
10+
import com.threegap.bitnagil.data.onboarding.model.request.GetOnBoardingRecommendRoutinesRequest
11+
import com.threegap.bitnagil.data.onboarding.model.request.RegisterOnBoardingRecommendRoutinesRequest
12+
import com.threegap.bitnagil.data.onboarding.model.response.GetOnBoardingRecommendRoutinesResponse
13+
import com.threegap.bitnagil.data.onboarding.service.OnBoardingService
14+
import javax.inject.Inject
15+
16+
class OnBoardingDataSourceImpl @Inject constructor(
17+
private val onBoardingService: OnBoardingService,
18+
) : OnBoardingDataSource {
19+
private val onBoardingDtoList = listOf(
20+
OnBoardingDto.TimeSlot,
21+
OnBoardingDto.RealOutingFrequency,
22+
OnBoardingDto.EmotionType,
23+
OnBoardingDto.TargetOutingFrequency,
24+
)
25+
26+
override suspend fun getOnBoardingList(): List<OnBoardingDto> {
27+
return onBoardingDtoList
28+
}
29+
30+
override suspend fun getOnBoardingRecommendRoutines(request: GetOnBoardingRecommendRoutinesRequest): Result<GetOnBoardingRecommendRoutinesResponse> {
31+
return safeApiCall {
32+
onBoardingService.postOnBoarding(request)
33+
}
34+
}
35+
36+
override suspend fun getOnBoardingAbstract(selectedOnBoardingItemIdList: List<Pair<String, List<String>>>): OnBoardingAbstractDto {
37+
val onBoardingAbstractTextList = mutableListOf<OnBoardingAbstractTextDto>()
38+
39+
for ((onBoardingId, selectedOnBoardingDetailIdList) in selectedOnBoardingItemIdList) {
40+
val onBoardingAbstractText = getOnBoardingAbstractText(onBoardingId, selectedOnBoardingDetailIdList)
41+
if (onBoardingAbstractText != null) {
42+
onBoardingAbstractTextList.add(onBoardingAbstractText)
43+
}
44+
}
45+
46+
return OnBoardingAbstractDto(
47+
prefixText = "당신은 지금",
48+
detailTextsList = onBoardingAbstractTextList,
49+
)
50+
}
51+
52+
override suspend fun registerRecommendRoutineList(selectedRecommendRoutineIds: List<Int>): Result<Unit> {
53+
val registerRecommendRoutineListRequest = RegisterOnBoardingRecommendRoutinesRequest(recommendedRoutineIds = selectedRecommendRoutineIds)
54+
return safeApiCall {
55+
onBoardingService.postOnBoardingRoutines(registerRecommendRoutineListRequest)
56+
}
57+
}
58+
59+
private fun getOnBoardingAbstractText(onBoardingId: String, selectedOnBoardingDetailIdList: List<String>): OnBoardingAbstractTextDto? {
60+
if (selectedOnBoardingDetailIdList.isEmpty()) return null
61+
val onBoarding = onBoardingDtoList.find { it.id == onBoardingId }
62+
if (onBoarding == null) return null
63+
64+
val isMultipleSelect = onBoarding.multipleSelectable
65+
return if (isMultipleSelect) {
66+
getMultipleSelectOnBoardingAbstractText(onBoardingId, selectedOnBoardingDetailIdList)
67+
} else {
68+
getSingleSelectOnBoardingAbstractText(onBoardingId, selectedOnBoardingDetailIdList.first())
69+
}
70+
}
71+
72+
private fun getSingleSelectOnBoardingAbstractText(onBoardingId: String, onBoardingDetailId: String): OnBoardingAbstractTextDto? {
73+
when (onBoardingId) {
74+
OnBoardingDto.TimeSlot.id -> {
75+
return when (onBoardingDetailId) {
76+
OnBoardingItemDto.Morning.id -> {
77+
OnBoardingAbstractTextDto(
78+
textItemList = listOf(
79+
OnBoardingAbstractTextItemDto(
80+
text = "아침루틴",
81+
isBold = true,
82+
),
83+
OnBoardingAbstractTextItemDto(
84+
text = "을 만들고 싶고",
85+
isBold = false,
86+
),
87+
),
88+
)
89+
}
90+
OnBoardingItemDto.Evening.id -> {
91+
OnBoardingAbstractTextDto(
92+
textItemList = listOf(
93+
OnBoardingAbstractTextItemDto(
94+
text = "저녁루틴",
95+
isBold = true,
96+
),
97+
OnBoardingAbstractTextItemDto(
98+
text = "을 만들고 싶고",
99+
isBold = false,
100+
),
101+
),
102+
)
103+
}
104+
OnBoardingItemDto.Nothing.id -> {
105+
OnBoardingAbstractTextDto(
106+
textItemList = listOf(
107+
OnBoardingAbstractTextItemDto(
108+
text = "전체 루틴",
109+
isBold = true,
110+
),
111+
OnBoardingAbstractTextItemDto(
112+
text = "을 회복하고 싶고",
113+
isBold = false,
114+
),
115+
),
116+
)
117+
}
118+
else -> {
119+
null
120+
}
121+
}
122+
}
123+
OnBoardingDto.TargetOutingFrequency.id -> {
124+
return when (onBoardingDetailId) {
125+
OnBoardingItemDto.TargetOutingOneToTwoPerWeek.id -> {
126+
OnBoardingAbstractTextDto(
127+
textItemList = listOf(
128+
OnBoardingAbstractTextItemDto(
129+
text = "주 1회 외출을",
130+
isBold = true,
131+
),
132+
OnBoardingAbstractTextItemDto(
133+
text = " 목표로 해볼게요!",
134+
isBold = false,
135+
),
136+
),
137+
)
138+
}
139+
OnBoardingItemDto.TargetOutingThreeToFourPerWeek.id -> {
140+
OnBoardingAbstractTextDto(
141+
textItemList = listOf(
142+
OnBoardingAbstractTextItemDto(
143+
text = "주3회 외출을",
144+
isBold = true,
145+
),
146+
OnBoardingAbstractTextItemDto(
147+
text = " 목표로 해볼게요!",
148+
isBold = false,
149+
),
150+
),
151+
)
152+
}
153+
OnBoardingItemDto.TargetOutingMoreThenFivePerWeek.id -> {
154+
OnBoardingAbstractTextDto(
155+
textItemList = listOf(
156+
OnBoardingAbstractTextItemDto(
157+
text = "주 4회 이상 외출을",
158+
isBold = true,
159+
),
160+
OnBoardingAbstractTextItemDto(
161+
text = " 목표로 해볼게요!",
162+
isBold = false,
163+
),
164+
),
165+
)
166+
}
167+
OnBoardingItemDto.TargetOutingUnknown.id -> {
168+
OnBoardingAbstractTextDto(
169+
textItemList = listOf(
170+
OnBoardingAbstractTextItemDto(
171+
text = "최소한의 외출을",
172+
isBold = true,
173+
),
174+
OnBoardingAbstractTextItemDto(
175+
text = " 목표로 해볼게요!",
176+
isBold = false,
177+
),
178+
),
179+
)
180+
}
181+
else -> {
182+
null
183+
}
184+
}
185+
}
186+
else -> {
187+
return null
188+
}
189+
}
190+
}
191+
192+
private fun getMultipleSelectOnBoardingAbstractText(onBoardingId: String, onBoardingDetailIdList: List<String>): OnBoardingAbstractTextDto {
193+
val onBoardingAbstractTextItemList = mutableListOf<OnBoardingAbstractTextItemDto>()
194+
195+
when (onBoardingId) {
196+
OnBoardingDto.EmotionType.id -> {
197+
for (onBoardingDetailId in onBoardingDetailIdList) {
198+
when (onBoardingDetailId) {
199+
OnBoardingItemDto.Stability.id -> {
200+
onBoardingAbstractTextItemList.apply {
201+
add(
202+
OnBoardingAbstractTextItemDto(
203+
text = "안정감",
204+
isBold = true,
205+
),
206+
)
207+
add(
208+
OnBoardingAbstractTextItemDto(
209+
text = ", ",
210+
isBold = false,
211+
),
212+
)
213+
}
214+
}
215+
OnBoardingItemDto.Connectedness.id -> {
216+
onBoardingAbstractTextItemList.apply {
217+
add(
218+
OnBoardingAbstractTextItemDto(
219+
text = "연결감",
220+
isBold = true,
221+
),
222+
)
223+
add(
224+
OnBoardingAbstractTextItemDto(
225+
text = ", ",
226+
isBold = false,
227+
),
228+
)
229+
}
230+
}
231+
OnBoardingItemDto.Vitality.id -> {
232+
onBoardingAbstractTextItemList.apply {
233+
add(
234+
OnBoardingAbstractTextItemDto(
235+
text = "생동감",
236+
isBold = true,
237+
),
238+
)
239+
add(
240+
OnBoardingAbstractTextItemDto(
241+
text = ", ",
242+
isBold = false,
243+
),
244+
)
245+
}
246+
}
247+
OnBoardingItemDto.Growth.id -> {
248+
onBoardingAbstractTextItemList.apply {
249+
add(
250+
OnBoardingAbstractTextItemDto(
251+
text = "성장감",
252+
isBold = true,
253+
),
254+
)
255+
add(
256+
OnBoardingAbstractTextItemDto(
257+
text = ", ",
258+
isBold = false,
259+
),
260+
)
261+
}
262+
}
263+
}
264+
}
265+
}
266+
else -> {
267+
}
268+
}
269+
270+
onBoardingAbstractTextItemList.removeLastOrNull()
271+
onBoardingAbstractTextItemList.add(
272+
OnBoardingAbstractTextItemDto(
273+
text = "을 원하는 중이에요.",
274+
isBold = false,
275+
),
276+
)
277+
278+
return OnBoardingAbstractTextDto(
279+
textItemList = onBoardingAbstractTextItemList,
280+
)
281+
}
282+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.threegap.bitnagil.data.onboarding.model.dto
2+
3+
import com.threegap.bitnagil.domain.onboarding.model.OnBoardingAbstract
4+
5+
data class OnBoardingAbstractDto(
6+
val prefixText: String,
7+
val detailTextsList: List<OnBoardingAbstractTextDto>,
8+
) {
9+
fun toOnBoardingAbstract(): OnBoardingAbstract {
10+
return OnBoardingAbstract(
11+
prefix = prefixText,
12+
abstractTexts = detailTextsList.map { detailTexts ->
13+
detailTexts.toOnBoardingAbstractText()
14+
},
15+
)
16+
}
17+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.threegap.bitnagil.data.onboarding.model.dto
2+
3+
import com.threegap.bitnagil.domain.onboarding.model.OnBoardingAbstractText
4+
5+
data class OnBoardingAbstractTextDto(
6+
val textItemList: List<OnBoardingAbstractTextItemDto>,
7+
) {
8+
fun toOnBoardingAbstractText(): OnBoardingAbstractText {
9+
return OnBoardingAbstractText(
10+
textItems = textItemList.map { textItemDto ->
11+
textItemDto.toOnBoardingAbstractTextItem()
12+
},
13+
)
14+
}
15+
}

0 commit comments

Comments
 (0)