Skip to content

Commit 75498b0

Browse files
authored
Merge pull request #53 from YAPP-Github/BOOK-147-feature/#51
feat: 내서재의 로그아웃 기능을 설정 화면으로 이동
2 parents 7b6f808 + 8e82bc7 commit 75498b0

File tree

9 files changed

+237
-182
lines changed

9 files changed

+237
-182
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.ninecraft.booket.core.designsystem.component
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.Row
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.fillMaxWidth
8+
import androidx.compose.foundation.layout.height
9+
import androidx.compose.foundation.layout.padding
10+
import androidx.compose.foundation.layout.width
11+
import androidx.compose.foundation.shape.RoundedCornerShape
12+
import androidx.compose.material3.Text
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.ui.Alignment
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.text.style.TextAlign
17+
import androidx.compose.ui.tooling.preview.Preview
18+
import androidx.compose.ui.window.Dialog
19+
import com.ninecraft.booket.core.designsystem.component.button.ReedButton
20+
import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
21+
import com.ninecraft.booket.core.designsystem.component.button.largeButtonStyle
22+
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
23+
24+
@Composable
25+
fun ReedDialog(
26+
title: String,
27+
confirmButtonText: String,
28+
onConfirmRequest: () -> Unit,
29+
modifier: Modifier = Modifier,
30+
description: String? = null,
31+
dismissButtonText: String? = null,
32+
onDismissRequest: () -> Unit = {},
33+
) {
34+
Dialog(
35+
onDismissRequest = {
36+
onDismissRequest()
37+
},
38+
) {
39+
Column(
40+
modifier = modifier
41+
.fillMaxWidth()
42+
.background(
43+
color = ReedTheme.colors.basePrimary,
44+
shape = RoundedCornerShape(
45+
ReedTheme.radius.lg,
46+
),
47+
)
48+
.padding(
49+
start = ReedTheme.spacing.spacing5,
50+
top = ReedTheme.spacing.spacing8,
51+
end = ReedTheme.spacing.spacing5,
52+
bottom = ReedTheme.spacing.spacing5,
53+
),
54+
horizontalAlignment = Alignment.CenterHorizontally,
55+
) {
56+
Text(
57+
text = title,
58+
color = ReedTheme.colors.contentPrimary,
59+
textAlign = TextAlign.Center,
60+
style = ReedTheme.typography.headline1SemiBold,
61+
)
62+
description?.let {
63+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing2))
64+
Text(
65+
text = description,
66+
color = ReedTheme.colors.contentSecondary,
67+
textAlign = TextAlign.Center,
68+
style = ReedTheme.typography.body2Medium,
69+
)
70+
}
71+
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing6))
72+
Row(
73+
modifier = Modifier.fillMaxWidth(),
74+
) {
75+
dismissButtonText?.let {
76+
ReedButton(
77+
onClick = {
78+
onDismissRequest()
79+
},
80+
sizeStyle = largeButtonStyle,
81+
colorStyle = ReedButtonColorStyle.SECONDARY,
82+
modifier = Modifier.weight(1f),
83+
text = dismissButtonText,
84+
)
85+
Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing2))
86+
}
87+
ReedButton(
88+
onClick = {
89+
onConfirmRequest()
90+
},
91+
sizeStyle = largeButtonStyle,
92+
colorStyle = ReedButtonColorStyle.PRIMARY,
93+
modifier = Modifier.weight(1f),
94+
text = confirmButtonText,
95+
)
96+
}
97+
}
98+
}
99+
}
100+
101+
@Preview
102+
@Composable
103+
private fun ReedConfirmDialogPreview() {
104+
ReedTheme {
105+
ReedDialog(
106+
title = "Title",
107+
confirmButtonText = "확인",
108+
onConfirmRequest = {},
109+
description = "subtext",
110+
)
111+
}
112+
}
113+
114+
@Preview
115+
@Composable
116+
private fun ReedChoiceDialogPreview() {
117+
ReedTheme {
118+
ReedDialog(
119+
title = "Title",
120+
confirmButtonText = "확인",
121+
onConfirmRequest = {},
122+
description = "subtext",
123+
dismissButtonText = "취소",
124+
)
125+
}
126+
}

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

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import androidx.compose.runtime.mutableStateOf
66
import androidx.compose.runtime.rememberCoroutineScope
77
import androidx.compose.runtime.setValue
88
import com.ninecraft.booket.core.common.utils.handleException
9-
import com.ninecraft.booket.core.data.api.repository.AuthRepository
109
import com.ninecraft.booket.core.data.api.repository.UserRepository
1110
import com.ninecraft.booket.screens.LibraryScreen
1211
import com.ninecraft.booket.screens.LoginScreen
@@ -25,7 +24,6 @@ import kotlinx.coroutines.launch
2524

