Skip to content

Commit eec1a0e

Browse files
committed
[BOOK-183] feat: 온보딩 화면 UI 구현
1 parent 9bd9835 commit eec1a0e

File tree

10 files changed

+209
-149
lines changed

10 files changed

+209
-149
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,17 @@ dependencies {
4747
projects.core.network,
4848
projects.core.ui,
4949

50+
projects.feature.detail,
5051
projects.feature.home,
5152
projects.feature.library,
5253
projects.feature.login,
5354
projects.feature.main,
55+
projects.feature.onboarding,
5456
projects.feature.record,
5557
projects.feature.screens,
5658
projects.feature.search,
5759
projects.feature.settings,
5860
projects.feature.webview,
59-
projects.feature.detail,
6061

6162
libs.androidx.activity.compose,
6263
libs.androidx.startup,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.ninecraft.booket.core.common.utils
2+
3+
import android.annotation.SuppressLint
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.ui.graphics.Color
6+
import androidx.compose.ui.text.AnnotatedString
7+
import androidx.compose.ui.text.SpanStyle
8+
import androidx.compose.ui.text.buildAnnotatedString
9+
import androidx.compose.ui.text.withStyle
10+
11+
@SuppressLint("ComposableNaming")
12+
@Composable
13+
fun HighlightedText(
14+
fullText: String,
15+
highlightText: String,
16+
highlightColor: Color,
17+
): AnnotatedString {
18+
return buildAnnotatedString {
19+
val startIndex = fullText.indexOf(highlightText)
20+
if (startIndex != -1) {
21+
append(fullText.substring(0, startIndex))
22+
withStyle(style = SpanStyle(color = highlightColor)) {
23+
append(highlightText)
24+
}
25+
append(fullText.substring(startIndex + highlightText.length))
26+
} else {
27+
append(fullText)
28+
}
29+
}
30+
}

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/NetworkImage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ fun NetworkImage(
1919
imageUrl: String,
2020
contentDescription: String,
2121
modifier: Modifier = Modifier,
22-
placeholder: Painter? = null,
22+
placeholder: Painter? = painterResource(R.drawable.ic_placeholder),
2323
contentScale: ContentScale = ContentScale.Crop,
2424
) {
2525
CoilImage(

core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/ResourceImage.kt renamed to core/designsystem/src/main/kotlin/com/ninecraft/booket/core/designsystem/component/ResourceImage.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
package com.ninecraft.booket.core.designsystem
1+
package com.ninecraft.booket.core.designsystem.component
22

33
import androidx.annotation.DrawableRes
44
import androidx.compose.runtime.Composable
55
import androidx.compose.ui.Alignment
66
import androidx.compose.ui.Modifier
77
import androidx.compose.ui.graphics.painter.Painter
88
import androidx.compose.ui.layout.ContentScale
9+
import androidx.compose.ui.res.painterResource
10+
import com.ninecraft.booket.core.designsystem.ComponentPreview
11+
import com.ninecraft.booket.core.designsystem.R
12+
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
913
import com.skydoves.landscapist.ImageOptions
1014
import com.skydoves.landscapist.coil.CoilImage
1115
import com.skydoves.landscapist.components.rememberImageComponent
@@ -16,7 +20,7 @@ fun ResourceImage(
1620
@DrawableRes imageRes: Int,
1721
contentDescription: String,
1822
modifier: Modifier = Modifier,
19-
placeholder: Painter? = null,
23+
placeholder: Painter? = painterResource(R.drawable.ic_placeholder),
2024
contentScale: ContentScale = ContentScale.Crop,
2125
) {
2226
CoilImage(
@@ -34,3 +38,15 @@ fun ResourceImage(
3438
previewPlaceholder = placeholder,
3539
)
3640
}
41+
42+
@ComponentPreview
43+
@Composable
44+
private fun ResourceImagePreview() {
45+
ReedTheme {
46+
ResourceImage(
47+
imageRes = 0,
48+
contentDescription = "",
49+
placeholder = painterResource(R.drawable.ic_placeholder),
50+
)
51+
}
52+
}

feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementPresenter.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import androidx.compose.runtime.mutableStateOf
77
import androidx.compose.runtime.remember
88
import androidx.compose.runtime.setValue
99
import com.ninecraft.booket.core.common.constants.WebViewConstants
10-
import com.ninecraft.booket.feature.screens.BottomNavigationScreen
10+
import com.ninecraft.booket.feature.screens.OnboardingScreen
1111
import com.ninecraft.booket.feature.screens.TermsAgreementScreen
1212
import com.ninecraft.booket.feature.screens.WebViewScreen
1313
import com.slack.circuit.codegen.annotations.CircuitInject
@@ -59,7 +59,9 @@ class TermsAgreementPresenter @AssistedInject constructor(
5959
}
6060

6161
is TermsAgreementUiEvent.OnStartButtonClick -> {
62-
navigator.resetRoot(BottomNavigationScreen)
62+
// TODO 온보딩 완료 여부 확인
63+
// navigator.resetRoot(BottomNavigationScreen)
64+
navigator.resetRoot(OnboardingScreen)
6365
}
6466
}
6567
}
Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11

2+
package com.ninecraft.booket.feature.onboarding
3+
4+
import androidx.compose.foundation.pager.rememberPagerState
25
import androidx.compose.runtime.Composable
36
import androidx.compose.runtime.rememberCoroutineScope
4-
import com.ninecraft.booket.feature.onboarding.OnboardingUiEvent
5-
import com.ninecraft.booket.feature.onboarding.OnboardingUiState
67
import com.ninecraft.booket.feature.screens.HomeScreen
78
import com.ninecraft.booket.feature.screens.OnboardingScreen
89
import com.slack.circuit.codegen.annotations.CircuitInject
@@ -12,32 +13,44 @@ import dagger.assisted.Assisted
1213
import dagger.assisted.AssistedFactory
1314
import dagger.assisted.AssistedInject
1415
import dagger.hilt.android.components.ActivityRetainedComponent
16+
import kotlinx.coroutines.launch
17+
18+
const val ONBOARDING_STEPS_COUNT = 3
1519

16-
@Suppress("unused")
17-
class HomePresenter @AssistedInject constructor(
20+
class OnboardingPresenter @AssistedInject constructor(
1821
@Assisted private val navigator: Navigator,
1922
) : Presenter<OnboardingUiState> {
2023

2124
@Composable
2225
override fun present(): OnboardingUiState {
2326
val scope = rememberCoroutineScope()
27+
val pagerState = rememberPagerState(pageCount = { ONBOARDING_STEPS_COUNT })
2428

2529
fun handleEvent(event: OnboardingUiEvent) {
2630
when (event) {
2731
is OnboardingUiEvent.OnNextButtonClick -> {
28-
navigator.resetRoot(HomeScreen)
32+
if (event.currentStep == 2) {
33+
navigator.resetRoot(HomeScreen)
34+
} else {
35+
pagerState.let { state ->
36+
scope.launch {
37+
state.animateScrollToPage(event.currentStep + 1)
38+
}
39+
}
40+
}
2941
}
3042
}
3143
}
3244

3345
return OnboardingUiState(
46+
pagerState = pagerState,
3447
eventSink = ::handleEvent,
3548
)
3649
}
3750

3851
@CircuitInject(OnboardingScreen::class, ActivityRetainedComponent::class)
3952
@AssistedFactory
4053
fun interface Factory {
41-
fun create(navigator: Navigator): HomePresenter
54+
fun create(navigator: Navigator): OnboardingPresenter
4255
}
4356
}

0 commit comments

Comments
 (0)