From 21ea2760942bb7fe12d2690be44de39df8d55e71 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Fri, 16 Aug 2024 16:06:04 +0900 Subject: [PATCH 01/10] =?UTF-8?q?[feat]=20#188=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=8B=A0=EA=B3=A0=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20=EC=9B=B9?= =?UTF-8?q?=EB=B7=B0=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/coursedetail/CourseDetailContract.kt | 5 +- .../ui/coursedetail/CourseDetailScreen.kt | 613 +++++++++--------- .../ui/coursedetail/CourseDetailViewModel.kt | 2 + .../presentation/ui/mypage/MyPageScreen.kt | 2 +- .../dateroad/presentation/util/Constraints.kt | 4 + app/src/main/res/values/strings.xml | 3 +- 6 files changed, 331 insertions(+), 298 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt index a4c0ceb8d..4aca39311 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt @@ -24,7 +24,8 @@ class CourseDetailContract { val advertisementDetail: AdvertisementDetail = AdvertisementDetail(), val currentImagePage: Int = 0, val deleteLoadState: LoadState = LoadState.Idle, - val usePointLoadState: LoadState = LoadState.Idle + val usePointLoadState: LoadState = LoadState.Idle, + var isWebViewOpened: Boolean = false ) : UiState sealed interface CourseDetailSideEffect : UiSideEffect { @@ -50,5 +51,7 @@ class CourseDetailContract { data class DeleteCourseLike(val courseDetail: CourseDetail) : CourseDetailEvent() data class PostCourseLike(val courseDetail: CourseDetail) : CourseDetailEvent() data class DeleteCourse(val loadState: LoadState, val deleteLoadState: LoadState) : CourseDetailEvent() + data object OnReportWebViewClick : CourseDetailEvent() + data object WebViewClose : CourseDetailEvent() } } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt index 9ac77015a..7c5f58449 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt @@ -69,8 +69,10 @@ import org.sopt.dateroad.presentation.ui.component.topbar.DateRoadBasicTopBar import org.sopt.dateroad.presentation.ui.component.view.DateRoadErrorView import org.sopt.dateroad.presentation.ui.component.view.DateRoadIdleView import org.sopt.dateroad.presentation.ui.component.view.DateRoadLoadingView +import org.sopt.dateroad.presentation.ui.component.view.DateRoadWebView import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailInfoBar import org.sopt.dateroad.presentation.ui.coursedetail.component.GradientBoxWithText +import org.sopt.dateroad.presentation.util.CourseDetail.REPORT_URL import org.sopt.dateroad.presentation.util.modifier.noRippleClickable import org.sopt.dateroad.presentation.util.view.LoadState import org.sopt.dateroad.ui.theme.DATEROADTheme @@ -150,7 +152,11 @@ fun CourseDetailRoute( openCourseDetail = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OpenCourse) viewModel.postUsePoint(uiState.id) - } + }, + onReportButtonClicked = { + viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnReportWebViewClick) + }, + onReportWebViewClose = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.WebViewClose) } ) } @@ -171,6 +177,8 @@ fun CourseDetailScreen( dismissDialogLookedByPoint: () -> Unit, onLikeButtonClicked: () -> Unit, onDeleteButtonClicked: () -> Unit, + onReportButtonClicked: () -> Unit, + onReportWebViewClose: () -> Unit, onEditBottomSheet: () -> Unit, dismissEditBottomSheet: () -> Unit, enrollSchedule: () -> Unit, @@ -198,333 +206,338 @@ fun CourseDetailScreen( scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset < imageHeight } } - - Box(modifier = Modifier.fillMaxSize()) { - Column { - LazyColumn( - state = scrollState, - modifier = Modifier - .fillMaxSize() - .background(DateRoadTheme.colors.white), - userScrollEnabled = true - ) { - item { - Box(modifier = Modifier.fillMaxWidth()) { - HorizontalPager( - count = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.images.size else courseDetailUiState.advertisementDetail.images.size, - state = pagerState, - modifier = Modifier - .fillMaxWidth(), - userScrollEnabled = courseDetailUiState.courseDetailType == CourseDetailType.ADVERTISEMENT || courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine - ) { page -> - AsyncImage( - model = ImageRequest.Builder(context = LocalContext.current) - .data(if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.images[page] else courseDetailUiState.advertisementDetail.images[page]) - .crossfade(true) - .build(), - contentDescription = null, + if (courseDetailUiState.isWebViewOpened) { + DateRoadWebView(url = REPORT_URL, onClose = onReportWebViewClose) + } else { + Box(modifier = Modifier.fillMaxSize()) { + Column { + LazyColumn( + state = scrollState, + modifier = Modifier + .fillMaxSize() + .background(DateRoadTheme.colors.white), + userScrollEnabled = true + ) { + item { + Box(modifier = Modifier.fillMaxWidth()) { + HorizontalPager( + count = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.images.size else courseDetailUiState.advertisementDetail.images.size, + state = pagerState, modifier = Modifier - .fillMaxWidth() - .aspectRatio(1f) - .onGloballyPositioned { coordinates -> - imageHeight = coordinates.size.height - }, - contentScale = ContentScale.Crop - ) - } + .fillMaxWidth(), + userScrollEnabled = courseDetailUiState.courseDetailType == CourseDetailType.ADVERTISEMENT || courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine + ) { page -> + AsyncImage( + model = ImageRequest.Builder(context = LocalContext.current) + .data(if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.images[page] else courseDetailUiState.advertisementDetail.images[page]) + .crossfade(true) + .build(), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .aspectRatio(1f) + .onGloballyPositioned { coordinates -> + imageHeight = coordinates.size.height + }, + contentScale = ContentScale.Crop + ) + } - if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { - DateRoadImageTag( - textContent = courseDetailUiState.courseDetail.like.toString(), - imageContent = R.drawable.ic_tag_heart, - tagContentType = TagType.HEART, + if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { + DateRoadImageTag( + textContent = courseDetailUiState.courseDetail.like.toString(), + imageContent = R.drawable.ic_tag_heart, + tagContentType = TagType.HEART, + modifier = Modifier + .padding(start = 10.dp, bottom = 10.dp) + .align(Alignment.BottomStart) + ) + } + + DateRoadTextTag( + textContent = stringResource(id = R.string.fraction_format, pagerState.currentPage + 1, pagerState.pageCount), + tagContentType = TagType.COURSE_DETAIL_PHOTO_NUMBER, modifier = Modifier - .padding(start = 10.dp, bottom = 10.dp) - .align(Alignment.BottomStart) + .padding(end = 10.dp, bottom = 10.dp) + .align(Alignment.BottomEnd) ) } - - DateRoadTextTag( - textContent = stringResource(id = R.string.fraction_format, pagerState.currentPage + 1, pagerState.pageCount), - tagContentType = TagType.COURSE_DETAIL_PHOTO_NUMBER, - modifier = Modifier - .padding(end = 10.dp, bottom = 10.dp) - .align(Alignment.BottomEnd) - ) } - } - item { - Column( - modifier = Modifier - .background(DateRoadTheme.colors.white) - .padding(horizontal = 16.dp) - .padding(top = 18.dp) - ) { - if (courseDetailUiState.courseDetailType == CourseDetailType.ADVERTISEMENT) { - DateRoadTextTag( - textContent = courseDetailUiState.advertisementDetail.advertisementTagTitle, - tagContentType = TagType.ADVERTISEMENT_TITLE + item { + Column( + modifier = Modifier + .background(DateRoadTheme.colors.white) + .padding(horizontal = 16.dp) + .padding(top = 18.dp) + ) { + if (courseDetailUiState.courseDetailType == CourseDetailType.ADVERTISEMENT) { + DateRoadTextTag( + textContent = courseDetailUiState.advertisementDetail.advertisementTagTitle, + tagContentType = TagType.ADVERTISEMENT_TITLE + ) + Spacer(modifier = Modifier.height(16.dp)) + } + Text( + text = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.date else courseDetailUiState.advertisementDetail.createAt, + style = DateRoadTheme.typography.bodySemi15, + color = DateRoadTheme.colors.gray400 ) Spacer(modifier = Modifier.height(16.dp)) - } - Text( - text = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.date else courseDetailUiState.advertisementDetail.createAt, - style = DateRoadTheme.typography.bodySemi15, - color = DateRoadTheme.colors.gray400 - ) - Spacer(modifier = Modifier.height(16.dp)) - Text( - text = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.title else courseDetailUiState.advertisementDetail.title, - style = DateRoadTheme.typography.titleExtra24, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(16.dp)) - if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { - CourseDetailInfoBar( - totalTime = courseDetailUiState.courseDetail.totalTime, - totalCost = courseDetailUiState.courseDetail.totalCostTag, - city = courseDetailUiState.courseDetail.city + Text( + text = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.title else courseDetailUiState.advertisementDetail.title, + style = DateRoadTheme.typography.titleExtra24, + color = DateRoadTheme.colors.black ) Spacer(modifier = Modifier.height(16.dp)) - } - when (courseDetailUiState.courseDetailType) { - CourseDetailType.COURSE -> { - when (courseDetailUiState.courseDetail.isCourseMine || courseDetailUiState.courseDetail.isAccess) { - true -> { - Text( - text = courseDetailUiState.courseDetail.description, - style = DateRoadTheme.typography.bodyMed13Context, - color = DateRoadTheme.colors.black - ) - } + if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { + CourseDetailInfoBar( + totalTime = courseDetailUiState.courseDetail.totalTime, + totalCost = courseDetailUiState.courseDetail.totalCostTag, + city = courseDetailUiState.courseDetail.city + ) + Spacer(modifier = Modifier.height(16.dp)) + } + when (courseDetailUiState.courseDetailType) { + CourseDetailType.COURSE -> { + when (courseDetailUiState.courseDetail.isCourseMine || courseDetailUiState.courseDetail.isAccess) { + true -> { + Text( + text = courseDetailUiState.courseDetail.description, + style = DateRoadTheme.typography.bodyMed13Context, + color = DateRoadTheme.colors.black + ) + } - false -> { - Column( - modifier = Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - GradientBoxWithText(text = courseDetailUiState.courseDetail.description) - Column { - Spacer(modifier = Modifier.height(8.dp)) - Image( - painter = painterResource(id = R.drawable.ic_course_detail_is_not_access), - contentDescription = null, - modifier = Modifier - .align(Alignment.CenterHorizontally) - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = stringResource(id = R.string.course_detail_unopened_title), - style = DateRoadTheme.typography.bodyBold17, - color = DateRoadTheme.colors.black, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) - Spacer(modifier = Modifier.height(4.dp)) - Text( - text = buttonDescription, - style = DateRoadTheme.typography.bodySemi15, - color = DateRoadTheme.colors.purple600, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) - Spacer(modifier = Modifier.height(24.dp)) - DateRoadFilledButton( - modifier = Modifier - .align(Alignment.CenterHorizontally), - isEnabled = true, - textContent = buttonText, - onClick = { - if (courseDetailUiState.courseDetail.free > 0) { - onDialogLookedForFree() - } else { - onDialogLookedByPoint() - } - }, - textStyle = DateRoadTheme.typography.bodyBold15, - enabledBackgroundColor = DateRoadTheme.colors.purple600, - enabledTextColor = DateRoadTheme.colors.white, - disabledBackgroundColor = DateRoadTheme.colors.gray200, - disabledTextColor = DateRoadTheme.colors.gray400, - cornerRadius = 14.dp, - paddingHorizontal = 52.dp, - paddingVertical = 16.dp - ) - Spacer(modifier = Modifier.height(16.dp)) + false -> { + Column( + modifier = Modifier + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + GradientBoxWithText(text = courseDetailUiState.courseDetail.description) + Column { + Spacer(modifier = Modifier.height(8.dp)) + Image( + painter = painterResource(id = R.drawable.ic_course_detail_is_not_access), + contentDescription = null, + modifier = Modifier + .align(Alignment.CenterHorizontally) + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(id = R.string.course_detail_unopened_title), + style = DateRoadTheme.typography.bodyBold17, + color = DateRoadTheme.colors.black, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = buttonDescription, + style = DateRoadTheme.typography.bodySemi15, + color = DateRoadTheme.colors.purple600, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + Spacer(modifier = Modifier.height(24.dp)) + DateRoadFilledButton( + modifier = Modifier + .align(Alignment.CenterHorizontally), + isEnabled = true, + textContent = buttonText, + onClick = { + if (courseDetailUiState.courseDetail.free > 0) { + onDialogLookedForFree() + } else { + onDialogLookedByPoint() + } + }, + textStyle = DateRoadTheme.typography.bodyBold15, + enabledBackgroundColor = DateRoadTheme.colors.purple600, + enabledTextColor = DateRoadTheme.colors.white, + disabledBackgroundColor = DateRoadTheme.colors.gray200, + disabledTextColor = DateRoadTheme.colors.gray400, + cornerRadius = 14.dp, + paddingHorizontal = 52.dp, + paddingVertical = 16.dp + ) + Spacer(modifier = Modifier.height(16.dp)) + } } } } } - } - CourseDetailType.ADVERTISEMENT -> { + CourseDetailType.ADVERTISEMENT -> { + Text( + text = courseDetailUiState.advertisementDetail.description, + style = DateRoadTheme.typography.bodyMed13Context, + color = DateRoadTheme.colors.black + ) + Spacer(modifier = Modifier.height(80.dp)) + } + } + } + } + if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE && courseDetailUiState.courseDetail.isCourseMine || courseDetailUiState.courseDetail.isAccess) { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + Spacer(modifier = Modifier.height(30.dp)) Text( - text = courseDetailUiState.advertisementDetail.description, - style = DateRoadTheme.typography.bodyMed13Context, + text = stringResource(id = R.string.course_detail_timeline_title), + style = DateRoadTheme.typography.titleBold18, color = DateRoadTheme.colors.black ) - Spacer(modifier = Modifier.height(80.dp)) + Spacer(modifier = Modifier.height(12.dp)) } } - } - } - if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE && courseDetailUiState.courseDetail.isCourseMine || courseDetailUiState.courseDetail.isAccess) { - item { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Spacer(modifier = Modifier.height(30.dp)) - Text( - text = stringResource(id = R.string.course_detail_timeline_title), - style = DateRoadTheme.typography.titleBold18, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(12.dp)) - } - } - items(courseDetailUiState.courseDetail.places.size) { index -> - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - DateRoadPlaceCard( - placeCardType = PlaceCardType.COURSE_NORMAL, - sequence = index, - place = courseDetailUiState.courseDetail.places[index] - ) - Spacer(modifier = Modifier.height(16.dp)) + items(courseDetailUiState.courseDetail.places.size) { index -> + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + DateRoadPlaceCard( + placeCardType = PlaceCardType.COURSE_NORMAL, + sequence = index, + place = courseDetailUiState.courseDetail.places[index] + ) + Spacer(modifier = Modifier.height(16.dp)) + } } - } - item { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Spacer(modifier = Modifier.height(14.dp)) - Text( - text = stringResource(id = R.string.course_total_cost_string), - style = DateRoadTheme.typography.titleBold18, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(12.dp)) - Text( - text = courseDetailUiState.courseDetail.totalCost, - style = DateRoadTheme.typography.bodyBold15, - color = DateRoadTheme.colors.black, + item { + Column( modifier = Modifier .fillMaxWidth() - .clip(RoundedCornerShape(10.dp)) - .background(DateRoadTheme.colors.gray100) - .padding(start = 20.dp, top = 15.dp, end = 5.dp, bottom = 17.dp) - ) - Spacer(modifier = Modifier.height(30.dp)) - Text( - text = stringResource(id = R.string.course_detail_tag), - style = DateRoadTheme.typography.titleBold18, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(12.dp)) + .padding(horizontal = 16.dp) + ) { + Spacer(modifier = Modifier.height(14.dp)) + Text( + text = stringResource(id = R.string.course_total_cost_string), + style = DateRoadTheme.typography.titleBold18, + color = DateRoadTheme.colors.black + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = courseDetailUiState.courseDetail.totalCost, + style = DateRoadTheme.typography.bodyBold15, + color = DateRoadTheme.colors.black, + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(10.dp)) + .background(DateRoadTheme.colors.gray100) + .padding(start = 20.dp, top = 15.dp, end = 5.dp, bottom = 17.dp) + ) + Spacer(modifier = Modifier.height(30.dp)) + Text( + text = stringResource(id = R.string.course_detail_tag), + style = DateRoadTheme.typography.titleBold18, + color = DateRoadTheme.colors.black + ) + Spacer(modifier = Modifier.height(12.dp)) + } } - } - item { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Row(horizontalArrangement = Arrangement.spacedBy(7.dp)) { - courseDetailUiState.courseDetail.tags.forEach { tag -> - tag.getDateTagTypeByName()?.let { tagType -> - DateRoadImageChip( - textId = tagType.titleRes, - imageRes = tagType.imageRes, - chipType = ChipType.DATE, - isSelected = false - ) + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + Row(horizontalArrangement = Arrangement.spacedBy(7.dp)) { + courseDetailUiState.courseDetail.tags.forEach { tag -> + tag.getDateTagTypeByName()?.let { tagType -> + DateRoadImageChip( + textId = tagType.titleRes, + imageRes = tagType.imageRes, + chipType = ChipType.DATE, + isSelected = false + ) + } } } - } - Spacer(modifier = Modifier.height(38.dp)) - if (!courseDetailUiState.courseDetail.isCourseMine) { - Spacer(modifier = Modifier.height(80.dp)) + Spacer(modifier = Modifier.height(38.dp)) + if (!courseDetailUiState.courseDetail.isCourseMine) { + Spacer(modifier = Modifier.height(80.dp)) + } } } } } } - } - Box( - modifier = Modifier.background( - if (isTopBarTransparent) { - Brush.verticalGradient( - colors = listOf( - DateRoadTheme.colors.black.copy(alpha = 0.22f), - Color.Transparent - ) - ) - } else { - Brush.verticalGradient( - colors = listOf( - DateRoadTheme.colors.white, - DateRoadTheme.colors.white + Box( + modifier = Modifier.background( + if (isTopBarTransparent) { + Brush.verticalGradient( + colors = listOf( + DateRoadTheme.colors.black.copy(alpha = 0.22f), + Color.Transparent + ) ) - ) - } - ) - ) { - DateRoadBasicTopBar( - title = "", - backGroundColor = if (isTopBarTransparent) Color.Transparent else DateRoadTheme.colors.white, - iconLeftResource = R.drawable.ic_top_bar_back_white, - onIconClick = { onTopBarIconClicked() }, - buttonContent = { - if (courseDetailUiState.courseDetail.isCourseMine && courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { - Icon( - painterResource(id = R.drawable.btn_course_detail_more_white), - contentDescription = null, - tint = if (isTopBarTransparent) DateRoadTheme.colors.white else DateRoadTheme.colors.black, - modifier = Modifier.noRippleClickable { onEditBottomSheet() } + } else { + Brush.verticalGradient( + colors = listOf( + DateRoadTheme.colors.white, + DateRoadTheme.colors.white + ) ) } - }, - leftTint = if (isTopBarTransparent) DateRoadTheme.colors.white else DateRoadTheme.colors.black - ) - } - - if (!courseDetailUiState.courseDetail.isCourseMine && courseDetailUiState.courseDetail.isAccess) { - Box( - modifier = Modifier - .fillMaxWidth() - .background(color = DateRoadTheme.colors.white) - .align(Alignment.BottomCenter) - .padding(horizontal = 16.dp, vertical = 16.dp) + ) ) { - Row { - DateRoadImageButton( - iconResId = R.drawable.ic_coures_detail_heart_default, - enabledContentColor = DateRoadTheme.colors.purple600, - disabledContentColor = DateRoadTheme.colors.gray200, - enabledBackgroundColor = DateRoadTheme.colors.gray100, - disabledBackgroundColor = DateRoadTheme.colors.gray100, - isEnabled = courseDetailUiState.courseDetail.isUserLiked, - onClick = onLikeButtonClicked, - cornerRadius = 14.dp, - paddingHorizontal = 23.dp, - paddingVertical = 18.dp - ) - Spacer(modifier = Modifier.width(12.dp)) - DateRoadBasicButton( - modifier = Modifier.weight(1f), - isEnabled = true, - textContent = stringResource(id = R.string.course_detail_get_course), - onClick = { enrollSchedule() } - ) + DateRoadBasicTopBar( + title = "", + backGroundColor = if (isTopBarTransparent) Color.Transparent else DateRoadTheme.colors.white, + iconLeftResource = R.drawable.ic_top_bar_back_white, + onIconClick = { onTopBarIconClicked() }, + buttonContent = { + if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { + Icon( + painterResource(id = R.drawable.btn_course_detail_more_white), + contentDescription = null, + tint = if (isTopBarTransparent) DateRoadTheme.colors.white else DateRoadTheme.colors.black, + modifier = Modifier.noRippleClickable { + onEditBottomSheet() + } + ) + } + }, + leftTint = if (isTopBarTransparent) DateRoadTheme.colors.white else DateRoadTheme.colors.black + ) + } + + if (!courseDetailUiState.courseDetail.isCourseMine && courseDetailUiState.courseDetail.isAccess) { + Box( + modifier = Modifier + .fillMaxWidth() + .background(color = DateRoadTheme.colors.white) + .align(Alignment.BottomCenter) + .padding(horizontal = 16.dp, vertical = 16.dp) + ) { + Row { + DateRoadImageButton( + iconResId = R.drawable.ic_coures_detail_heart_default, + enabledContentColor = DateRoadTheme.colors.purple600, + disabledContentColor = DateRoadTheme.colors.gray200, + enabledBackgroundColor = DateRoadTheme.colors.gray100, + disabledBackgroundColor = DateRoadTheme.colors.gray100, + isEnabled = courseDetailUiState.courseDetail.isUserLiked, + onClick = onLikeButtonClicked, + cornerRadius = 14.dp, + paddingHorizontal = 23.dp, + paddingVertical = 18.dp + ) + Spacer(modifier = Modifier.width(12.dp)) + DateRoadBasicButton( + modifier = Modifier.weight(1f), + isEnabled = true, + textContent = stringResource(id = R.string.course_detail_get_course), + onClick = { enrollSchedule() } + ) + } } } } @@ -572,11 +585,19 @@ fun CourseDetailScreen( title = stringResource(id = R.string.course_detail_bottom_sheet_title), isButtonEnabled = false, buttonText = stringResource(id = R.string.course_detail_bottom_sheet_delete), - itemList = listOf( - stringResource(id = R.string.course_detail_bottom_sheet_confirm) to { - onDeleteButtonClicked() - } - ), + itemList = if (courseDetailUiState.courseDetail.isCourseMine) { + listOf( + stringResource(id = R.string.course_detail_bottom_sheet_confirm) to { + onDeleteButtonClicked() + } + ) + } else { + listOf( + stringResource(id = R.string.course_detail_bottom_sheet_report) to { + onReportButtonClicked() + } + ) + }, onDismissRequest = { dismissEditBottomSheet() }, onButtonClick = { dismissEditBottomSheet() @@ -635,7 +656,9 @@ fun CourseDetailScreenP() { dismissEditBottomSheet = {}, enrollSchedule = {}, onTopBarIconClicked = {}, - openCourseDetail = {} + openCourseDetail = {}, + onReportButtonClicked = {}, + onReportWebViewClose = {} ) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt index 05bbafe81..83fed232d 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt @@ -45,6 +45,8 @@ class CourseDetailViewModel @Inject constructor( is CourseDetailContract.CourseDetailEvent.PostCourseLike -> setState { copy(courseDetail = event.courseDetail) } is CourseDetailContract.CourseDetailEvent.DeleteCourse -> setState { copy(loadState = event.loadState, deleteLoadState = event.deleteLoadState) } is CourseDetailContract.CourseDetailEvent.PostUsePoint -> setState { copy(usePointLoadState = usePointLoadState) } + is CourseDetailContract.CourseDetailEvent.OnReportWebViewClick -> setState { copy(isWebViewOpened = true) } + is CourseDetailContract.CourseDetailEvent.WebViewClose -> setState { copy(isWebViewOpened = true) } } } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt index 4537bb7f7..4ff6d1624 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt @@ -56,7 +56,7 @@ import org.sopt.dateroad.presentation.ui.component.view.DateRoadLoadingView import org.sopt.dateroad.presentation.ui.component.view.DateRoadWebView import org.sopt.dateroad.presentation.ui.mypage.component.MyPageButton import org.sopt.dateroad.presentation.ui.mypage.component.MyPagePointBox -import org.sopt.dateroad.presentation.util.CourseDetail.ASK_URL +import org.sopt.dateroad.presentation.util.MyPage.ASK_URL import org.sopt.dateroad.presentation.util.modifier.noRippleClickable import org.sopt.dateroad.presentation.util.view.LoadState import org.sopt.dateroad.ui.theme.DATEROADTheme diff --git a/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt b/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt index 62eff5f03..b377a7fea 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt @@ -24,6 +24,10 @@ object DatePicker { object CourseDetail { const val PRIVACY_POLICY_URL = "https://www.notion.so/hooooooni/04da4aa279ca4b599193784091a52859" + const val REPORT_URL = "https://tally.so/r/w4L1a5" +} + +object MyPage { const val ASK_URL = "https://dateroad.notion.site/1055d2f7bfe94b3fa6c03709448def21?pvs=4" } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6f3d3cf52..fac736606 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,7 +225,8 @@ 태그 데이트 코스 설정 글 삭제 - 취소 + 닫기 + 신고하기 다가오는 데이트 일정이 없어요 From d1d052b71d0b7a46ac49109c8e4f2d972465ef89 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Fri, 16 Aug 2024 16:13:08 +0900 Subject: [PATCH 02/10] =?UTF-8?q?[chore]=20#188=20=EC=9B=B9=EB=B7=B0=20vis?= =?UTF-8?q?ible=20setState=20=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/coursedetail/CourseDetailViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt index 83fed232d..927a33cbe 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt @@ -46,7 +46,7 @@ class CourseDetailViewModel @Inject constructor( is CourseDetailContract.CourseDetailEvent.DeleteCourse -> setState { copy(loadState = event.loadState, deleteLoadState = event.deleteLoadState) } is CourseDetailContract.CourseDetailEvent.PostUsePoint -> setState { copy(usePointLoadState = usePointLoadState) } is CourseDetailContract.CourseDetailEvent.OnReportWebViewClick -> setState { copy(isWebViewOpened = true) } - is CourseDetailContract.CourseDetailEvent.WebViewClose -> setState { copy(isWebViewOpened = true) } + is CourseDetailContract.CourseDetailEvent.WebViewClose -> setState { copy(isWebViewOpened = false) } } } From 1877e7875081192d17855c4419c5a6270cc6be87 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Sat, 17 Aug 2024 16:48:34 +0900 Subject: [PATCH 03/10] =?UTF-8?q?[chore]=20#188=20=EB=8F=99=EC=82=AC?= =?UTF-8?q?=ED=98=95=EC=9C=BC=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/coursedetail/CourseDetailContract.kt | 4 ++-- .../presentation/ui/coursedetail/CourseDetailScreen.kt | 4 ++-- .../presentation/ui/coursedetail/CourseDetailViewModel.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt index 4aca39311..55db90e5d 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt @@ -51,7 +51,7 @@ class CourseDetailContract { data class DeleteCourseLike(val courseDetail: CourseDetail) : CourseDetailEvent() data class PostCourseLike(val courseDetail: CourseDetail) : CourseDetailEvent() data class DeleteCourse(val loadState: LoadState, val deleteLoadState: LoadState) : CourseDetailEvent() - data object OnReportWebViewClick : CourseDetailEvent() - data object WebViewClose : CourseDetailEvent() + data object OnReportWebViewClicked : CourseDetailEvent() + data object DismissReportWebView : CourseDetailEvent() } } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt index 7c5f58449..8db4b0892 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt @@ -154,9 +154,9 @@ fun CourseDetailRoute( viewModel.postUsePoint(uiState.id) }, onReportButtonClicked = { - viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnReportWebViewClick) + viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnReportWebViewClicked) }, - onReportWebViewClose = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.WebViewClose) } + onReportWebViewClose = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissReportWebView) } ) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt index 927a33cbe..249586674 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt @@ -45,8 +45,8 @@ class CourseDetailViewModel @Inject constructor( is CourseDetailContract.CourseDetailEvent.PostCourseLike -> setState { copy(courseDetail = event.courseDetail) } is CourseDetailContract.CourseDetailEvent.DeleteCourse -> setState { copy(loadState = event.loadState, deleteLoadState = event.deleteLoadState) } is CourseDetailContract.CourseDetailEvent.PostUsePoint -> setState { copy(usePointLoadState = usePointLoadState) } - is CourseDetailContract.CourseDetailEvent.OnReportWebViewClick -> setState { copy(isWebViewOpened = true) } - is CourseDetailContract.CourseDetailEvent.WebViewClose -> setState { copy(isWebViewOpened = false) } + is CourseDetailContract.CourseDetailEvent.OnReportWebViewClicked -> setState { copy(isWebViewOpened = true) } + is CourseDetailContract.CourseDetailEvent.DismissReportWebView -> setState { copy(isWebViewOpened = false) } } } From 45fb660df38dbc6bcb7d0f8163f81616ac3513a6 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Mon, 26 Aug 2024 20:01:10 +0900 Subject: [PATCH 04/10] =?UTF-8?q?[chore]=20#188=20=EB=B0=94=ED=85=80?= =?UTF-8?q?=EC=8B=9C=ED=8A=B8=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/coursedetail/CourseDetailContract.kt | 9 +- .../ui/coursedetail/CourseDetailScreen.kt | 712 ++++++------------ .../ui/coursedetail/CourseDetailViewModel.kt | 6 +- 3 files changed, 233 insertions(+), 494 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt index 081642254..aabb8226c 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt @@ -10,8 +10,9 @@ import org.sopt.dateroad.presentation.util.view.LoadState class CourseDetailContract { data class CourseDetailUiState( val loadState: LoadState = LoadState.Idle, - val isEditBottomSheetOpen: Boolean = false, + val isDeleteCourseBottomSheetOpen: Boolean = false, val isRegionBottomSheetOpen: Boolean = false, + val isReportCourseBottomSheetOpen : Boolean = false, val isPointReadDialogOpen: Boolean = false, val isPointLackDialogOpen: Boolean = false, val isFreeReadDialogOpen: Boolean = false, @@ -36,8 +37,10 @@ class CourseDetailContract { data object DismissDialogLookedForFree : CourseDetailEvent() data object OnDialogPointLack : CourseDetailEvent() data object DismissDialogPointLack : CourseDetailEvent() - data object OnEditBottomSheet : CourseDetailEvent() - data object DismissEditBottomSheet : CourseDetailEvent() + data object OnDeleteCourseBottomSheet : CourseDetailEvent() + data object DismissDeleteCourseBottomSheet : CourseDetailEvent() + data object OnReportCourseBottomSheet : CourseDetailEvent() + data object DismissReportCourseBottomSheet : CourseDetailEvent() data object OpenCourse : CourseDetailEvent() data class FetchCourseDetail(val loadState: LoadState, val courseDetail: CourseDetail) : CourseDetailEvent() data class PostUsePoint(val usePointLoadState: LoadState) : CourseDetailEvent() diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt index 9ac77015a..5ae0f6989 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt @@ -1,23 +1,12 @@ package org.sopt.dateroad.presentation.ui.coursedetail -import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Icon -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf @@ -27,13 +16,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onGloballyPositioned -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -41,37 +24,28 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle -import coil.compose.AsyncImage -import coil.request.ImageRequest import com.google.accompanist.pager.ExperimentalPagerApi -import com.google.accompanist.pager.HorizontalPager -import com.google.accompanist.pager.rememberPagerState +import com.google.accompanist.pager.PagerState import org.sopt.dateroad.R import org.sopt.dateroad.domain.model.CourseDetail import org.sopt.dateroad.domain.model.Place -import org.sopt.dateroad.presentation.type.ChipType -import org.sopt.dateroad.presentation.type.CourseDetailType +import org.sopt.dateroad.presentation.type.CourseDetailUnopenedDetailType import org.sopt.dateroad.presentation.type.DateTagType.Companion.getDateTagTypeByName import org.sopt.dateroad.presentation.type.EnrollType -import org.sopt.dateroad.presentation.type.PlaceCardType -import org.sopt.dateroad.presentation.type.TagType import org.sopt.dateroad.presentation.type.TwoButtonDialogWithDescriptionType import org.sopt.dateroad.presentation.ui.component.bottomsheet.DateRoadBasicBottomSheet -import org.sopt.dateroad.presentation.ui.component.button.DateRoadBasicButton -import org.sopt.dateroad.presentation.ui.component.button.DateRoadFilledButton -import org.sopt.dateroad.presentation.ui.component.button.DateRoadImageButton -import org.sopt.dateroad.presentation.ui.component.card.DateRoadPlaceCard -import org.sopt.dateroad.presentation.ui.component.chip.DateRoadImageChip import org.sopt.dateroad.presentation.ui.component.dialog.DateRoadTwoButtonDialogWithDescription -import org.sopt.dateroad.presentation.ui.component.tag.DateRoadImageTag -import org.sopt.dateroad.presentation.ui.component.tag.DateRoadTextTag -import org.sopt.dateroad.presentation.ui.component.topbar.DateRoadBasicTopBar +import org.sopt.dateroad.presentation.ui.component.pager.DateRoadImagePager +import org.sopt.dateroad.presentation.ui.component.topbar.DateRoadScrollResponsiveTopBar import org.sopt.dateroad.presentation.ui.component.view.DateRoadErrorView import org.sopt.dateroad.presentation.ui.component.view.DateRoadIdleView import org.sopt.dateroad.presentation.ui.component.view.DateRoadLoadingView -import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailInfoBar -import org.sopt.dateroad.presentation.ui.coursedetail.component.GradientBoxWithText -import org.sopt.dateroad.presentation.util.modifier.noRippleClickable +import org.sopt.dateroad.presentation.ui.component.view.DateRoadWebView +import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailBasicInfo +import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailBottomBar +import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailUnopenedDetail +import org.sopt.dateroad.presentation.ui.coursedetail.component.courseDetailOpenedDetail +import org.sopt.dateroad.presentation.util.CourseDetail.REPORT_URL import org.sopt.dateroad.presentation.util.view.LoadState import org.sopt.dateroad.ui.theme.DATEROADTheme import org.sopt.dateroad.ui.theme.DateRoadTheme @@ -81,16 +55,11 @@ fun CourseDetailRoute( viewModel: CourseDetailViewModel = hiltViewModel(), popBackStack: () -> Unit, navigateToEnroll: (EnrollType, Int?) -> Unit, - courseDetailType: CourseDetailType, - id: Int + courseId: Int ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() val lifecycleOwner = LocalLifecycleOwner.current - LaunchedEffect(Unit) { - viewModel.setEvent(CourseDetailContract.CourseDetailEvent.InitCourseDetail(id = id, courseDetailType = courseDetailType)) - } - LaunchedEffect(viewModel.sideEffect, lifecycleOwner) { viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { courseDetailSideEffect -> @@ -101,17 +70,8 @@ fun CourseDetailRoute( } } - LaunchedEffect(uiState.id) { - if (uiState.id != 0) { - when (uiState.courseDetailType) { - CourseDetailType.COURSE -> viewModel.fetchCourseDetail(uiState.id) - CourseDetailType.ADVERTISEMENT -> viewModel.fetchAdvertisementDetail(uiState.id) - } - } - } - when (uiState.deleteLoadState) { - LoadState.Success -> popBackStack() - else -> Unit + LaunchedEffect(Unit) { + viewModel.fetchCourseDetail(courseId = courseId) } when (uiState.loadState) { @@ -121,6 +81,7 @@ fun CourseDetailRoute( LoadState.Success -> { CourseDetailScreen( + courseId = courseId, courseDetailUiState = uiState, onDialogPointLack = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogPointLack) }, onDialogPointLackConfirm = { @@ -133,34 +94,44 @@ fun CourseDetailRoute( onDialogLookedByPoint = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogLookedByPoint) }, dismissDialogLookedByPoint = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDialogLookedByPoint) }, onLikeButtonClicked = { - if (uiState.id != 0) { - when (uiState.courseDetail.isUserLiked) { - true -> viewModel.deleteCourseLike(uiState.id) - false -> viewModel.postCourseLike(uiState.id) - } + when (uiState.courseDetail.isUserLiked) { + true -> viewModel.deleteCourseLike(courseId = courseId) + false -> viewModel.postCourseLike(courseId = courseId) } }, onDeleteButtonClicked = { - viewModel.deleteCourse(uiState.id) + viewModel.deleteCourse(courseId = courseId) }, - onEditBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnEditBottomSheet) }, - dismissEditBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissEditBottomSheet) }, - enrollSchedule = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(EnrollType.TIMELINE, uiState.id)) }, - onTopBarIconClicked = popBackStack, + onDeleteCourseBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDeleteCourseBottomSheet) }, + dismissDeleteCourseBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDeleteCourseBottomSheet) }, + onReportCourseBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnReportCourseBottomSheet) }, + dismissReportCourseBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissReportCourseBottomSheet) }, + enrollSchedule = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(EnrollType.TIMELINE, courseId)) }, + onTopBarIconClicked = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.PopBackStack) }, openCourseDetail = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OpenCourse) - viewModel.postUsePoint(uiState.id) - } + viewModel.postUsePoint(courseId = courseId) + }, + onReportButtonClicked = { + viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnReportWebViewClicked) + }, + onReportWebViewClose = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissReportWebView) } ) } LoadState.Error -> DateRoadErrorView() } + + when (uiState.deleteLoadState) { + LoadState.Success -> popBackStack() + else -> Unit + } } @OptIn(ExperimentalPagerApi::class) @Composable fun CourseDetailScreen( + courseId: Int, courseDetailUiState: CourseDetailContract.CourseDetailUiState, onDialogPointLack: () -> Unit, onDialogPointLackConfirm: () -> Unit, @@ -171,478 +142,241 @@ fun CourseDetailScreen( dismissDialogLookedByPoint: () -> Unit, onLikeButtonClicked: () -> Unit, onDeleteButtonClicked: () -> Unit, - onEditBottomSheet: () -> Unit, - dismissEditBottomSheet: () -> Unit, + onDeleteCourseBottomSheet: () -> Unit, + dismissDeleteCourseBottomSheet: () -> Unit, + onReportCourseBottomSheet: () -> Unit, + onReportButtonClicked: () -> Unit, + onReportWebViewClose: () -> Unit, + dismissReportCourseBottomSheet: () -> Unit, enrollSchedule: () -> Unit, onTopBarIconClicked: () -> Unit, openCourseDetail: () -> Unit ) { - val buttonText = - if (courseDetailUiState.courseDetail.free > 0) { - stringResource(id = R.string.course_detail_free_read_button, courseDetailUiState.courseDetail.free) - } else { - stringResource(id = R.string.course_detail_point_read_button) - } - val buttonDescription = - if (courseDetailUiState.courseDetail.free > 0) { - stringResource(id = R.string.course_detail_free_read_button_description) - } else { - stringResource(id = R.string.course_detail_point_read_button_description) - } var imageHeight by remember { mutableIntStateOf(0) } - val pagerState = rememberPagerState() val scrollState = rememberLazyListState() - val isTopBarTransparent by remember { + val isScrollResponsiveDefault by remember { derivedStateOf { scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset < imageHeight } } - Box(modifier = Modifier.fillMaxSize()) { - Column { + + val isViewable = courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine + val courseDetailUnopenedType = if (courseDetailUiState.courseDetail.free > 0) CourseDetailUnopenedDetailType.FREE else CourseDetailUnopenedDetailType.POINT + + if (courseDetailUiState.isWebViewOpened) { + DateRoadWebView(url = REPORT_URL, onClose = onReportWebViewClose) + }else{ + Box(modifier = Modifier.fillMaxSize()) { LazyColumn( state = scrollState, modifier = Modifier .fillMaxSize() - .background(DateRoadTheme.colors.white), - userScrollEnabled = true + .background(DateRoadTheme.colors.white) ) { - item { - Box(modifier = Modifier.fillMaxWidth()) { - HorizontalPager( - count = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.images.size else courseDetailUiState.advertisementDetail.images.size, - state = pagerState, - modifier = Modifier - .fillMaxWidth(), - userScrollEnabled = courseDetailUiState.courseDetailType == CourseDetailType.ADVERTISEMENT || courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine - ) { page -> - AsyncImage( - model = ImageRequest.Builder(context = LocalContext.current) - .data(if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.images[page] else courseDetailUiState.advertisementDetail.images[page]) - .crossfade(true) - .build(), - contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .aspectRatio(1f) - .onGloballyPositioned { coordinates -> - imageHeight = coordinates.size.height - }, - contentScale = ContentScale.Crop - ) - } - - if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { - DateRoadImageTag( - textContent = courseDetailUiState.courseDetail.like.toString(), - imageContent = R.drawable.ic_tag_heart, - tagContentType = TagType.HEART, - modifier = Modifier - .padding(start = 10.dp, bottom = 10.dp) - .align(Alignment.BottomStart) - ) - } - - DateRoadTextTag( - textContent = stringResource(id = R.string.fraction_format, pagerState.currentPage + 1, pagerState.pageCount), - tagContentType = TagType.COURSE_DETAIL_PHOTO_NUMBER, + with(courseDetailUiState.courseDetail) { + item { + DateRoadImagePager( modifier = Modifier - .padding(end = 10.dp, bottom = 10.dp) - .align(Alignment.BottomEnd) + .onGloballyPositioned { coordinates -> + imageHeight = coordinates.size.height + }, + pagerState = PagerState(), + images = courseDetailUiState.courseDetail.images, + userScrollEnabled = isViewable, + like = courseDetailUiState.courseDetail.like.toString() ) } - } - item { - Column( - modifier = Modifier - .background(DateRoadTheme.colors.white) - .padding(horizontal = 16.dp) - .padding(top = 18.dp) - ) { - if (courseDetailUiState.courseDetailType == CourseDetailType.ADVERTISEMENT) { - DateRoadTextTag( - textContent = courseDetailUiState.advertisementDetail.advertisementTagTitle, - tagContentType = TagType.ADVERTISEMENT_TITLE - ) - Spacer(modifier = Modifier.height(16.dp)) - } - Text( - text = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.date else courseDetailUiState.advertisementDetail.createAt, - style = DateRoadTheme.typography.bodySemi15, - color = DateRoadTheme.colors.gray400 - ) - Spacer(modifier = Modifier.height(16.dp)) - Text( - text = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.title else courseDetailUiState.advertisementDetail.title, - style = DateRoadTheme.typography.titleExtra24, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(16.dp)) - if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { - CourseDetailInfoBar( - totalTime = courseDetailUiState.courseDetail.totalTime, - totalCost = courseDetailUiState.courseDetail.totalCostTag, - city = courseDetailUiState.courseDetail.city - ) - Spacer(modifier = Modifier.height(16.dp)) - } - when (courseDetailUiState.courseDetailType) { - CourseDetailType.COURSE -> { - when (courseDetailUiState.courseDetail.isCourseMine || courseDetailUiState.courseDetail.isAccess) { - true -> { - Text( - text = courseDetailUiState.courseDetail.description, - style = DateRoadTheme.typography.bodyMed13Context, - color = DateRoadTheme.colors.black - ) - } - - false -> { - Column( - modifier = Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - GradientBoxWithText(text = courseDetailUiState.courseDetail.description) - Column { - Spacer(modifier = Modifier.height(8.dp)) - Image( - painter = painterResource(id = R.drawable.ic_course_detail_is_not_access), - contentDescription = null, - modifier = Modifier - .align(Alignment.CenterHorizontally) - ) - Spacer(modifier = Modifier.height(8.dp)) - Text( - text = stringResource(id = R.string.course_detail_unopened_title), - style = DateRoadTheme.typography.bodyBold17, - color = DateRoadTheme.colors.black, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) - Spacer(modifier = Modifier.height(4.dp)) - Text( - text = buttonDescription, - style = DateRoadTheme.typography.bodySemi15, - color = DateRoadTheme.colors.purple600, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) - Spacer(modifier = Modifier.height(24.dp)) - DateRoadFilledButton( - modifier = Modifier - .align(Alignment.CenterHorizontally), - isEnabled = true, - textContent = buttonText, - onClick = { - if (courseDetailUiState.courseDetail.free > 0) { - onDialogLookedForFree() - } else { - onDialogLookedByPoint() - } - }, - textStyle = DateRoadTheme.typography.bodyBold15, - enabledBackgroundColor = DateRoadTheme.colors.purple600, - enabledTextColor = DateRoadTheme.colors.white, - disabledBackgroundColor = DateRoadTheme.colors.gray200, - disabledTextColor = DateRoadTheme.colors.gray400, - cornerRadius = 14.dp, - paddingHorizontal = 52.dp, - paddingVertical = 16.dp - ) - Spacer(modifier = Modifier.height(16.dp)) - } - } - } - } - } - CourseDetailType.ADVERTISEMENT -> { - Text( - text = courseDetailUiState.advertisementDetail.description, - style = DateRoadTheme.typography.bodyMed13Context, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(80.dp)) - } - } - } - } - if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE && courseDetailUiState.courseDetail.isCourseMine || courseDetailUiState.courseDetail.isAccess) { item { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Spacer(modifier = Modifier.height(30.dp)) - Text( - text = stringResource(id = R.string.course_detail_timeline_title), - style = DateRoadTheme.typography.titleBold18, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(12.dp)) - } + CourseDetailBasicInfo( + date = date, + title = title, + totalTime = totalTime, + totalCost = totalCost, + city = city + ) } - items(courseDetailUiState.courseDetail.places.size) { index -> - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - DateRoadPlaceCard( - placeCardType = PlaceCardType.COURSE_NORMAL, - sequence = index, - place = courseDetailUiState.courseDetail.places[index] + when (isViewable) { + true -> { + courseDetailOpenedDetail( + description = description, + places = places, + totalCost = totalCost, + tags = tags.mapNotNull { tag -> tag.getDateTagTypeByName() } ) - Spacer(modifier = Modifier.height(16.dp)) + if (!isCourseMine) { + item { + Spacer(modifier = Modifier.height(86.dp)) + } + } } - } - item { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Spacer(modifier = Modifier.height(14.dp)) - Text( - text = stringResource(id = R.string.course_total_cost_string), - style = DateRoadTheme.typography.titleBold18, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(12.dp)) - Text( - text = courseDetailUiState.courseDetail.totalCost, - style = DateRoadTheme.typography.bodyBold15, - color = DateRoadTheme.colors.black, - modifier = Modifier - .fillMaxWidth() - .clip(RoundedCornerShape(10.dp)) - .background(DateRoadTheme.colors.gray100) - .padding(start = 20.dp, top = 15.dp, end = 5.dp, bottom = 17.dp) - ) - Spacer(modifier = Modifier.height(30.dp)) - Text( - text = stringResource(id = R.string.course_detail_tag), - style = DateRoadTheme.typography.titleBold18, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(12.dp)) - } - } - item { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Row(horizontalArrangement = Arrangement.spacedBy(7.dp)) { - courseDetailUiState.courseDetail.tags.forEach { tag -> - tag.getDateTagTypeByName()?.let { tagType -> - DateRoadImageChip( - textId = tagType.titleRes, - imageRes = tagType.imageRes, - chipType = ChipType.DATE, - isSelected = false - ) + false -> { + item { + CourseDetailUnopenedDetail( + text = description, + free = free, + courseDetailUnopenedDetailType = courseDetailUnopenedType, + onButtonClicked = when (courseDetailUnopenedType) { + CourseDetailUnopenedDetailType.FREE -> onDialogLookedForFree + CourseDetailUnopenedDetailType.POINT -> onDialogLookedByPoint } - } - } - Spacer(modifier = Modifier.height(38.dp)) - if (!courseDetailUiState.courseDetail.isCourseMine) { - Spacer(modifier = Modifier.height(80.dp)) + ) } } } } } - } - Box( - modifier = Modifier.background( - if (isTopBarTransparent) { - Brush.verticalGradient( - colors = listOf( - DateRoadTheme.colors.black.copy(alpha = 0.22f), - Color.Transparent - ) - ) - } else { - Brush.verticalGradient( - colors = listOf( - DateRoadTheme.colors.white, - DateRoadTheme.colors.white - ) - ) - } - ) - ) { - DateRoadBasicTopBar( - title = "", - backGroundColor = if (isTopBarTransparent) Color.Transparent else DateRoadTheme.colors.white, - iconLeftResource = R.drawable.ic_top_bar_back_white, - onIconClick = { onTopBarIconClicked() }, - buttonContent = { - if (courseDetailUiState.courseDetail.isCourseMine && courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { - Icon( - painterResource(id = R.drawable.btn_course_detail_more_white), - contentDescription = null, - tint = if (isTopBarTransparent) DateRoadTheme.colors.white else DateRoadTheme.colors.black, - modifier = Modifier.noRippleClickable { onEditBottomSheet() } - ) - } - }, - leftTint = if (isTopBarTransparent) DateRoadTheme.colors.white else DateRoadTheme.colors.black + DateRoadScrollResponsiveTopBar( + isDefault = isScrollResponsiveDefault, + onLeftIconClick = onTopBarIconClicked, + onRightIconClick = if (courseDetailUiState.courseDetail.isCourseMine) onDeleteCourseBottomSheet else onReportCourseBottomSheet, + rightIconResource = if (isViewable) R.drawable.btn_course_detail_more_white else null ) - } - if (!courseDetailUiState.courseDetail.isCourseMine && courseDetailUiState.courseDetail.isAccess) { - Box( - modifier = Modifier - .fillMaxWidth() - .background(color = DateRoadTheme.colors.white) - .align(Alignment.BottomCenter) - .padding(horizontal = 16.dp, vertical = 16.dp) - ) { - Row { - DateRoadImageButton( - iconResId = R.drawable.ic_coures_detail_heart_default, - enabledContentColor = DateRoadTheme.colors.purple600, - disabledContentColor = DateRoadTheme.colors.gray200, - enabledBackgroundColor = DateRoadTheme.colors.gray100, - disabledBackgroundColor = DateRoadTheme.colors.gray100, - isEnabled = courseDetailUiState.courseDetail.isUserLiked, - onClick = onLikeButtonClicked, - cornerRadius = 14.dp, - paddingHorizontal = 23.dp, - paddingVertical = 18.dp - ) - Spacer(modifier = Modifier.width(12.dp)) - DateRoadBasicButton( - modifier = Modifier.weight(1f), - isEnabled = true, - textContent = stringResource(id = R.string.course_detail_get_course), - onClick = { enrollSchedule() } - ) - } + if (isViewable && !courseDetailUiState.courseDetail.isCourseMine) { + CourseDetailBottomBar( + modifier = Modifier.align(Alignment.BottomCenter), + isUserLiked = courseDetailUiState.courseDetail.isUserLiked, + onLikeButtonClicked = onLikeButtonClicked, + onEnrollButtonClicked = enrollSchedule + ) } - } - } - if (courseDetailUiState.isPointReadDialogOpen) { - DateRoadTwoButtonDialogWithDescription( - twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.READ_COURSE, - onDismissRequest = { dismissDialogLookedByPoint() }, - onClickConfirm = { - dismissDialogLookedByPoint() - if (courseDetailUiState.courseDetail.totalPoint < 50) { - onDialogPointLack() - } else { - openCourseDetail() - } - }, - onClickDismiss = { dismissDialogLookedByPoint() } - ) - } - - if (courseDetailUiState.isPointLackDialogOpen) { - DateRoadTwoButtonDialogWithDescription( - twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.POINT_LACK, - onDismissRequest = dismissDialogPointLack, - onClickConfirm = onDialogPointLackConfirm, - onClickDismiss = dismissDialogPointLack - ) - } + if (courseDetailUiState.isPointReadDialogOpen) { + DateRoadTwoButtonDialogWithDescription( + twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.READ_COURSE, + onDismissRequest = { dismissDialogLookedByPoint() }, + onClickConfirm = { + dismissDialogLookedByPoint() + if (courseDetailUiState.courseDetail.totalPoint < 50) { + onDialogPointLack() + } else { + openCourseDetail() + } + }, + onClickDismiss = { dismissDialogLookedByPoint() } + ) + } - if (courseDetailUiState.isFreeReadDialogOpen) { - DateRoadTwoButtonDialogWithDescription( - twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.FREE_READ, - onDismissRequest = { dismissDialogLookedForFree() }, - onClickConfirm = { - dismissDialogLookedForFree() - openCourseDetail() - }, - onClickDismiss = { dismissDialogLookedForFree() } - ) - } + if (courseDetailUiState.isPointLackDialogOpen) { + DateRoadTwoButtonDialogWithDescription( + twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.POINT_LACK, + onDismissRequest = dismissDialogPointLack, + onClickConfirm = onDialogPointLackConfirm, + onClickDismiss = dismissDialogPointLack + ) + } - DateRoadBasicBottomSheet( - isBottomSheetOpen = courseDetailUiState.isEditBottomSheetOpen, - title = stringResource(id = R.string.course_detail_bottom_sheet_title), - isButtonEnabled = false, - buttonText = stringResource(id = R.string.course_detail_bottom_sheet_delete), - itemList = listOf( - stringResource(id = R.string.course_detail_bottom_sheet_confirm) to { - onDeleteButtonClicked() + if (courseDetailUiState.isFreeReadDialogOpen) { + DateRoadTwoButtonDialogWithDescription( + twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.FREE_READ, + onDismissRequest = { dismissDialogLookedForFree() }, + onClickConfirm = { + dismissDialogLookedForFree() + openCourseDetail() + }, + onClickDismiss = { dismissDialogLookedForFree() } + ) } - ), - onDismissRequest = { dismissEditBottomSheet() }, - onButtonClick = { - dismissEditBottomSheet() - } - ) -} -@Composable -fun CourseDetailScreenP() { - val dummyCourseDetail = CourseDetailContract.CourseDetailUiState( - loadState = LoadState.Success, - courseDetailType = CourseDetailType.COURSE, - courseDetail = CourseDetail( - courseId = 1, - title = "Sample Course", - description = "This is a sample course description.", - totalTime = "4 hours", - totalCost = "$100", - city = "Seoul", - images = listOf( - "https://via.placeholder.com/300", - "https://via.placeholder.com/300" - ), - tags = listOf("TAG1", "TAG2"), - places = listOf( - Place( - title = "Place 1", - duration = "1" + DateRoadBasicBottomSheet( + isBottomSheetOpen = courseDetailUiState.isDeleteCourseBottomSheetOpen, + title = stringResource(id = R.string.course_detail_bottom_sheet_title), + isButtonEnabled = false, + buttonText = stringResource(id = R.string.course_detail_bottom_sheet_delete), + itemList = listOf( + stringResource(id = R.string.course_detail_bottom_sheet_confirm) to { + onDeleteButtonClicked() + } ), - Place( - title = "Place 2", - duration = "2" - ) - ), - isCourseMine = true, - isAccess = true, - isUserLiked = false, - like = 10, - free = 2, - totalPoint = 30 - ) - ) + onDismissRequest = { dismissDeleteCourseBottomSheet() }, + onButtonClick = { + dismissDeleteCourseBottomSheet() + } + ) - CourseDetailScreen( - courseDetailUiState = dummyCourseDetail, - onDialogPointLack = {}, - dismissDialogPointLack = {}, - onDialogPointLackConfirm = {}, - onDialogLookedForFree = {}, - dismissDialogLookedForFree = {}, - onDialogLookedByPoint = {}, - dismissDialogLookedByPoint = {}, - onLikeButtonClicked = {}, - onDeleteButtonClicked = {}, - onEditBottomSheet = {}, - dismissEditBottomSheet = {}, - enrollSchedule = {}, - onTopBarIconClicked = {}, - openCourseDetail = {} - ) + DateRoadBasicBottomSheet( + isBottomSheetOpen = courseDetailUiState.isReportCourseBottomSheetOpen, + title = stringResource(id = R.string.course_detail_bottom_sheet_title), + isButtonEnabled = false, + buttonText = stringResource(id = R.string.course_detail_bottom_sheet_delete), + itemList = listOf( + stringResource(id = R.string.course_detail_bottom_sheet_report) to { + onReportButtonClicked() + } + ), + onDismissRequest = { dismissReportCourseBottomSheet() }, + onButtonClick = { + dismissReportCourseBottomSheet() + } + ) + } + } } @Preview @Composable fun CourseDetailScreenPreview() { DATEROADTheme { - CourseDetailScreenP() + val dummyCourseDetail = CourseDetailContract.CourseDetailUiState( + loadState = LoadState.Success, + courseDetail = CourseDetail( + courseId = 1, + title = "Sample Course", + description = "This is a sample course description.", + totalTime = "4 hours", + totalCost = "$100", + city = "Seoul", + images = listOf( + "https://via.placeholder.com/300", + "https://via.placeholder.com/300" + ), + tags = listOf("TAG1", "TAG2"), + places = listOf( + Place( + title = "Place 1", + duration = "1" + ), + Place( + title = "Place 2", + duration = "2" + ) + ), + isCourseMine = true, + isAccess = true, + isUserLiked = false, + like = 10, + free = 2, + totalPoint = 30 + ) + ) + + CourseDetailScreen( + courseId = 1, + courseDetailUiState = dummyCourseDetail, + onDialogPointLack = {}, + dismissDialogPointLack = {}, + onDialogPointLackConfirm = {}, + onDialogLookedForFree = {}, + dismissDialogLookedForFree = {}, + onDialogLookedByPoint = {}, + dismissDialogLookedByPoint = {}, + onLikeButtonClicked = {}, + onDeleteButtonClicked = {}, + onDeleteCourseBottomSheet = {}, + dismissDeleteCourseBottomSheet = {}, + onReportCourseBottomSheet = {}, + dismissReportCourseBottomSheet = {}, + enrollSchedule = {}, + onTopBarIconClicked = {}, + openCourseDetail = {}, + onReportButtonClicked = {}, + onReportWebViewClose = {} + ) } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt index 241e41b03..0bfa12335 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt @@ -33,8 +33,10 @@ class CourseDetailViewModel @Inject constructor( is CourseDetailContract.CourseDetailEvent.OnDialogLookedByPoint -> setState { copy(isPointReadDialogOpen = true) } is CourseDetailContract.CourseDetailEvent.DismissDialogLookedByPoint -> setState { copy(isPointReadDialogOpen = false) } is CourseDetailContract.CourseDetailEvent.OnLikeButtonClicked -> setState { copy(isLikedButtonChecked = !isLikedButtonChecked) } - is CourseDetailContract.CourseDetailEvent.OnEditBottomSheet -> setState { copy(isEditBottomSheetOpen = true) } - is CourseDetailContract.CourseDetailEvent.DismissEditBottomSheet -> setState { copy(isEditBottomSheetOpen = false) } + is CourseDetailContract.CourseDetailEvent.OnDeleteCourseBottomSheet -> setState { copy(isDeleteCourseBottomSheetOpen = true) } + is CourseDetailContract.CourseDetailEvent.DismissDeleteCourseBottomSheet -> setState { copy(isDeleteCourseBottomSheetOpen = false) } + is CourseDetailContract.CourseDetailEvent.OnReportCourseBottomSheet -> setState { copy(isReportCourseBottomSheetOpen = true) } + is CourseDetailContract.CourseDetailEvent.DismissReportCourseBottomSheet -> setState { copy(isReportCourseBottomSheetOpen = false) } is CourseDetailContract.CourseDetailEvent.OpenCourse -> setState { copy(courseDetail = courseDetail.copy(isAccess = true)) } is CourseDetailContract.CourseDetailEvent.FetchCourseDetail -> setState { copy(loadState = event.loadState, courseDetail = event.courseDetail) } is CourseDetailContract.CourseDetailEvent.DeleteCourseLike -> setState { copy(courseDetail = event.courseDetail) } From 9faaee00072e6d0bf5babb757dd4860e88ccdfb2 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Mon, 26 Aug 2024 20:08:05 +0900 Subject: [PATCH 05/10] [chore] #188 ktlint Format --- .../presentation/ui/coursedetail/CourseDetailContract.kt | 2 +- .../presentation/ui/coursedetail/CourseDetailScreen.kt | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt index aabb8226c..e9c056a25 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt @@ -12,7 +12,7 @@ class CourseDetailContract { val loadState: LoadState = LoadState.Idle, val isDeleteCourseBottomSheetOpen: Boolean = false, val isRegionBottomSheetOpen: Boolean = false, - val isReportCourseBottomSheetOpen : Boolean = false, + val isReportCourseBottomSheetOpen: Boolean = false, val isPointReadDialogOpen: Boolean = false, val isPointLackDialogOpen: Boolean = false, val isFreeReadDialogOpen: Boolean = false, diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt index 5ae0f6989..ec862e96c 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt @@ -161,13 +161,12 @@ fun CourseDetailScreen( } } - val isViewable = courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine val courseDetailUnopenedType = if (courseDetailUiState.courseDetail.free > 0) CourseDetailUnopenedDetailType.FREE else CourseDetailUnopenedDetailType.POINT if (courseDetailUiState.isWebViewOpened) { DateRoadWebView(url = REPORT_URL, onClose = onReportWebViewClose) - }else{ + } else { Box(modifier = Modifier.fillMaxSize()) { LazyColumn( state = scrollState, @@ -379,4 +378,4 @@ fun CourseDetailScreenPreview() { onReportWebViewClose = {} ) } -} \ No newline at end of file +} From 4f941d42b22185242678dc2d483c15da56f17ea4 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Mon, 26 Aug 2024 20:40:19 +0900 Subject: [PATCH 06/10] =?UTF-8?q?[chore]=20#188=20=EC=82=AD=EC=A0=9C,=20?= =?UTF-8?q?=EC=8B=A0=EA=B3=A0=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TwoButtonDialogWithDescriptionType.kt | 13 ++++++ .../ui/coursedetail/CourseDetailContract.kt | 6 +++ .../ui/coursedetail/CourseDetailScreen.kt | 42 +++++++++++++++++-- .../ui/coursedetail/CourseDetailViewModel.kt | 4 ++ .../component/CourseDetailTimeline.kt | 2 + app/src/main/res/values/strings.xml | 6 +++ 6 files changed, 70 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt b/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt index 9ca5d097a..0ee582794 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt @@ -33,6 +33,12 @@ enum class TwoButtonDialogWithDescriptionType( confirmButtonTextRes = R.string.dialog_delete, dismissButtonTextRes = R.string.dialog_cancel ), + DELETE_COURSE( + titleRes = R.string.two_button_dialog_with_description_delete_timeline_title, + descriptionRes = R.string.two_button_dialog_with_description_delete_course_description, + confirmButtonTextRes = R.string.dialog_delete, + dismissButtonTextRes = R.string.dialog_cancel + ), DELETE_PAST( titleRes = R.string.two_button_dialog_with_description_delete_past_title, descriptionRes = R.string.dialog_delete_schedule, @@ -44,5 +50,12 @@ enum class TwoButtonDialogWithDescriptionType( descriptionRes = R.string.two_button_dialog_with_description_withdrawal_description, confirmButtonTextRes = R.string.dialog_cancel, dismissButtonTextRes = R.string.withdrawal + ), + + REPORT_COURSE( + titleRes = R.string.two_button_dialog_with_description_report_course_title, + descriptionRes = R.string.two_button_dialog_with_description_report_course_description, + confirmButtonTextRes = R.string.dialog_report, + dismissButtonTextRes = R.string.dialog_cancel ) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt index e9c056a25..df94d1337 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailContract.kt @@ -16,6 +16,8 @@ class CourseDetailContract { val isPointReadDialogOpen: Boolean = false, val isPointLackDialogOpen: Boolean = false, val isFreeReadDialogOpen: Boolean = false, + val isDeleteCourseDialogOpen: Boolean = false, + val isReportCourseDialogOpen: Boolean = false, val isLikedButtonChecked: Boolean = false, val courseDetail: CourseDetail = CourseDetail(), val currentImagePage: Int = 0, @@ -37,6 +39,10 @@ class CourseDetailContract { data object DismissDialogLookedForFree : CourseDetailEvent() data object OnDialogPointLack : CourseDetailEvent() data object DismissDialogPointLack : CourseDetailEvent() + data object OnDialogDeleteCourse : CourseDetailEvent() + data object DismissDialogDeleteCourse : CourseDetailEvent() + data object OnDialogReportCourse : CourseDetailEvent() + data object DismissDialogReportCourse : CourseDetailEvent() data object OnDeleteCourseBottomSheet : CourseDetailEvent() data object DismissDeleteCourseBottomSheet : CourseDetailEvent() data object OnReportCourseBottomSheet : CourseDetailEvent() diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt index ec862e96c..9ef04534a 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt @@ -92,6 +92,10 @@ fun CourseDetailRoute( onDialogLookedForFree = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogLookedForFree) }, dismissDialogLookedForFree = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDialogLookedForFree) }, onDialogLookedByPoint = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogLookedByPoint) }, + onDialogDeleteCourse = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogDeleteCourse) }, + onDialogReportCourse = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogReportCourse) }, + dismissDialogDeleteCourse = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDialogDeleteCourse) }, + dismissDialogReportCourse = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDialogReportCourse) }, dismissDialogLookedByPoint = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissDialogLookedByPoint) }, onLikeButtonClicked = { when (uiState.courseDetail.isUserLiked) { @@ -140,6 +144,10 @@ fun CourseDetailScreen( dismissDialogLookedForFree: () -> Unit, onDialogLookedByPoint: () -> Unit, dismissDialogLookedByPoint: () -> Unit, + onDialogDeleteCourse: () -> Unit, + dismissDialogDeleteCourse: () -> Unit, + onDialogReportCourse: () -> Unit, + dismissDialogReportCourse: () -> Unit, onLikeButtonClicked: () -> Unit, onDeleteButtonClicked: () -> Unit, onDeleteCourseBottomSheet: () -> Unit, @@ -283,6 +291,30 @@ fun CourseDetailScreen( ) } + if (courseDetailUiState.isDeleteCourseDialogOpen) { + DateRoadTwoButtonDialogWithDescription( + twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.DELETE_COURSE, + onDismissRequest = { dismissDialogDeleteCourse() }, + onClickConfirm = { + dismissDialogDeleteCourse() + onDeleteButtonClicked() + }, + onClickDismiss = { dismissDialogDeleteCourse() } + ) + } + + if (courseDetailUiState.isReportCourseDialogOpen) { + DateRoadTwoButtonDialogWithDescription( + twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.REPORT_COURSE, + onDismissRequest = { dismissDialogReportCourse() }, + onClickConfirm = { + dismissDialogReportCourse() + onReportButtonClicked() + }, + onClickDismiss = { dismissDialogReportCourse() } + ) + } + DateRoadBasicBottomSheet( isBottomSheetOpen = courseDetailUiState.isDeleteCourseBottomSheetOpen, title = stringResource(id = R.string.course_detail_bottom_sheet_title), @@ -290,7 +322,7 @@ fun CourseDetailScreen( buttonText = stringResource(id = R.string.course_detail_bottom_sheet_delete), itemList = listOf( stringResource(id = R.string.course_detail_bottom_sheet_confirm) to { - onDeleteButtonClicked() + onDialogDeleteCourse() } ), onDismissRequest = { dismissDeleteCourseBottomSheet() }, @@ -306,7 +338,7 @@ fun CourseDetailScreen( buttonText = stringResource(id = R.string.course_detail_bottom_sheet_delete), itemList = listOf( stringResource(id = R.string.course_detail_bottom_sheet_report) to { - onReportButtonClicked() + onDialogReportCourse() } ), onDismissRequest = { dismissReportCourseBottomSheet() }, @@ -375,7 +407,11 @@ fun CourseDetailScreenPreview() { onTopBarIconClicked = {}, openCourseDetail = {}, onReportButtonClicked = {}, - onReportWebViewClose = {} + onReportWebViewClose = {}, + onDialogDeleteCourse = {}, + onDialogReportCourse = {}, + dismissDialogDeleteCourse = {}, + dismissDialogReportCourse = {} ) } } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt index 0bfa12335..d1509a112 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailViewModel.kt @@ -30,6 +30,10 @@ class CourseDetailViewModel @Inject constructor( is CourseDetailContract.CourseDetailEvent.DismissDialogPointLack -> setState { copy(isPointLackDialogOpen = false) } is CourseDetailContract.CourseDetailEvent.OnDialogLookedForFree -> setState { copy(isFreeReadDialogOpen = true) } is CourseDetailContract.CourseDetailEvent.DismissDialogLookedForFree -> setState { copy(isFreeReadDialogOpen = false) } + is CourseDetailContract.CourseDetailEvent.OnDialogDeleteCourse -> setState { copy(isDeleteCourseDialogOpen = true) } + is CourseDetailContract.CourseDetailEvent.DismissDialogDeleteCourse -> setState { copy(isDeleteCourseDialogOpen = false) } + is CourseDetailContract.CourseDetailEvent.OnDialogReportCourse -> setState { copy(isReportCourseDialogOpen = true) } + is CourseDetailContract.CourseDetailEvent.DismissDialogReportCourse -> setState { copy(isReportCourseDialogOpen = false) } is CourseDetailContract.CourseDetailEvent.OnDialogLookedByPoint -> setState { copy(isPointReadDialogOpen = true) } is CourseDetailContract.CourseDetailEvent.DismissDialogLookedByPoint -> setState { copy(isPointReadDialogOpen = false) } is CourseDetailContract.CourseDetailEvent.OnLikeButtonClicked -> setState { copy(isLikedButtonChecked = !isLikedButtonChecked) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt index 278890fcc..49e65a7f5 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt @@ -5,8 +5,10 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.material3.Text +import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.dateroad.R import org.sopt.dateroad.domain.model.Place diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 577e2be7c..2caf55566 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,7 @@ 확인 확인했어요 삭제 + 신고 삭제된 일정은 복구하실 수 없어요 @@ -167,9 +168,14 @@ 무료 열람 기회를 사용해 보시겠어요? 무료 열람 기회는 한 번 사용하면 취소할 수 없어요 데이트 일정을 삭제하시겠어요? + 데이트 코스를 삭제하시겠어요? + 데이트 코스를 신고하시겠어요? 지난 데이트를 삭제하시겠어요? 정말로 탈퇴하시겠어요? 삭제된 계정은 복구하실 수 없어요 + 삭제된 코스는 복구하실 수 없어요 + 신고된 게시물은 확인 후 서비스의 운영원칙에\n따라 조치 예정이에요 + 포인트 내역 From 01f6451a38e39d82cafdd539d9e5a86db8dd9081 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Mon, 26 Aug 2024 20:40:47 +0900 Subject: [PATCH 07/10] [chore] #188 ktlint Format --- .../ui/coursedetail/component/CourseDetailTimeline.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt index 49e65a7f5..278890fcc 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt @@ -5,10 +5,8 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.material3.Text -import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.dateroad.R import org.sopt.dateroad.domain.model.Place From bf60700f579a42311056c646cd420d54d8a053cf Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Tue, 27 Aug 2024 16:55:37 +0900 Subject: [PATCH 08/10] =?UTF-8?q?[chore]=20#188=20url=20object=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/type/TwoButtonDialogWithDescriptionType.kt | 1 - .../presentation/ui/coursedetail/CourseDetailScreen.kt | 2 +- .../org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt | 2 +- .../org/sopt/dateroad/presentation/ui/signin/SignInScreen.kt | 2 +- .../java/org/sopt/dateroad/presentation/util/Constraints.kt | 5 +---- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt b/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt index 0ee582794..4165c6f05 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt @@ -51,7 +51,6 @@ enum class TwoButtonDialogWithDescriptionType( confirmButtonTextRes = R.string.dialog_cancel, dismissButtonTextRes = R.string.withdrawal ), - REPORT_COURSE( titleRes = R.string.two_button_dialog_with_description_report_course_title, descriptionRes = R.string.two_button_dialog_with_description_report_course_description, diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt index 9ef04534a..70c5a5234 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt @@ -45,7 +45,7 @@ import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailBasi import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailBottomBar import org.sopt.dateroad.presentation.ui.coursedetail.component.CourseDetailUnopenedDetail import org.sopt.dateroad.presentation.ui.coursedetail.component.courseDetailOpenedDetail -import org.sopt.dateroad.presentation.util.CourseDetail.REPORT_URL +import org.sopt.dateroad.presentation.util.WebViewUrl.REPORT_URL import org.sopt.dateroad.presentation.util.view.LoadState import org.sopt.dateroad.ui.theme.DATEROADTheme import org.sopt.dateroad.ui.theme.DateRoadTheme diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt index 4ff6d1624..8bcdf071f 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/mypage/MyPageScreen.kt @@ -56,7 +56,7 @@ import org.sopt.dateroad.presentation.ui.component.view.DateRoadLoadingView import org.sopt.dateroad.presentation.ui.component.view.DateRoadWebView import org.sopt.dateroad.presentation.ui.mypage.component.MyPageButton import org.sopt.dateroad.presentation.ui.mypage.component.MyPagePointBox -import org.sopt.dateroad.presentation.util.MyPage.ASK_URL +import org.sopt.dateroad.presentation.util.WebViewUrl.ASK_URL import org.sopt.dateroad.presentation.util.modifier.noRippleClickable import org.sopt.dateroad.presentation.util.view.LoadState import org.sopt.dateroad.ui.theme.DATEROADTheme diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/signin/SignInScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/signin/SignInScreen.kt index 1255d62b2..dfb3552f6 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/signin/SignInScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/signin/SignInScreen.kt @@ -28,7 +28,7 @@ import org.sopt.dateroad.domain.model.SignIn import org.sopt.dateroad.presentation.ui.component.button.DateRoadKakaoLoginButton import org.sopt.dateroad.presentation.ui.component.view.DateRoadLoadingView import org.sopt.dateroad.presentation.ui.component.view.DateRoadWebView -import org.sopt.dateroad.presentation.util.CourseDetail.PRIVACY_POLICY_URL +import org.sopt.dateroad.presentation.util.WebViewUrl.PRIVACY_POLICY_URL import org.sopt.dateroad.presentation.util.modifier.noRippleClickable import org.sopt.dateroad.presentation.util.view.LoadState import org.sopt.dateroad.ui.theme.DateRoadTheme diff --git a/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt b/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt index b377a7fea..7b11f426e 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/util/Constraints.kt @@ -22,12 +22,9 @@ object DatePicker { const val DATE_PATTERN = "yyyy.MM.dd" } -object CourseDetail { +object WebViewUrl { const val PRIVACY_POLICY_URL = "https://www.notion.so/hooooooni/04da4aa279ca4b599193784091a52859" const val REPORT_URL = "https://tally.so/r/w4L1a5" -} - -object MyPage { const val ASK_URL = "https://dateroad.notion.site/1055d2f7bfe94b3fa6c03709448def21?pvs=4" } From 7e34b95c3ba4b0c7fbde47c6fcf46ceb14232754 Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Tue, 27 Aug 2024 16:56:20 +0900 Subject: [PATCH 09/10] =?UTF-8?q?[chore]=20#188=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20title=20string=20resource=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/type/TwoButtonDialogWithDescriptionType.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt b/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt index 4165c6f05..0c135f678 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/type/TwoButtonDialogWithDescriptionType.kt @@ -34,7 +34,7 @@ enum class TwoButtonDialogWithDescriptionType( dismissButtonTextRes = R.string.dialog_cancel ), DELETE_COURSE( - titleRes = R.string.two_button_dialog_with_description_delete_timeline_title, + titleRes = R.string.two_button_dialog_with_description_delete_course_title, descriptionRes = R.string.two_button_dialog_with_description_delete_course_description, confirmButtonTextRes = R.string.dialog_delete, dismissButtonTextRes = R.string.dialog_cancel From adcc2ce9af6deea948d3936c37a804eaa0b396ed Mon Sep 17 00:00:00 2001 From: t1nm1ksun Date: Tue, 27 Aug 2024 19:31:19 +0900 Subject: [PATCH 10/10] [chore] #188 ktlint Format --- .../ui/coursedetail/CourseDetailScreen.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt index d96841f7b..abcd5ace2 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/CourseDetailScreen.kt @@ -206,21 +206,21 @@ fun CourseDetailScreen( ) } - when (isViewable) { - true -> { - courseDetailOpenedDetail( - description = description, - startAt = startAt, - places = places, - totalCost = totalCost, - tags = tags.mapNotNull { tag -> tag.getDateTagTypeByName() } - ) - if (!isCourseMine) { - item { - Spacer(modifier = Modifier.height(86.dp)) + when (isViewable) { + true -> { + courseDetailOpenedDetail( + description = description, + startAt = startAt, + places = places, + totalCost = totalCost, + tags = tags.mapNotNull { tag -> tag.getDateTagTypeByName() } + ) + if (!isCourseMine) { + item { + Spacer(modifier = Modifier.height(86.dp)) + } } } - } false -> { item {