2625
class LibraryPresenter @AssistedInject constructor(
2726
@Assisted private val navigator: Navigator,
28-
private val authRepository: AuthRepository,
2927
private val userRepository: UserRepository,
3028
) : Presenter<LibraryUiState> {
3129

@@ -80,35 +78,6 @@ class LibraryPresenter @AssistedInject constructor(
8078
is LibraryUiEvent.OnSettingsClick -> {
8179
navigator.goTo(SettingsScreen)
8280
}
83-
84-
is LibraryUiEvent.OnLogoutButtonClick -> {
85-
scope.launch {
86-
try {
87-
isLoading = true
88-
authRepository.logout()
89-
.onSuccess {
90-
navigator.resetRoot(LoginScreen)
91-
}
92-
.onFailure { exception ->
93-
val handleErrorMessage = { message: String ->
94-
Logger.e(message)
95-
sideEffect = LibrarySideEffect.ShowToast(message)
96-
}
97-
98-
handleException(
99-
exception = exception,
100-
onServerError = handleErrorMessage,
101-
onNetworkError = handleErrorMessage,
102-
onLoginRequired = {
103-
navigator.resetRoot(LoginScreen)
104-
},
105-
)
106-
}
107-
} finally {
108-
isLoading = false
109-
}
110-
}
111-
}
11281
}
11382
}
11483

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

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ import androidx.compose.foundation.layout.Box
55
import androidx.compose.foundation.layout.Column
66
import androidx.compose.foundation.layout.Spacer
77
import androidx.compose.foundation.layout.fillMaxSize
8-
import androidx.compose.foundation.layout.fillMaxWidth
98
import androidx.compose.foundation.layout.height
10-
import androidx.compose.foundation.layout.padding
119
import androidx.compose.material3.CircularProgressIndicator
1210
import androidx.compose.material3.Icon
1311
import androidx.compose.material3.IconButton
@@ -17,13 +15,9 @@ import androidx.compose.ui.Alignment
1715
import androidx.compose.ui.Modifier
1816
import androidx.compose.ui.graphics.Color
1917
import androidx.compose.ui.graphics.vector.ImageVector
20-
import androidx.compose.ui.res.stringResource
2118
import androidx.compose.ui.res.vectorResource
2219
import androidx.compose.ui.unit.dp
2320
import com.ninecraft.booket.core.designsystem.DevicePreview
24-
import com.ninecraft.booket.core.designsystem.component.button.ReedButton
25-
import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
26-
import com.ninecraft.booket.core.designsystem.component.button.largeButtonStyle
2721
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
2822
import com.ninecraft.booket.screens.LibraryScreen
2923
import com.slack.circuit.codegen.annotations.CircuitInject
@@ -86,19 +80,6 @@ internal fun LibraryContent(
8680
Spacer(modifier = Modifier.height(16.dp))
8781
Text(text = state.email)
8882
}
89-
ReedButton(
90-
onClick = {
91-
state.eventSink(LibraryUiEvent.OnLogoutButtonClick)
92-
},
93-
modifier = Modifier
94-
.fillMaxWidth()
95-
.padding(start = 32.dp, end = 32.dp, bottom = 32.dp)
96-
.height(56.dp)
97-
.align(Alignment.BottomCenter),
98-
colorStyle = ReedButtonColorStyle.PRIMARY,
99-
sizeStyle = largeButtonStyle,
100-
text = stringResource(id = R.string.logout),
101-
)
10283

