Skip to content

Commit d440a17

Browse files
authored
Merge pull request #61 from YAPP-Github/BOOK-155-feature/#60
feat: 서비스이용약관, 개인정보처리방침 웹뷰 환경 구성
2 parents f6ac5a6 + 83d6b37 commit d440a17

File tree

23 files changed

+308
-70
lines changed

23 files changed

+308
-70
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ dependencies {
5353
projects.feature.login,
5454
projects.feature.search,
5555
projects.feature.settings,
56+
projects.feature.webview,
5657

5758
libs.androidx.activity.compose,
5859
libs.androidx.startup,

app/src/main/kotlin/com/ninecraft/booket/di/CircuitModule.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ abstract class CircuitModule {
2828
): Circuit = Circuit.Builder()
2929
.addPresenterFactories(presenterFactories)
3030
.addUiFactories(uiFactories)
31+
// .setAnimatedNavDecoratorFactory(CrossFadeNavDecoratorFactory())
3132
.build()
3233
}
3334
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.ninecraft.booket.di
2+
3+
import androidx.compose.animation.AnimatedContentTransitionScope
4+
import androidx.compose.animation.ContentTransform
5+
import androidx.compose.animation.core.tween
6+
import androidx.compose.animation.fadeIn
7+
import androidx.compose.animation.fadeOut
8+
import androidx.compose.animation.togetherWith
9+
import com.slack.circuit.backstack.NavArgument
10+
import com.slack.circuit.foundation.NavigatorDefaults
11+
import com.slack.circuit.foundation.animation.AnimatedNavDecorator
12+
import com.slack.circuit.foundation.animation.AnimatedNavEvent
13+
import com.slack.circuit.foundation.animation.AnimatedNavState
14+
15+
data class CrossFadeNavDecoratorFactory(val durationMillis: Int = 300) :
16+
AnimatedNavDecorator.Factory {
17+
override fun <T : NavArgument> create(): AnimatedNavDecorator<T, *> =
18+
CrossFadeNavDecorator(durationMillis)
19+
}
20+
21+
class CrossFadeNavDecorator<T : NavArgument>(private val durationMillis: Int) :
22+
AnimatedNavDecorator<T, NavigatorDefaults.DefaultDecorator.DefaultAnimatedState<T>> by NavigatorDefaults.DefaultDecorator<T>() {
23+
24+
override fun AnimatedContentTransitionScope<AnimatedNavState>.transitionSpec(
25+
animatedNavEvent: AnimatedNavEvent,
26+
): ContentTransform {
27+
return fadeIn(tween(durationMillis)) togetherWith fadeOut(tween(durationMillis))
28+
}
29+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.ninecraft.booket.core.common.constants
2+
3+
enum class WebViewConstants(val url: String, val title: String) {
4+
PRIVACY_POLICY("https://www.google.com", "개인정보처리방침"),
5+
TERMS_OF_SERVICE("https://m.naver.com", "이용약관"),
6+
}

feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeScreen.kt renamed to feature/home/src/main/kotlin/com/ninecraft/booket/feature/home/HomeUi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import dagger.hilt.android.components.ActivityRetainedComponent
1919

2020
@CircuitInject(HomeScreen::class, ActivityRetainedComponent::class)
2121
@Composable
22-
internal fun Home(
22+
internal fun HomeUi(
2323
state: HomeUiState,
2424
modifier: Modifier = Modifier,
2525
) {
@@ -56,7 +56,7 @@ internal fun HomeContent(
5656
@Composable
5757
private fun HomePreview() {
5858
ReedTheme {
59-
Home(
59+
HomeUi(
6060
state = HomeUiState(
6161
eventSink = {},
6262
),

feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryScreen.kt renamed to feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryUi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import dagger.hilt.android.components.ActivityRetainedComponent
2525

2626
@CircuitInject(LibraryScreen::class, ActivityRetainedComponent::class)
2727
@Composable
28-
internal fun Library(
28+
internal fun LibraryUi(
2929
state: LibraryUiState,
3030
modifier: Modifier = Modifier,
3131
) {
@@ -95,7 +95,7 @@ internal fun LibraryContent(
9595
@Composable
9696
private fun LibraryPreview() {
9797
ReedTheme {
98-
Library(
98+
LibraryUi(
9999
state = LibraryUiState(
100100
nickname = "홍길동",
101101
email = "[email protected]",

feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginScreen.kt renamed to feature/login/src/main/kotlin/com/ninecraft/booket/feature/login/LoginUi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import dagger.hilt.android.components.ActivityRetainedComponent
3030

3131
@CircuitInject(LoginScreen::class, ActivityRetainedComponent::class)
3232
@Composable
33-
internal fun Login(
33+
internal fun LoginUi(
3434
state: LoginUiState,
3535
modifier: Modifier = Modifier,
3636
) {
@@ -90,7 +90,7 @@ internal fun Login(
9090
@Composable
9191
private fun LoginPreview() {
9292
ReedTheme {
93-
Login(
93+
LoginUi(
9494
state = LoginUiState(
9595
eventSink = {},
9696
),

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import androidx.compose.runtime.getValue
66
import androidx.compose.runtime.mutableStateOf
77
import androidx.compose.runtime.remember
88
import androidx.compose.runtime.setValue
9+
import com.ninecraft.booket.core.common.constants.WebViewConstants
910
import com.ninecraft.booket.feature.screens.BottomNavigationScreen
1011
import com.ninecraft.booket.feature.screens.TermsAgreementScreen
12+
import com.ninecraft.booket.feature.screens.WebViewScreen
1113
import com.slack.circuit.codegen.annotations.CircuitInject
1214
import com.slack.circuit.retained.rememberRetained
1315
import com.slack.circuit.runtime.Navigator
@@ -50,8 +52,14 @@ class TermsAgreementPresenter @AssistedInject constructor(
5052
navigator.pop()
5153
}
5254

53-
is TermsAgreementUiEvent.OnTermDetailClick -> {
54-
// TODO: 웹뷰 화면으로 이동
55+
is TermsAgreementUiEvent.OnPolicyClick -> {
56+
val policy = WebViewConstants.PRIVACY_POLICY
57+
navigator.goTo(WebViewScreen(url = policy.url, title = policy.title))
58+
}
59+
60+
is TermsAgreementUiEvent.OnTermClick -> {
61+
val terms = WebViewConstants.TERMS_OF_SERVICE
62+
navigator.goTo(WebViewScreen(url = terms.url, title = terms.title))
5563
}
5664

5765
is TermsAgreementUiEvent.OnStartButtonClick -> {

feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementScreen.kt renamed to feature/login/src/main/kotlin/com/ninecraft/booket/feature/termsagreement/TermsAgreementUi.kt

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ import androidx.compose.ui.res.stringArrayResource
2323
import androidx.compose.ui.res.stringResource
2424
import androidx.compose.ui.res.vectorResource
2525
import androidx.compose.ui.unit.dp
26-
import com.ninecraft.booket.core.common.extensions.clickableSingle
26+
import com.ninecraft.booket.core.common.extensions.noRippleClickable
2727
import com.ninecraft.booket.core.designsystem.DevicePreview
28-
import com.ninecraft.booket.core.designsystem.component.appbar.ReedBackTopAppBar
2928
import com.ninecraft.booket.core.designsystem.component.button.ReedButton
3029
import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
3130
import com.ninecraft.booket.core.designsystem.component.button.largeButtonStyle
@@ -38,25 +37,24 @@ import com.ninecraft.booket.feature.screens.TermsAgreementScreen
3837
import com.slack.circuit.codegen.annotations.CircuitInject
3938
import dagger.hilt.android.components.ActivityRetainedComponent
4039
import kotlinx.collections.immutable.persistentListOf
40+
import com.ninecraft.booket.core.designsystem.R as designR
4141

4242
@CircuitInject(TermsAgreementScreen::class, ActivityRetainedComponent::class)
4343
@Composable
44-
internal fun TermsAgreement(
44+
internal fun TermsAgreementUi(
4545
state: TermsAgreementUiState,
4646
modifier: Modifier = Modifier,
4747
) {
48+
val termsTitles = stringArrayResource(id = R.array.terms_agreement_items)
49+
4850
Column(
4951
modifier = modifier
5052
.fillMaxSize()
5153
.background(White)
5254
.systemBarsPadding(),
5355
) {
54-
ReedBackTopAppBar(
55-
onBackClick = {
56-
state.eventSink(TermsAgreementUiEvent.OnBackClick)
57-
},
58-
)
59-
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing2))
56+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing16))
57+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing3))
6058
Column(
6159
modifier = Modifier
6260
.weight(1f)
@@ -95,22 +93,37 @@ internal fun TermsAgreement(
9593
style = ReedTheme.typography.headline1SemiBold,
9694
)
9795
}
96+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing5))
97+
TermItem(
98+
title = termsTitles[0],
99+
checked = state.agreedTerms[0],
100+
onCheckClick = {
101+
state.eventSink(TermsAgreementUiEvent.OnTermItemClick(0))
102+
},
103+
onDetailClick = {
104+
state.eventSink(TermsAgreementUiEvent.OnPolicyClick)
105+
},
106+
)
98107
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing4))
99-
100-
val termsTitles = stringArrayResource(id = R.array.terms_agreement_items)
101-
102-
termsTitles.forEachIndexed { index, title ->
103-
TermItem(
104-
title = title,
105-
checked = state.agreedTerms[index],
106-
onCheckClick = {
107-
state.eventSink(TermsAgreementUiEvent.OnTermItemClick(index))
108-
},
109-
onDetailClick = {
110-
state.eventSink(TermsAgreementUiEvent.OnTermDetailClick(""))
111-
},
112-
)
113-
}
108+
TermItem(
109+
title = termsTitles[1],
110+
checked = state.agreedTerms[1],
111+
onCheckClick = {
112+
state.eventSink(TermsAgreementUiEvent.OnTermItemClick(1))
113+
},
114+
onDetailClick = {
115+
state.eventSink(TermsAgreementUiEvent.OnTermClick)
116+
},
117+
)
118+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing4))
119+
TermItem(
120+
title = termsTitles[2],
121+
checked = state.agreedTerms[2],
122+
hasDetailAction = false,
123+
onCheckClick = {
124+
state.eventSink(TermsAgreementUiEvent.OnTermItemClick(2))
125+
},
126+
)
114127
}
115128
ReedButton(
116129
onClick = {
@@ -134,19 +147,18 @@ internal fun TermsAgreement(
134147
@Composable
135148
private fun TermItem(
136149
title: String,
150+
onCheckClick: () -> Unit,
137151
modifier: Modifier = Modifier,
138152
checked: Boolean = false,
139-
onCheckClick: () -> Unit = {},
153+
hasDetailAction: Boolean = true,
140154
onDetailClick: () -> Unit = {},
141155
) {
142156
Row(
143157
modifier = modifier
144158
.fillMaxWidth()
145-
.clickableSingle {
146-
onDetailClick()
147-
}
159+
.noRippleClickable { onDetailClick() }
148160
.padding(
149-
start = ReedTheme.spacing.spacing5,
161+
start = ReedTheme.spacing.spacing4 + ReedTheme.spacing.spacing05,
150162
end = ReedTheme.spacing.spacing3,
151163
top = ReedTheme.spacing.spacing2,
152164
bottom = ReedTheme.spacing.spacing2,
@@ -157,26 +169,29 @@ private fun TermItem(
157169
checked = checked,
158170
onCheckedChange = { onCheckClick() },
159171
)
160-
Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing1))
172+
Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing3 + ReedTheme.spacing.spacing05))
161173
Text(
162174
text = title,
163175
modifier = Modifier.weight(1f),
164176
color = ReedTheme.colors.contentPrimary,
165177
style = ReedTheme.typography.body1Medium,
166178
)
167-
Icon(
168-
imageVector = ImageVector.vectorResource(id = com.ninecraft.booket.core.designsystem.R.drawable.ic_chevron_right),
169-
contentDescription = "Navigation Icon",
170-
tint = Color.Unspecified,
171-
)
179+
180+
if (hasDetailAction) {
181+
Icon(
182+
imageVector = ImageVector.vectorResource(id = designR.drawable.ic_chevron_right),
183+
contentDescription = "Navigation Icon",
184+
tint = Color.Unspecified,
185+
)
186+
}
172187
}
173188
}
174189

175190
@DevicePreview
176191
@Composable
177192
private fun TermsAgreementPreview() {
178193
ReedTheme {
179-
TermsAgreement(
194+
TermsAgreementUi(
180195
state = TermsAgreementUiState(
181196
isAllAgreed = false,
182197
agreedTerms = persistentListOf(false, false, false),

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ sealed interface TermsAgreementUiEvent : CircuitUiEvent {
1414
data object OnAllTermsAgreedClick : TermsAgreementUiEvent
1515
data class OnTermItemClick(val index: Int) : TermsAgreementUiEvent
1616
data object OnBackClick : TermsAgreementUiEvent
17-
data class OnTermDetailClick(val url: String) : TermsAgreementUiEvent
17+
data object OnPolicyClick : TermsAgreementUiEvent
18+
data object OnTermClick : TermsAgreementUiEvent
1819
data object OnStartButtonClick : TermsAgreementUiEvent
1920
}

0 commit comments

Comments
 (0)