Skip to content

Commit 6ddb589

Browse files
authored
Merge pull request #42 from YAPP-Github/BOOK-113-feature/#34
feat: 설정 화면 UI 구현
2 parents 3b868b8 + dd1a421 commit 6ddb589

File tree

15 files changed

+662
-0
lines changed

15 files changed

+662
-0
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ dependencies {
5252
projects.feature.main,
5353
projects.feature.login,
5454
projects.feature.search,
55+
projects.feature.settings,
5556

5657
libs.androidx.activity.compose,
5758
libs.androidx.startup,
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.ninecraft.booket.core.designsystem.component.divider
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.fillMaxWidth
6+
import androidx.compose.foundation.layout.height
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.tooling.preview.Preview
10+
import androidx.compose.ui.unit.dp
11+
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
12+
13+
@Composable
14+
fun ReedDivider(modifier: Modifier = Modifier) {
15+
Box(
16+
modifier = modifier
17+
.fillMaxWidth()
18+
.height(8.dp)
19+
.background(ReedTheme.colors.dividerMd),
20+
)
21+
}
22+
23+
@Preview
24+
@Composable
25+
private fun ReedDividerPreview() {
26+
ReedTheme {
27+
ReedDivider()
28+
}
29+
}

feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryPresenter.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.ninecraft.booket.core.data.api.repository.AuthRepository
1010
import com.ninecraft.booket.core.data.api.repository.UserRepository
1111
import com.ninecraft.booket.screens.LibraryScreen
1212
import com.ninecraft.booket.screens.LoginScreen
13+
import com.ninecraft.booket.screens.SettingsScreen
1314
import com.orhanobut.logger.Logger
1415
import com.skydoves.compose.effects.RememberedEffect
1516
import com.slack.circuit.codegen.annotations.CircuitInject
@@ -76,6 +77,10 @@ class LibraryPresenter @AssistedInject constructor(
7677
sideEffect = null
7778
}
7879

80+
is LibraryUiEvent.OnSettingsClick -> {
81+
navigator.goTo(SettingsScreen)
82+
}
83+
7984
is LibraryUiEvent.OnLogoutButtonClick -> {
8085
scope.launch {
8186
try {

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@ import androidx.compose.foundation.layout.fillMaxWidth
99
import androidx.compose.foundation.layout.height
1010
import androidx.compose.foundation.layout.padding
1111
import androidx.compose.material3.CircularProgressIndicator
12+
import androidx.compose.material3.Icon
13+
import androidx.compose.material3.IconButton
1214
import androidx.compose.material3.Text
1315
import androidx.compose.runtime.Composable
1416
import androidx.compose.ui.Alignment
1517
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.graphics.Color
19+
import androidx.compose.ui.graphics.vector.ImageVector
1620
import androidx.compose.ui.res.stringResource
21+
import androidx.compose.ui.res.vectorResource
1722
import androidx.compose.ui.unit.dp
1823
import com.ninecraft.booket.core.designsystem.DevicePreview
1924
import com.ninecraft.booket.core.designsystem.component.button.ReedButton
@@ -58,6 +63,18 @@ internal fun LibraryContent(
5863
verticalArrangement = Arrangement.Center,
5964
) {
6065
Box(modifier = modifier.fillMaxSize()) {
66+
IconButton(
67+
modifier = Modifier.align(Alignment.TopEnd),
68+
onClick = {
69+
state.eventSink(LibraryUiEvent.OnSettingsClick)
70+
},
71+
) {
72+
Icon(
73+
imageVector = ImageVector.vectorResource(id = com.ninecraft.booket.core.designsystem.R.drawable.ic_settings),
74+
contentDescription = "Settings Icon",
75+
tint = Color.Unspecified,
76+
)
77+
}
6178
Column(
6279
modifier = Modifier.fillMaxSize(),
6380
horizontalAlignment = Alignment.CenterHorizontally,

feature/library/src/main/kotlin/com/ninecraft/booket/feature/library/LibraryUiState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ sealed interface LibrarySideEffect {
1717

1818
sealed interface LibraryUiEvent : CircuitUiEvent {
1919
data object InitSideEffect : LibraryUiEvent
20+
data object OnSettingsClick : LibraryUiEvent
2021
data object OnLogoutButtonClick : LibraryUiEvent
2122
}

feature/settings/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

feature/settings/build.gradle.kts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
@file:Suppress("INLINE_FROM_HIGHER_PLATFORM")
2+
3+
plugins {
4+
alias(libs.plugins.booket.android.feature)
5+
alias(libs.plugins.kotlin.serialization)
6+
alias(libs.plugins.kotlin.parcelize)
7+
}
8+
9+
android {
10+
namespace = "com.ninecraft.booket.feature.settings"
11+
}
12+
13+
ksp {
14+
arg("circuit.codegen.mode", "hilt")
15+
}
16+
17+
dependencies {
18+
implementations(
19+
libs.logger,
20+
)
21+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.ninecraft.booket.feature.settings
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.getValue
5+
import androidx.compose.runtime.mutableStateOf
6+
import androidx.compose.runtime.setValue
7+
import com.ninecraft.booket.screens.SettingsScreen
8+
import com.slack.circuit.codegen.annotations.CircuitInject
9+
import com.slack.circuit.retained.rememberRetained
10+
import com.slack.circuit.runtime.Navigator
11+
import com.slack.circuit.runtime.presenter.Presenter
12+
import dagger.assisted.Assisted
13+
import dagger.assisted.AssistedFactory
14+
import dagger.assisted.AssistedInject
15+
import dagger.hilt.android.components.ActivityRetainedComponent
16+
17+
class SettingsPresenter @AssistedInject constructor(
18+
@Assisted val navigator: Navigator,
19+
) : Presenter<SettingsUiState> {
20+
21+
@Composable
22+
override fun present(): SettingsUiState {
23+
var isLogoutBottomSheetVisible by rememberRetained { mutableStateOf(false) }
24+
var isWithdrawBottomSheetVisible by rememberRetained { mutableStateOf(false) }
25+
var isWithdrawConfirmed by rememberRetained { mutableStateOf(false) }
26+
27+
fun handleEvent(event: SettingsUiEvent) {
28+
when (event) {
29+
is SettingsUiEvent.OnBackClick -> {
30+
navigator.pop()
31+
}
32+
33+
is SettingsUiEvent.OnTermDetailClick -> {
34+
// TODO: 웹뷰 화면으로 이동
35+
}
36+
37+
is SettingsUiEvent.OnLogoutClick -> {
38+
isLogoutBottomSheetVisible = true
39+
}
40+
41+
is SettingsUiEvent.OnWithdrawClick -> {
42+
isWithdrawBottomSheetVisible = true
43+
}
44+
45+
is SettingsUiEvent.OnBottomSheetDismissed -> {
46+
isLogoutBottomSheetVisible = false
47+
isWithdrawBottomSheetVisible = false
48+
isWithdrawConfirmed = false
49+
}
50+
51+
is SettingsUiEvent.OnWithdrawConfirmationToggled -> {
52+
isWithdrawConfirmed = !isWithdrawConfirmed
53+
}
54+
55+
is SettingsUiEvent.Logout -> {
56+
// TODO: 로그아웃 처리 -> 성공 시 로그인 화면으로 이동
57+
}
58+
59+
is SettingsUiEvent.Withdraw -> {
60+
// TODO: 회원탈퇴 처리 -> 성공 시 로그인 화면으로 이동
61+
}
62+
}
63+
}
64+
return SettingsUiState(
65+
isLogoutBottomSheetVisible = isLogoutBottomSheetVisible,
66+
isWithdrawBottomSheetVisible = isWithdrawBottomSheetVisible,
67+
isWithdrawConfirmed = isWithdrawConfirmed,
68+
eventSink = ::handleEvent,
69+
)
70+
}
71+
72+
@CircuitInject(SettingsScreen::class, ActivityRetainedComponent::class)
73+
@AssistedFactory
74+
fun interface Factory {
75+
fun create(navigator: Navigator): SettingsPresenter
76+
}
77+
}

0 commit comments

Comments
 (0)