Skip to content

Commit 8007d56

Browse files
committed
[BOOK-113] refactor: BottomSheet 컴포넌트 분리 및 onCancelButtonClick 콜백 추가
1 parent d529b1c commit 8007d56

File tree

3 files changed

+259
-164
lines changed

3 files changed

+259
-164
lines changed

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

Lines changed: 13 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,15 @@ package com.ninecraft.booket.feature.settings
22

33
import android.content.pm.PackageManager
44
import androidx.compose.foundation.background
5-
import androidx.compose.foundation.layout.Arrangement
65
import androidx.compose.foundation.layout.Column
76
import androidx.compose.foundation.layout.Row
87
import androidx.compose.foundation.layout.Spacer
98
import androidx.compose.foundation.layout.fillMaxSize
109
import androidx.compose.foundation.layout.fillMaxWidth
1110
import androidx.compose.foundation.layout.height
1211
import androidx.compose.foundation.layout.padding
13-
import androidx.compose.foundation.layout.width
1412
import androidx.compose.material3.ExperimentalMaterial3Api
1513
import androidx.compose.material3.Icon
16-
import androidx.compose.material3.SheetState
1714
import androidx.compose.material3.Text
1815
import androidx.compose.material3.rememberModalBottomSheetState
1916
import androidx.compose.runtime.Composable
@@ -26,19 +23,14 @@ import androidx.compose.ui.graphics.vector.ImageVector
2623
import androidx.compose.ui.platform.LocalContext
2724
import androidx.compose.ui.res.stringResource
2825
import androidx.compose.ui.res.vectorResource
29-
import androidx.compose.ui.text.style.TextAlign
30-
import androidx.compose.ui.unit.dp
3126
import com.ninecraft.booket.core.common.extensions.clickableSingle
3227
import com.ninecraft.booket.core.designsystem.DevicePreview
3328
import com.ninecraft.booket.core.designsystem.component.appbar.ReedBackTopAppBar
34-
import com.ninecraft.booket.core.designsystem.component.bottomsheet.ReedBottomSheet
35-
import com.ninecraft.booket.core.designsystem.component.button.ReedButton
36-
import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
37-
import com.ninecraft.booket.core.designsystem.component.button.largeButtonStyle
38-
import com.ninecraft.booket.core.designsystem.component.checkbox.SquareCheckBox
3929
import com.ninecraft.booket.core.designsystem.component.divider.ReedDivider
4030
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
4131
import com.ninecraft.booket.core.designsystem.theme.White
32+
import com.ninecraft.booket.feature.settings.component.LogoutConfirmationBottomSheet
33+
import com.ninecraft.booket.feature.settings.component.WithdrawConfirmationBottomSheet
4234
import com.ninecraft.booket.screens.SettingsScreen
4335
import com.orhanobut.logger.Logger
4436
import com.slack.circuit.codegen.annotations.CircuitInject
@@ -147,12 +139,15 @@ internal fun Settings(
147139
if (state.isLogoutBottomSheetVisible) {
148140
LogoutConfirmationBottomSheet(
149141
onDismissRequest = {
142+
state.eventSink(SettingsUiEvent.OnBottomSheetDismissed)
143+
},
144+
sheetState = logoutSheetState,
145+
onCancelButtonClick = {
150146
coroutineScope.launch {
151147
logoutSheetState.hide()
152148
state.eventSink(SettingsUiEvent.OnBottomSheetDismissed)
153149
}
154150
},
155-
sheetState = logoutSheetState,
156151
onLogoutButtonClick = {
157152
state.eventSink(SettingsUiEvent.Logout)
158153
},
@@ -162,16 +157,19 @@ internal fun Settings(
162157
if (state.isWithdrawBottomSheetVisible) {
163158
WithdrawConfirmationBottomSheet(
164159
onDismissRequest = {
165-
coroutineScope.launch {
166-
withDrawSheetState.hide()
167-
state.eventSink(SettingsUiEvent.OnBottomSheetDismissed)
168-
}
160+
state.eventSink(SettingsUiEvent.OnBottomSheetDismissed)
169161
},
170162
sheetState = withDrawSheetState,
171163
isCheckBoxChecked = state.isWithdrawConfirmed,
172164
onCheckBoxCheckedChange = {
173165
state.eventSink(SettingsUiEvent.OnWithdrawConfirmationToggled)
174166
},
167+
onCancelButtonClick = {
168+
coroutineScope.launch {
169+
withDrawSheetState.hide()
170+
state.eventSink(SettingsUiEvent.OnBottomSheetDismissed)
171+
}
172+
},
175173
onWithdrawButtonClick = {
176174
state.eventSink(SettingsUiEvent.Withdraw)
177175
},
@@ -213,155 +211,6 @@ private fun SettingItem(
213211
}
214212
}
215213

216-
@OptIn(ExperimentalMaterial3Api::class)
217-
@Composable
218-
private fun LogoutConfirmationBottomSheet(
219-
onDismissRequest: () -> Unit,
220-
sheetState: SheetState,
221-
onLogoutButtonClick: () -> Unit,
222-
) {
223-
ReedBottomSheet(
224-
onDismissRequest = {
225-
onDismissRequest()
226-
},
227-
sheetState = sheetState,
228-
) {
229-
Column(
230-
modifier = Modifier
231-
.padding(
232-
start = ReedTheme.spacing.spacing5,
233-
top = ReedTheme.spacing.spacing5,
234-
end = ReedTheme.spacing.spacing5,
235-
),
236-
) {
237-
Text(
238-
text = stringResource(R.string.settings_logout_title),
239-
modifier = Modifier
240-
.fillMaxWidth()
241-
.padding(vertical = ReedTheme.spacing.spacing3),
242-
color = ReedTheme.colors.contentPrimary,
243-
textAlign = TextAlign.Center,
244-
style = ReedTheme.typography.heading2SemiBold,
245-
)
246-
Row(
247-
modifier = Modifier
248-
.fillMaxWidth()
249-
.padding(vertical = 16.dp),
250-
horizontalArrangement = Arrangement.SpaceBetween,
251-
) {
252-
ReedButton(
253-
onClick = {
254-
onDismissRequest()
255-
},
256-
sizeStyle = largeButtonStyle,
257-
colorStyle = ReedButtonColorStyle.SECONDARY,
258-
modifier = Modifier.weight(1f),
259-
text = stringResource(R.string.settings_cancel),
260-
)
261-
Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing2))
262-
ReedButton(
263-
onClick = {
264-
onLogoutButtonClick()
265-
},
266-
sizeStyle = largeButtonStyle,
267-
colorStyle = ReedButtonColorStyle.PRIMARY,
268-
modifier = Modifier.weight(1f),
269-
text = stringResource(R.string.settings_logout),
270-
)
271-
}
272-
}
273-
}
274-
}
275-
276-
@OptIn(ExperimentalMaterial3Api::class)
277-
@Composable
278-
private fun WithdrawConfirmationBottomSheet(
279-
onDismissRequest: () -> Unit,
280-
sheetState: SheetState,
281-
isCheckBoxChecked: Boolean,
282-
onCheckBoxCheckedChange: () -> Unit,
283-
onWithdrawButtonClick: () -> Unit,
284-
) {
285-
ReedBottomSheet(
286-
onDismissRequest = {
287-
onDismissRequest()
288-
},
289-
sheetState = sheetState,
290-
) {
291-
Column(
292-
modifier = Modifier
293-
.padding(
294-
start = ReedTheme.spacing.spacing5,
295-
top = ReedTheme.spacing.spacing5,
296-
end = ReedTheme.spacing.spacing5,
297-
),
298-
horizontalAlignment = Alignment.CenterHorizontally,
299-
) {
300-
Text(
301-
text = stringResource(R.string.settings_withdraw_title),
302-
modifier = Modifier
303-
.fillMaxWidth()
304-
.padding(top = ReedTheme.spacing.spacing3),
305-
color = ReedTheme.colors.contentPrimary,
306-
textAlign = TextAlign.Center,
307-
style = ReedTheme.typography.heading2SemiBold,
308-
)
309-
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing1))
310-
Text(
311-
text = stringResource(R.string.settings_withdraw_detail),
312-
modifier = Modifier.fillMaxWidth(),
313-
color = ReedTheme.colors.contentSecondary,
314-
textAlign = TextAlign.Center,
315-
style = ReedTheme.typography.body1Medium,
316-
)
317-
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing5))
318-
Row {
319-
SquareCheckBox(
320-
checked = isCheckBoxChecked,
321-
onCheckedChange = {
322-
onCheckBoxCheckedChange()
323-
},
324-
)
325-
Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing2))
326-
Text(
327-
text = stringResource(R.string.settings_withdraw_agreement),
328-
color = ReedTheme.colors.contentPrimary,
329-
textAlign = TextAlign.Center,
330-
style = ReedTheme.typography.body1Medium,
331-
)
332-
}
333-
Spacer(modifier = Modifier.height(ReedTheme.spacing.spacing3))
334-
Row(
335-
modifier = Modifier
336-
.fillMaxWidth()
337-
.padding(vertical = 16.dp),
338-
horizontalArrangement = Arrangement.SpaceBetween,
339-
) {
340-
ReedButton(
341-
onClick = {
342-
onDismissRequest()
343-
},
344-
sizeStyle = largeButtonStyle,
345-
colorStyle = ReedButtonColorStyle.SECONDARY,
346-
modifier = Modifier.weight(1f),
347-
text = stringResource(R.string.settings_cancel),
348-
)
349-
Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing2))
350-
ReedButton(
351-
onClick = {
352-
onWithdrawButtonClick()
353-
},
354-
sizeStyle = largeButtonStyle,
355-
colorStyle = ReedButtonColorStyle.PRIMARY,
356-
modifier = Modifier.weight(1f),
357-
enabled = isCheckBoxChecked,
358-
text = stringResource(R.string.settings_withdraw_action),
359-
)
360-
}
361-
}
362-
}
363-
}
364-
365214
@DevicePreview
366215
@Composable
367216
private fun SettingsScreenPreview() {
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.ninecraft.booket.feature.settings.component
2+
3+
import androidx.compose.foundation.layout.Arrangement
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.padding
9+
import androidx.compose.foundation.layout.width
10+
import androidx.compose.material3.ExperimentalMaterial3Api
11+
import androidx.compose.material3.SheetState
12+
import androidx.compose.material3.SheetValue
13+
import androidx.compose.material3.Text
14+
import androidx.compose.runtime.Composable
15+
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.res.stringResource
17+
import androidx.compose.ui.text.style.TextAlign
18+
import androidx.compose.ui.tooling.preview.Preview
19+
import androidx.compose.ui.unit.dp
20+
import com.ninecraft.booket.core.designsystem.component.bottomsheet.ReedBottomSheet
21+
import com.ninecraft.booket.core.designsystem.component.button.ReedButton
22+
import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
23+
import com.ninecraft.booket.core.designsystem.component.button.largeButtonStyle
24+
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
25+
import com.ninecraft.booket.feature.settings.R
26+
27+
@OptIn(ExperimentalMaterial3Api::class)
28+
@Composable
29+
fun LogoutConfirmationBottomSheet(
30+
onDismissRequest: () -> Unit,
31+
sheetState: SheetState,
32+
onCancelButtonClick: () -> Unit,
33+
onLogoutButtonClick: () -> Unit,
34+
) {
35+
ReedBottomSheet(
36+
onDismissRequest = {
37+
onDismissRequest()
38+
},
39+
sheetState = sheetState,
40+
) {
41+
Column(
42+
modifier = Modifier
43+
.padding(
44+
start = ReedTheme.spacing.spacing5,
45+
top = ReedTheme.spacing.spacing5,
46+
end = ReedTheme.spacing.spacing5,
47+
),
48+
) {
49+
Text(
50+
text = stringResource(R.string.settings_logout_title),
51+
modifier = Modifier
52+
.fillMaxWidth()
53+
.padding(vertical = ReedTheme.spacing.spacing3),
54+
color = ReedTheme.colors.contentPrimary,
55+
textAlign = TextAlign.Center,
56+
style = ReedTheme.typography.heading2SemiBold,
57+
)
58+
Row(
59+
modifier = Modifier
60+
.fillMaxWidth()
61+
.padding(vertical = 16.dp),
62+
horizontalArrangement = Arrangement.SpaceBetween,
63+
) {
64+
ReedButton(
65+
onClick = {
66+
onCancelButtonClick()
67+
},
68+
sizeStyle = largeButtonStyle,
69+
colorStyle = ReedButtonColorStyle.SECONDARY,
70+
modifier = Modifier.weight(1f),
71+
text = stringResource(R.string.settings_cancel),
72+
)
73+
Spacer(modifier = Modifier.width(ReedTheme.spacing.spacing2))
74+
ReedButton(
75+
onClick = {
76+
onLogoutButtonClick()
77+
},
78+
sizeStyle = largeButtonStyle,
79+
colorStyle = ReedButtonColorStyle.PRIMARY,
80+
modifier = Modifier.weight(1f),
81+
text = stringResource(R.string.settings_logout),
82+
)
83+
}
84+
}
85+
}
86+
}
87+
88+
@OptIn(ExperimentalMaterial3Api::class)
89+
@Preview(showBackground = true)
90+
@Composable
91+
private fun LogoutConfirmationBottomSheetPreview() {
92+
val sheetState = SheetState(
93+
skipPartiallyExpanded = true,
94+
initialValue = SheetValue.Expanded,
95+
positionalThreshold = { 0f },
96+
velocityThreshold = { 0f },
97+
)
98+
ReedTheme {
99+
LogoutConfirmationBottomSheet(
100+
onDismissRequest = {},
101+
sheetState = sheetState,
102+
onCancelButtonClick = {},
103+
onLogoutButtonClick = {},
104+
)
105+
}
106+
}

0 commit comments

Comments
 (0)