Skip to content

Commit e98e196

Browse files
committed
FEAT: 온보딩 추천 루팅 등록없이 건너뛰기 버튼 추가
1 parent 0c3f7f0 commit e98e196

5 files changed

Lines changed: 80 additions & 1 deletion

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.threegap.bitnagil.presentation.common.flow
2+
3+
import android.annotation.SuppressLint
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.LaunchedEffect
6+
import kotlinx.coroutines.flow.Flow
7+
import kotlinx.coroutines.flow.flowOn
8+
import kotlinx.coroutines.flow.launchIn
9+
import kotlinx.coroutines.flow.onEach
10+
import kotlin.coroutines.CoroutineContext
11+
import kotlin.coroutines.EmptyCoroutineContext
12+
13+
@SuppressLint("ComposableNaming")
14+
@Composable
15+
fun <T> Flow<T>.collectAsEffect(
16+
context: CoroutineContext = EmptyCoroutineContext,
17+
block: (T) -> Unit,
18+
) {
19+
LaunchedEffect(Unit) {
20+
onEach(block).flowOn(context).launchIn(this)
21+
}
22+
}

presentation/src/main/java/com/threegap/bitnagil/presentation/onboarding/OnBoardingScreen.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,34 @@ import androidx.compose.ui.graphics.Color
1515
import androidx.compose.ui.tooling.preview.Preview
1616
import androidx.compose.ui.unit.dp
1717
import androidx.hilt.navigation.compose.hiltViewModel
18+
import com.threegap.bitnagil.presentation.common.flow.collectAsEffect
1819
import com.threegap.bitnagil.presentation.onboarding.component.atom.iconbutton.IconButton
1920
import com.threegap.bitnagil.presentation.onboarding.component.atom.progress.OnBoardingProgressBar
2021
import com.threegap.bitnagil.presentation.onboarding.component.template.OnBoardingAbstractTemplate
2122
import com.threegap.bitnagil.presentation.onboarding.component.template.OnBoardingSelectTemplate
2223
import com.threegap.bitnagil.presentation.onboarding.model.OnBoardingPageInfo
24+
import com.threegap.bitnagil.presentation.onboarding.model.mvi.OnBoardingSideEffect
2325
import com.threegap.bitnagil.presentation.onboarding.model.mvi.OnBoardingState
2426

