Skip to content

Commit 5fca311

Browse files
lsakeeSangwook123
authored andcommitted
[feat] #62 pop backstack dialog
1 parent b7e53eb commit 5fca311

File tree

5 files changed

+54
-1
lines changed

5 files changed

+54
-1
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ internal fun MainScreen(
100100

101101
uploadNavGraph(
102102
padding = innerPadding,
103+
popBackStack = navigator::popBackStackIfNotHome,
103104
)
104105

105106
videoNavGraph(

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ data class UploadState(
1010
val selectedList: List<String> = persistentListOf(),
1111
val video: GalleryVideo? = null,
1212
val showShouldShowRationaleDialog: Boolean = false,
13+
val showExitUploadDialog: Boolean = false,
1314
val isSelectedVideoSheetOpen: Boolean = false,
1415
val isSelectedDefinedContentSheetOpen: Boolean = false,
1516
val bucketUrl: String = "",
1617
val thumbnailUrl: String = "",
1718
) : UiState
1819

19-
sealed interface UploadSideEffect : SideEffect
20+
sealed interface UploadSideEffect : SideEffect{
21+
data object PopBackStack : UploadSideEffect
22+
}

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

+12
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ class UploadViewModel @Inject constructor(
109109
copy(showShouldShowRationaleDialog = false)
110110
}
111111

112+
fun showExitUploadDialog() = intent {
113+
copy(showExitUploadDialog = true)
114+
}
115+
116+
fun hideExitUploadDialog() = intent {
117+
copy(showExitUploadDialog = false)
118+
}
119+
112120
fun showIsSelectedVideoSheetOpen() = intent {
113121
copy(isSelectedVideoSheetOpen = true)
114122
}
@@ -124,4 +132,8 @@ class UploadViewModel @Inject constructor(
124132
fun hideIsSelectedDefinedContentSheetOpen() = intent {
125133
copy(isSelectedDefinedContentSheetOpen = false)
126134
}
135+
136+
fun popBackStack() {
137+
postSideEffect(UploadSideEffect.PopBackStack)
138+
}
127139
}

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

+35
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.content.Intent
66
import android.net.Uri
77
import android.os.Build
88
import android.provider.Settings
9+
import androidx.activity.compose.BackHandler
910
import androidx.activity.compose.rememberLauncherForActivityResult
1011
import androidx.activity.result.contract.ActivityResultContracts
1112
import androidx.annotation.RequiresApi
@@ -58,6 +59,7 @@ import com.record.designsystem.component.button.RecordyButton
5859
import com.record.designsystem.component.button.RecordyChipButton
5960
import com.record.designsystem.component.dialog.RecordyDialog
6061
import com.record.designsystem.component.navbar.TopNavigationBar
62+
import com.record.designsystem.component.snackbar.SnackBarType
6163
import com.record.designsystem.component.textfield.RecordyBasicTextField
6264
import com.record.designsystem.theme.Background
6365
import com.record.designsystem.theme.RecordyTheme
@@ -76,18 +78,37 @@ import java.io.File
7678
fun VideoPickerRoute(
7779
paddingValues: PaddingValues,
7880
viewModel: UploadViewModel = hiltViewModel(),
81+
popBackStack: () -> Unit,
7982
) {
83+
8084
val state by viewModel.uiState.collectAsStateWithLifecycle()
8185
val context = LocalContext.current
86+
val coroutineScope = rememberCoroutineScope()
87+
88+
BackHandler(true) {
89+
coroutineScope.launch {
90+
viewModel.showExitUploadDialog()
91+
}
92+
}
93+
8294
LaunchedEffectWithLifecycle {
8395
viewModel.getPresignedUrl()
8496
viewModel.sideEffect.collectLatest { }
8597
}
8698

99+
LaunchedEffectWithLifecycle {
100+
viewModel.sideEffect.collectLatest { sideEffect ->
101+
when (sideEffect) {
102+
is UploadSideEffect.PopBackStack -> popBackStack()
103+
}
104+
}
105+
}
106+
87107
VideoPickerScreen(
88108
state = state,
89109
showShouldShowRationaleDialog = viewModel::showShouldShowRationaleDialog,
90110
hideShouldShowRationaleDialog = viewModel::hideShouldShowRationaleDialog,
111+
hideExitUploadDialog = viewModel::hideExitUploadDialog,
91112
showIsSelectedVideoSheetOpen = viewModel::showIsSelectedVideoSheetOpen,
92113
hideIsSelectedVideoSheetOpen = viewModel::hideIsSelectedVideoSheetOpen,
93114
showIsSelectedDefinedContentSheetOpen = viewModel::showIsSelectedDefinedContentSheetOpen,
@@ -97,6 +118,7 @@ fun VideoPickerRoute(
97118
uploadVideoS3Bucket = {
98119
viewModel.uploadVideoToS3Bucket(context, it)
99120
},
121+
onClickBackStack = viewModel::popBackStack
100122
)
101123
}
102124

@@ -111,6 +133,8 @@ fun VideoPickerScreen(
111133
state: UploadState = UploadState(),
112134
showShouldShowRationaleDialog: () -> Unit = {},
113135
hideShouldShowRationaleDialog: () -> Unit = {},
136+
onClickBackStack: () -> Unit = {},
137+
hideExitUploadDialog: () -> Unit = {},
114138
showIsSelectedVideoSheetOpen: () -> Unit = {},
115139
hideIsSelectedVideoSheetOpen: () -> Unit = {},
116140
showIsSelectedDefinedContentSheetOpen: () -> Unit = {},
@@ -335,6 +359,17 @@ fun VideoPickerScreen(
335359
},
336360
)
337361
}
362+
if (state.showExitUploadDialog) {
363+
RecordyDialog(
364+
graphicAsset = R.drawable.img_allow,
365+
title = "화면을 나가시겠어요?",
366+
subTitle = "지금까지 작성하신 내용이 모두 사라져요.",
367+
negativeButtonLabel = "취소",
368+
positiveButtonLabel = "나가기",
369+
onDismissRequest = hideExitUploadDialog,
370+
onPositiveButtonClick = onClickBackStack
371+
)
372+
}
338373
SelectedVideoBottomSheet(
339374
sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true),
340375
isSheetOpen = state.isSelectedVideoSheetOpen,

feature/upload/src/main/java/com/record/upload/navigation/UploadNavigation.kt

+2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ fun NavController.navigateToUpload() {
1717
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
1818
fun NavGraphBuilder.uploadNavGraph(
1919
padding: PaddingValues,
20+
popBackStack: () -> Unit = {},
2021
modifier: Modifier = Modifier,
2122
) {
2223
composable(route = UploadRoute.ROUTE) {
2324
VideoPickerRoute(
2425
paddingValues = padding,
26+
popBackStack = popBackStack,
2527
)
2628
}
2729
composable(route = UploadRoute.SELECTED_VIDEO) {

0 commit comments

Comments
 (0)