10384
if (state.isLoading) {
10485
CircularProgressIndicator(

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,4 @@ sealed interface LibrarySideEffect {
1818
sealed interface LibraryUiEvent : CircuitUiEvent {
1919
data object InitSideEffect : LibraryUiEvent
2020
data object OnSettingsClick : LibraryUiEvent
21-
data object OnLogoutButtonClick : LibraryUiEvent
2221
}

feature/settings/src/main/kotlin/com/ninecraft/booket/feature/settings/SettingsPresenter.kt

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@ package com.ninecraft.booket.feature.settings
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.getValue
55
import androidx.compose.runtime.mutableStateOf
6+
import androidx.compose.runtime.rememberCoroutineScope
67
import androidx.compose.runtime.setValue
8+
import com.ninecraft.booket.core.common.utils.handleException
9+
import com.ninecraft.booket.core.data.api.repository.AuthRepository
10+
import com.ninecraft.booket.screens.LoginScreen
711
import com.ninecraft.booket.screens.OssLicensesScreen
812
import com.ninecraft.booket.screens.SettingsScreen
13+
import com.orhanobut.logger.Logger
914
import com.slack.circuit.codegen.annotations.CircuitInject
1015
import com.slack.circuit.retained.rememberRetained
1116
import com.slack.circuit.runtime.Navigator
@@ -14,19 +19,28 @@ import dagger.assisted.Assisted
1419
import dagger.assisted.AssistedFactory
1520
import dagger.assisted.AssistedInject
1621
import dagger.hilt.android.components.ActivityRetainedComponent
22+
import kotlinx.coroutines.launch
1723

1824
class SettingsPresenter @AssistedInject constructor(
1925
@Assisted val navigator: Navigator,
26+
private val authRepository: AuthRepository,
2027
) : Presenter<SettingsUiState> {
2128

2229
@Composable
2330
override fun present(): SettingsUiState {
24-
var isLogoutBottomSheetVisible by rememberRetained { mutableStateOf(false) }
31+
val scope = rememberCoroutineScope()
32+
var isLoading by rememberRetained { mutableStateOf(false) }
33+
var sideEffect by rememberRetained { mutableStateOf<SettingsSideEffect?>(null) }
34+
var isLogoutDialogVisible by rememberRetained { mutableStateOf(false) }
2535
var isWithdrawBottomSheetVisible by rememberRetained { mutableStateOf(false) }
2636
var isWithdrawConfirmed by rememberRetained { mutableStateOf(false) }
2737

2838
fun handleEvent(event: SettingsUiEvent) {
2939
when (event) {
40+
is SettingsUiEvent.InitSideEffect -> {
41+
sideEffect = null
42+
}
43+
3044
is SettingsUiEvent.OnBackClick -> {
3145
navigator.pop()
3246
}
@@ -40,15 +54,15 @@ class SettingsPresenter @AssistedInject constructor(
4054
}
4155

4256
is SettingsUiEvent.OnLogoutClick -> {
43-
isLogoutBottomSheetVisible = true
57+
isLogoutDialogVisible = true
4458
}
4559

4660
is SettingsUiEvent.OnWithdrawClick -> {
4761
isWithdrawBottomSheetVisible = true
4862
}
4963

5064
is SettingsUiEvent.OnBottomSheetDismissed -> {
51-
isLogoutBottomSheetVisible = false
65+
isLogoutDialogVisible = false
5266
isWithdrawBottomSheetVisible = false
5367
isWithdrawConfirmed = false
5468
}
@@ -58,7 +72,33 @@ class SettingsPresenter @AssistedInject constructor(
5872
}
5973

6074
is SettingsUiEvent.Logout -> {
61-
// TODO: 로그아웃 처리 -> 성공 시 로그인 화면으로 이동
75+
scope.launch {
76+
try {
77+
isLoading = true
78+
authRepository.logout()
79+
.onSuccess {
80+
navigator.resetRoot(LoginScreen)
81+
}
82+
.onFailure { exception ->
83+
val handleErrorMessage = { message: String ->
84+
Logger.e(message)
85+
sideEffect = SettingsSideEffect.ShowToast(message)
86+
}
87+
88+
handleException(
89+
exception = exception,
90+
onServerError = handleErrorMessage,
91+
onNetworkError = handleErrorMessage,
92+
onLoginRequired = {
93+
navigator.resetRoot(LoginScreen)
94+
},
95+
)
96+
}
97+
} finally {
98+
isLoading = false
99+
}
100+
}
101+
isLogoutDialogVisible = false
62102
}
63103

64104
is SettingsUiEvent.Withdraw -> {
@@ -67,9 +107,11 @@ class SettingsPresenter @AssistedInject constructor(
67107
}
68108
}
69109
return SettingsUiState(
70-
isLogoutBottomSheetVisible = isLogoutBottomSheetVisible,
110+
isLoading = isLoading,
111+
isLogoutDialogVisible = isLogoutDialogVisible,
71112
isWithdrawBottomSheetVisible = isWithdrawBottomSheetVisible,
72113
isWithdrawConfirmed = isWithdrawConfirmed,
114+
sideEffect = sideEffect,
73115
eventSink = ::handleEvent,
74116
)
75117
}

0 commit comments

Comments
 (0)