2527
@Composable
2628
fun OnBoardingScreenContainer(
2729
onBoardingViewModel: OnBoardingViewModel = hiltViewModel(),
30+
navigateToHome: () -> Unit,
31+
navigateToBack: () -> Unit,
2832
) {
2933
val state by onBoardingViewModel.stateFlow.collectAsState()
3034

35+
onBoardingViewModel.sideEffectFlow.collectAsEffect { sideEffect ->
36+
when (sideEffect) {
37+
OnBoardingSideEffect.MoveToPreviousScreen -> {
38+
navigateToBack()
39+
}
40+
OnBoardingSideEffect.NavigateToHomeScreen -> {
41+
navigateToHome()
42+
}
43+
}
44+
}
45+
3146
OnBoardingScreen(
3247
state = state,
3348
onClickNext = onBoardingViewModel::selectNext,
@@ -37,11 +52,12 @@ fun OnBoardingScreenContainer(
3752
loadRecommendRoutines = onBoardingViewModel::loadRecommendRoutines,
3853
onClickRegister = onBoardingViewModel::registerRecommendRoutines,
3954
cancelRecommendRoutines = onBoardingViewModel::cancelLoadRecommendRoutines,
55+
onClickSkip = onBoardingViewModel::skipRegisterRecommendRoutines,
4056
)
4157
}
4258

4359
@Composable
44-
fun OnBoardingScreen(
60+
private fun OnBoardingScreen(
4561
state: OnBoardingState,
4662
onClickNext: () -> Unit,
4763
onClickPreviousInSelectOnBoarding: () -> Unit,
@@ -50,6 +66,7 @@ fun OnBoardingScreen(
5066
loadRecommendRoutines: () -> Unit,
5167
cancelRecommendRoutines: () -> Unit,
5268
onClickRegister: () -> Unit,
69+
onClickSkip: () -> Unit,
5370
) {
5471
Column(
5572
modifier = Modifier.background(color = Color(0xFFF7F7F8)),
@@ -90,6 +107,7 @@ fun OnBoardingScreen(
90107
nextButtonEnable = state.nextButtonEnable,
91108
onClickNextButton = onClickRegister,
92109
onClickItem = onClickRoutine,
110+
onClickSkip = onClickSkip,
93111
)
94112
}
95113
is OnBoardingPageInfo.SelectOnBoarding -> {
@@ -129,5 +147,6 @@ fun OnBoardingScreenPreview() {
129147
loadRecommendRoutines = {},
130148
onClickRegister = {},
131149
cancelRecommendRoutines = {},
150+
onClickSkip = {},
132151
)
133152
}

presentation/src/main/java/com/threegap/bitnagil/presentation/onboarding/OnBoardingViewModel.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,4 +299,10 @@ class OnBoardingViewModel @Inject constructor(
299299
)
300300
}
301301
}
302+
303+
fun skipRegisterRecommendRoutines() {
304+
viewModelScope.launch {
305+
sendIntent(intent = OnBoardingIntent.NavigateToHome)
306+
}
307+
}
302308
}

presentation/src/main/java/com/threegap/bitnagil/presentation/onboarding/component/template/OnBoardingSelectTemplate.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
package com.threegap.bitnagil.presentation.onboarding.component.template
22

3+
import androidx.compose.foundation.clickable
4+
import androidx.compose.foundation.interaction.MutableInteractionSource
5+
import androidx.compose.foundation.layout.Box
36
import androidx.compose.foundation.layout.Column
47
import androidx.compose.foundation.layout.Spacer
8+
import androidx.compose.foundation.layout.fillMaxWidth
59
import androidx.compose.foundation.layout.height
610
import androidx.compose.foundation.layout.padding
711
import androidx.compose.foundation.rememberScrollState
812
import androidx.compose.foundation.verticalScroll
913
import androidx.compose.material3.Text
1014
import androidx.compose.runtime.Composable
15+
import androidx.compose.runtime.remember
16+
import androidx.compose.ui.Alignment
1117
import androidx.compose.ui.Modifier
1218
import androidx.compose.ui.text.TextStyle
19+
import androidx.compose.ui.text.style.TextAlign
20+
import androidx.compose.ui.text.style.TextDecoration
1321
import androidx.compose.ui.unit.dp
1422
import androidx.compose.ui.unit.sp
1523
import com.threegap.bitnagil.presentation.onboarding.component.atom.textbutton.TextButton
@@ -25,6 +33,7 @@ fun OnBoardingSelectTemplate(
2533
nextButtonEnable: Boolean = false,
2634
onClickNextButton: () -> Unit,
2735
onClickItem: (String) -> Unit,
36+
onClickSkip: (() -> Unit)? = null,
2837
) {
2938
val titleTextStyle = TextStyle(fontSize = 20.sp)
3039
val subTextStyle = TextStyle(fontSize = 14.sp)
@@ -68,5 +77,27 @@ fun OnBoardingSelectTemplate(
6877
onClick = onClickNextButton,
6978
enabled = nextButtonEnable,
7079
)
80+
81+
onClickSkip?.let {
82+
Spacer(modifier = Modifier.height(10.dp))
83+
84+
Box(
85+
modifier = Modifier
86+
.fillMaxWidth()
87+
.height(54.dp)
88+
.clickable(
89+
indication = null,
90+
interactionSource = remember { MutableInteractionSource() },
91+
onClick = onClickSkip,
92+
),
93+
contentAlignment = Alignment.Center,
94+
) {
95+
Text(
96+
text = "건너뛰기",
97+
style = TextStyle(textDecoration = TextDecoration.Underline),
98+
textAlign = TextAlign.Center,
99+
)
100+
}
101+
}
71102
}
72103
}

presentation/src/main/java/com/threegap/bitnagil/presentation/onboarding/component/template/Preview.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@ fun OnBoardingTemplatePreview() {
3434
),
3535
onClickNextButton = {},
3636
onClickItem = {},
37+
onClickSkip = {},
3738
)
3839
}

0 commit comments

Comments
 (0)