Skip to content

Commit 92cb9c4

Browse files
committed
[feat] #62 content bottom sheet
1 parent 01e5f26 commit 92cb9c4

File tree

9 files changed

+113
-10
lines changed

9 files changed

+113
-10
lines changed

core/designsystem/src/main/java/com/record/designsystem/component/button/RecordyChipButton.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import androidx.compose.ui.tooling.preview.Preview
1919
import androidx.compose.ui.unit.dp
2020
import com.record.designsystem.theme.Black
2121
import com.record.designsystem.theme.Gray01
22-
import com.record.designsystem.theme.Gray04
2322
import com.record.designsystem.theme.Gray08
2423
import com.record.designsystem.theme.Gray09
2524
import com.record.designsystem.theme.Main
@@ -44,7 +43,7 @@ fun RecordyChipButton(
4443
val (borderLineColor, contentColor, backGroundColor) = if (isActive) {
4544
if (isCheckSmall) Triple(Gray01, Gray09, Gray01) else Triple(Main, Main, Gray08)
4645
} else {
47-
Triple(Color.Transparent, Gray04, if (isCheckSmall) Gray09 else Gray08)
46+
Triple(Color.Transparent, Gray01, if (isCheckSmall) Gray09 else Gray08)
4847
}
4948

5049
val textStyle = when {

core/designsystem/src/main/java/com/record/designsystem/component/button/RecordyMiddleButton.kt

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import androidx.compose.foundation.background
44
import androidx.compose.foundation.layout.Arrangement
55
import androidx.compose.foundation.layout.Column
66
import androidx.compose.foundation.layout.PaddingValues
7-
import androidx.compose.foundation.layout.fillMaxWidth
87
import androidx.compose.foundation.layout.padding
98
import androidx.compose.foundation.layout.wrapContentWidth
109
import androidx.compose.foundation.shape.RoundedCornerShape
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="32dp"
3+
android:height="4dp"
4+
android:viewportWidth="32"
5+
android:viewportHeight="4">
6+
<path
7+
android:pathData="M2,0L30,0A2,2 0,0 1,32 2L32,2A2,2 0,0 1,30 4L2,4A2,2 0,0 1,0 2L0,2A2,2 0,0 1,2 0z"
8+
android:fillColor="#79747E"/>
9+
</vector>

feature/navigator/src/main/java/com/record/navigator/MainScreen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ internal fun MainScreen(
8787
uploadNavGraph(
8888
padding = innerPadding,
8989
navigateSelectedVideo = navigator::navigateSelectedVideo,
90-
)
90+
)
9191

9292
videoNavGraph(
9393
padding = innerPadding,

feature/upload/src/main/java/com/record/upload/SelectedVideoScreen.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ fun SelectedVideoRoute(
3030
}
3131

3232
@Composable
33-
fun SelectedVideoScreen(
34-
) {
33+
fun SelectedVideoScreen() {
3534
Log.d("images", "${getAllVideos(10, null, LocalContext.current)}")
3635
val a = getAllVideos(10, null, LocalContext.current)
3736
}

feature/upload/src/main/java/com/record/upload/UploadContract.kt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.record.ui.base.UiState
66
data class UploadState(
77
val showShouldShowRationaleDialog: Boolean = false,
88
val isSelectedVideoSheetOpen: Boolean = false,
9+
val isSelectedDefinedContentSheetOpen: Boolean = false,
910
) : UiState
1011

1112
sealed interface UploadSideEffect : SideEffect

feature/upload/src/main/java/com/record/upload/UploadViewModel.kt

+7
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,11 @@ class UploadViewModel @Inject constructor() :
2222
fun hideIsSelectedVideoSheetOpen() = intent {
2323
copy(isSelectedVideoSheetOpen = false)
2424
}
25+
fun showIsSelectedDefinedContentSheetOpen() = intent {
26+
copy(isSelectedDefinedContentSheetOpen = true)
27+
}
28+
29+
fun hideIsSelectedDefinedContentSheetOpen() = intent {
30+
copy(isSelectedDefinedContentSheetOpen = false)
31+
}
2532
}

feature/upload/src/main/java/com/record/upload/VideoPickerScreen.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import com.record.designsystem.theme.Background
5353
import com.record.designsystem.theme.RecordyTheme
5454
import com.record.ui.extension.customClickable
5555
import com.record.ui.lifecycle.LaunchedEffectWithLifecycle
56+
import com.record.upload.component.bottomsheet.DefinedContentBottomSheet
5657
import com.record.upload.component.bottomsheet.SelectedVideoBottomSheet
5758
import kotlinx.coroutines.flow.collectLatest
5859
import kotlinx.coroutines.launch
@@ -73,11 +74,12 @@ fun VideoPickerRoute(
7374

7475
VideoPickerScreen(
7576
state = state,
76-
onClickKeyword = {},
7777
showShouldShowRationaleDialog = viewModel::showShouldShowRationaleDialog,
7878
hideShouldShowRationaleDialog = viewModel::hideShouldShowRationaleDialog,
7979
showIsSelectedVideoSheetOpen = viewModel::showIsSelectedVideoSheetOpen,
8080
hideIsSelectedVideoSheetOpen = viewModel::hideIsSelectedVideoSheetOpen,
81+
showIsSelectedDefinedContentSheetOpen = viewModel::showIsSelectedDefinedContentSheetOpen,
82+
hideIsSelectedDefinedContentSheetOpen = viewModel::hideIsSelectedDefinedContentSheetOpen,
8183
)
8284
}
8385

@@ -86,11 +88,12 @@ fun VideoPickerRoute(
8688
@Composable
8789
fun VideoPickerScreen(
8890
state: UploadState = UploadState(),
89-
onClickKeyword: () -> Unit = {},
9091
showShouldShowRationaleDialog: () -> Unit = {},
9192
hideShouldShowRationaleDialog: () -> Unit = {},
9293
showIsSelectedVideoSheetOpen: () -> Unit = {},
9394
hideIsSelectedVideoSheetOpen: () -> Unit = {},
95+
showIsSelectedDefinedContentSheetOpen: () -> Unit = {},
96+
hideIsSelectedDefinedContentSheetOpen: () -> Unit = {},
9497
) {
9598
val context = LocalContext.current
9699
val cameraPermissionState = rememberPermissionState(Manifest.permission.READ_MEDIA_VIDEO)
@@ -182,7 +185,7 @@ fun VideoPickerScreen(
182185
.background(RecordyTheme.colors.gray08, shape = RoundedCornerShape(30.dp))
183186
.padding(vertical = 8.dp)
184187
.padding(start = 8.dp, end = 12.dp)
185-
.customClickable(onClick = onClickKeyword),
188+
.customClickable(onClick = showIsSelectedDefinedContentSheetOpen),
186189
verticalAlignment = Alignment.CenterVertically,
187190
horizontalArrangement = Arrangement.Center,
188191
) {
@@ -249,6 +252,11 @@ fun VideoPickerScreen(
249252
onDismissRequest = hideIsSelectedVideoSheetOpen,
250253
galleyVideos = exampleVideoList,
251254
)
255+
DefinedContentBottomSheet(
256+
sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true),
257+
isSheetOpen = state.isSelectedDefinedContentSheetOpen,
258+
onDismissRequest = hideIsSelectedDefinedContentSheetOpen,
259+
)
252260
}
253261
}
254262

Original file line numberDiff line numberDiff line change
@@ -1,15 +1,96 @@
11
package com.record.upload.component.bottomsheet
22

3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.layout.Arrangement
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.ExperimentalLayoutApi
8+
import androidx.compose.foundation.layout.FlowRow
9+
import androidx.compose.foundation.layout.fillMaxWidth
10+
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.foundation.layout.wrapContentWidth
12+
import androidx.compose.foundation.shape.RoundedCornerShape
313
import androidx.compose.material3.ExperimentalMaterial3Api
414
import androidx.compose.material3.SheetState
15+
import androidx.compose.material3.Text
516
import androidx.compose.material3.rememberModalBottomSheetState
617
import androidx.compose.runtime.Composable
18+
import androidx.compose.ui.Alignment
19+
import androidx.compose.ui.Modifier
20+
import androidx.compose.ui.res.painterResource
21+
import androidx.compose.ui.unit.dp
22+
import com.record.designsystem.R
23+
import com.record.designsystem.component.bottomsheet.RecordyBottomSheet
24+
import com.record.designsystem.component.button.RecordyChipButton
25+
import com.record.designsystem.component.button.RecordyMiddleButton
26+
import com.record.designsystem.theme.RecordyTheme
27+
import timber.log.Timber
728

8-
@OptIn(ExperimentalMaterial3Api::class)
29+
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
930
@Composable
1031
fun DefinedContentBottomSheet(
1132
sheetState: SheetState = rememberModalBottomSheetState(),
1233
isSheetOpen: Boolean,
1334
onDismissRequest: () -> Unit,
1435
) {
36+
RecordyBottomSheet(
37+
isSheetOpen = isSheetOpen,
38+
sheetState = sheetState,
39+
onDismissRequest = onDismissRequest,
40+
shape = RoundedCornerShape(topStart = 20.dp, topEnd = 20.dp),
41+
) {
42+
Column(
43+
modifier = Modifier
44+
.fillMaxWidth()
45+
.background(RecordyTheme.colors.gray08)
46+
.padding(horizontal = 16.dp),
47+
) {
48+
Image(
49+
modifier = Modifier
50+
.padding(vertical = 16.dp)
51+
.align(Alignment.CenterHorizontally),
52+
painter = painterResource(id = R.drawable.ic_drag_handle),
53+
contentDescription = null,
54+
)
55+
Text(
56+
text = "키워드 선택",
57+
style = RecordyTheme.typography.subtitle,
58+
color = RecordyTheme.colors.gray01,
59+
modifier = Modifier
60+
.align(Alignment.CenterHorizontally),
61+
)
62+
Text(
63+
text = "해당 공간은\n" + "어떤 느낌인가요?",
64+
style = RecordyTheme.typography.title1,
65+
color = RecordyTheme.colors.gray01,
66+
modifier = Modifier.padding(top = 22.dp, bottom = 11.dp),
67+
)
68+
Text(
69+
text = "키워드 1~3개 선택 시, 프로필에서 취향을 분석해 드립니다.",
70+
style = RecordyTheme.typography.caption1,
71+
color = RecordyTheme.colors.gray03,
72+
)
73+
FlowRow(
74+
modifier = Modifier
75+
.fillMaxWidth()
76+
.padding(top = 28.dp, bottom = 50.dp),
77+
verticalArrangement = Arrangement.spacedBy(12.dp),
78+
horizontalArrangement = Arrangement.spacedBy(6.dp),
79+
) {
80+
val chips = listOf("asdsadasdasda", "asdasdb", "asdasdc", "dasd", "asdsadasdasda", "asdasdb", "asdasdc", "dasd", "asdsadasdasda", "asdasdb", "asdasdc", "dasd")
81+
chips.forEach { chip ->
82+
RecordyChipButton(
83+
text = "$chip",
84+
isActive = false,
85+
onClick = { Timber.d("close key word") },
86+
)
87+
}
88+
}
89+
RecordyMiddleButton(
90+
modifier = Modifier.wrapContentWidth().padding(bottom = 44.dp).align(Alignment.CenterHorizontally),
91+
text = "적용하기",
92+
onClick = { },
93+
)
94+
}
95+
}
1596
}

0 commit comments

Comments
 (0)