From b5aa382aef39394af5c8b11fb573fa3b6bbff886 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Tue, 13 Aug 2024 23:52:57 +0900 Subject: [PATCH 01/21] [chore] #176 advertisement view --- .../ui/advertisement/AdvertisementContract.kt | 22 +++++++++++++ .../ui/advertisement/AdvertisementScreen.kt | 24 ++++++++++++++ .../advertisement/AdvertisementViewModel.kt | 33 +++++++++++++++++++ .../navigation/AdvertisementNavigation.kt | 12 +++++++ .../ui/coursedetail/CourseDetailContract.kt | 5 --- .../ui/coursedetail/CourseDetailViewModel.kt | 18 ---------- 6 files changed, 91 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt new file mode 100644 index 000000000..646a71b3e --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt @@ -0,0 +1,22 @@ +package org.sopt.dateroad.presentation.ui.advertisement + +import org.sopt.dateroad.domain.model.AdvertisementDetail +import org.sopt.dateroad.presentation.util.base.UiEvent +import org.sopt.dateroad.presentation.util.base.UiSideEffect +import org.sopt.dateroad.presentation.util.base.UiState +import org.sopt.dateroad.presentation.util.view.LoadState + +class AdvertisementContract { + data class AdvertisementUiState( + val loadState: LoadState = LoadState.Idle, + val advertisementDetail: AdvertisementDetail = AdvertisementDetail() + ) : UiState + + sealed interface AdvertisementSideEffect : UiSideEffect { + data object PopBackStack : AdvertisementSideEffect + } + + sealed class AdvertisementEvent : UiEvent { + data class FetchAdvertisementDetail(val loadState: LoadState, val advertisementDetail: AdvertisementDetail) : AdvertisementEvent() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt new file mode 100644 index 000000000..ffb13058a --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt @@ -0,0 +1,24 @@ +package org.sopt.dateroad.presentation.ui.advertisement + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.LocalLifecycleOwner +import androidx.lifecycle.compose.collectAsStateWithLifecycle + +@Composable +fun AdvertisementRoute( + viewmodel: AdvertisementViewModel = hiltViewModel(), + popBackStack: () -> Unit, + advertisementId: Int +) { + val uiState by viewmodel.uiState.collectAsStateWithLifecycle() + val lifecycleOwner = LocalLifecycleOwner.current +} + +@Composable +fun AdvertisementScreen( + +) { + +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt new file mode 100644 index 000000000..ac718250b --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt @@ -0,0 +1,33 @@ +package org.sopt.dateroad.presentation.ui.advertisement + +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import org.sopt.dateroad.domain.usecase.GetAdvertisementDetailUseCase +import org.sopt.dateroad.presentation.util.base.BaseViewModel +import org.sopt.dateroad.presentation.util.view.LoadState +import javax.inject.Inject + +@HiltViewModel +class AdvertisementViewModel @Inject constructor( + private val getAdvertisementDetailUseCase: GetAdvertisementDetailUseCase, +) : BaseViewModel() { + override fun createInitialState(): AdvertisementContract.AdvertisementUiState = AdvertisementContract.AdvertisementUiState() + + override suspend fun handleEvent(event: AdvertisementContract.AdvertisementEvent) { + when (event) { + is AdvertisementContract.AdvertisementEvent.FetchAdvertisementDetail -> setState { copy(loadState = event.loadState, advertisementDetail = event.advertisementDetail) } + } + } + + fun fetchAdvertisementDetail(advertisementId: Int) { + viewModelScope.launch { + setEvent(AdvertisementContract.AdvertisementEvent.FetchAdvertisementDetail(loadState = LoadState.Loading, advertisementDetail = currentState.advertisementDetail)) + getAdvertisementDetailUseCase(advertisementId = advertisementId).onSuccess { advertisementDetail -> + setEvent(AdvertisementContract.AdvertisementEvent.FetchAdvertisementDetail(loadState = LoadState.Success, advertisementDetail = advertisementDetail)) + }.onFailure { + setEvent(AdvertisementContract.AdvertisementEvent.FetchAdvertisementDetail(loadState = LoadState.Error, advertisementDetail = currentState.advertisementDetail)) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt new file mode 100644 index 000000000..2e44970cc --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt @@ -0,0 +1,12 @@ +package org.sopt.dateroad.presentation.ui.advertisement.navigation + +import androidx.navigation.NavController + +fun NavController.navigationAdvertisement(id: Int) { + this.navigate(route = AdvertisementRoute.) +} + +object AdvertisementRoute { + private const val ROUTE = "advertisement" + +} \ No newline at end of file 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..8c5572e74 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,8 +12,6 @@ import org.sopt.dateroad.presentation.util.view.LoadState class CourseDetailContract { data class CourseDetailUiState( val loadState: LoadState = LoadState.Idle, - val id: Int = 0, - val courseDetailType: CourseDetailType = CourseDetailType.COURSE, val isEditBottomSheetOpen: Boolean = false, val isRegionBottomSheetOpen: Boolean = false, val isPointReadDialogOpen: Boolean = false, @@ -21,7 +19,6 @@ class CourseDetailContract { val isFreeReadDialogOpen: Boolean = false, val isLikedButtonChecked: Boolean = false, val courseDetail: CourseDetail = CourseDetail(), - val advertisementDetail: AdvertisementDetail = AdvertisementDetail(), val currentImagePage: Int = 0, val deleteLoadState: LoadState = LoadState.Idle, val usePointLoadState: LoadState = LoadState.Idle @@ -43,8 +40,6 @@ class CourseDetailContract { data object OnEditBottomSheet : CourseDetailEvent() data object DismissEditBottomSheet : CourseDetailEvent() data object OpenCourse : CourseDetailEvent() - data class InitCourseDetail(val id: Int, val courseDetailType: CourseDetailType) : CourseDetailEvent() - data class FetchAdvertisementDetail(val loadState: LoadState, val advertisementDetail: AdvertisementDetail) : CourseDetailEvent() data class FetchCourseDetail(val loadState: LoadState, val courseDetail: CourseDetail) : CourseDetailEvent() data class PostUsePoint(val usePointLoadState: LoadState) : CourseDetailEvent() data class DeleteCourseLike(val courseDetail: CourseDetail) : CourseDetailEvent() 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..6ab142f2c 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 @@ -19,7 +19,6 @@ import org.sopt.dateroad.presentation.util.view.LoadState class CourseDetailViewModel @Inject constructor( private val deleteCourseUseCase: DeleteCourseUseCase, private val deleteCourseLikeUseCase: DeleteCourseLikeUseCase, - private val getAdvertisementDetailUseCase: GetAdvertisementDetailUseCase, private val getCourseDetailUseCase: GetCourseDetailUseCase, private val postCourseLikeUseCase: PostCourseLikeUseCase, private val postUsePointUseCase: PostUsePointUseCase @@ -48,23 +47,6 @@ class CourseDetailViewModel @Inject constructor( } } - fun fetchAdvertisementDetail(advertisementId: Int) { - viewModelScope.launch { - setEvent( - CourseDetailContract.CourseDetailEvent.FetchAdvertisementDetail(loadState = LoadState.Loading, advertisementDetail = currentState.advertisementDetail) - ) - getAdvertisementDetailUseCase(advertisementId = advertisementId).onSuccess { advertisementDetail -> - setEvent( - CourseDetailContract.CourseDetailEvent.FetchAdvertisementDetail(loadState = LoadState.Success, advertisementDetail = advertisementDetail) - ) - }.onFailure { - setEvent( - CourseDetailContract.CourseDetailEvent.FetchAdvertisementDetail(loadState = LoadState.Error, advertisementDetail = currentState.advertisementDetail) - ) - } - } - } - fun deleteCourseLike(courseId: Int) { viewModelScope.launch { setEvent(CourseDetailContract.CourseDetailEvent.DeleteCourseLike(courseDetail = currentState.courseDetail)) From 72b13201d399955f17c5f82a2f479ff97ea4d670 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Wed, 14 Aug 2024 01:38:07 +0900 Subject: [PATCH 02/21] =?UTF-8?q?[chore]=20#176=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=EC=95=84=EC=B9=B4=EC=9D=B4=EB=B9=99,=20=EC=BD=94?= =?UTF-8?q?=EC=8A=A4=20=EC=83=81=EC=84=B8=20=EB=B7=B0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/type/CourseDetailType.kt | 6 -- .../navigation/AdvertisementNavigation.kt | 33 ++++++- .../ui/coursedetail/CourseDetailContract.kt | 1 - .../ui/coursedetail/CourseDetailScreen.kt | 98 ++++++------------- .../ui/coursedetail/CourseDetailViewModel.kt | 2 - .../navigation/CourseDetailNavigation.kt | 24 ++--- .../presentation/ui/home/HomeContract.kt | 4 +- .../presentation/ui/home/HomeScreen.kt | 19 ++-- .../ui/home/navigation/HomeNavigation.kt | 5 +- .../presentation/ui/look/LookScreen.kt | 5 +- .../ui/look/navigation/LookNavigation.kt | 3 +- .../ui/navigator/MainNavigator.kt | 10 +- .../ui/navigator/component/MainNavHost.kt | 6 ++ .../presentation/ui/read/ReadScreen.kt | 5 +- .../ui/read/navigation/ReadNavigation.kt | 3 +- gradle/libs.versions.toml | 31 ++---- 16 files changed, 112 insertions(+), 143 deletions(-) delete mode 100644 app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailType.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailType.kt b/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailType.kt deleted file mode 100644 index 8e765400e..000000000 --- a/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailType.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.sopt.dateroad.presentation.type - -enum class CourseDetailType { - COURSE, - ADVERTISEMENT -} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt index 2e44970cc..038249748 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt @@ -1,12 +1,37 @@ package org.sopt.dateroad.presentation.ui.advertisement.navigation import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavType +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import org.sopt.dateroad.presentation.ui.advertisement.AdvertisementRoute -fun NavController.navigationAdvertisement(id: Int) { - this.navigate(route = AdvertisementRoute.) +fun NavController.navigationAdvertisement(advertisementId: Int) { + this.navigate(route = AdvertisementRoute.route(advertisementId = advertisementId)) } -object AdvertisementRoute { - private const val ROUTE = "advertisement" +fun NavGraphBuilder.advertisementGraph( + popBackStack: () -> Unit +) { + composable( + route = AdvertisementRoute.ROUTE_WITH_ARGUMENT, + arguments = listOf( + navArgument(AdvertisementRoute.ID) { + type = NavType.IntType + } + ) + ) { navBackStackEntry -> + AdvertisementRoute( + popBackStack = popBackStack, + advertisementId = navBackStackEntry.arguments?.getInt(AdvertisementRoute.ID) ?: 0 + ) + } +} +object AdvertisementRoute { + private const val ROUTE = "advertisement" + const val ID = "id" + const val ROUTE_WITH_ARGUMENT = "${ROUTE}/${ID}" + fun route(advertisementId: Int) = "${ROUTE}/$advertisementId" } \ No newline at end of file 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 8c5572e74..bf6c38687 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 @@ -2,7 +2,6 @@ package org.sopt.dateroad.presentation.ui.coursedetail import org.sopt.dateroad.domain.model.AdvertisementDetail import org.sopt.dateroad.domain.model.CourseDetail -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.util.base.UiEvent import org.sopt.dateroad.presentation.util.base.UiSideEffect 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..8987331e0 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 @@ -50,7 +50,6 @@ 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.DateTagType.Companion.getDateTagTypeByName import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.type.PlaceCardType @@ -81,16 +80,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 +95,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 +106,7 @@ fun CourseDetailRoute( LoadState.Success -> { CourseDetailScreen( + courseId = courseId, courseDetailUiState = uiState, onDialogPointLack = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnDialogPointLack) }, onDialogPointLackConfirm = { @@ -133,34 +119,38 @@ 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)) }, + enrollSchedule = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(EnrollType.TIMELINE, courseId)) }, onTopBarIconClicked = popBackStack, openCourseDetail = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OpenCourse) - viewModel.postUsePoint(uiState.id) + viewModel.postUsePoint(courseId = courseId) } ) } 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, @@ -211,15 +201,15 @@ fun CourseDetailScreen( item { Box(modifier = Modifier.fillMaxWidth()) { HorizontalPager( - count = if (courseDetailUiState.courseDetailType == CourseDetailType.COURSE) courseDetailUiState.courseDetail.images.size else courseDetailUiState.advertisementDetail.images.size, + count = courseDetailUiState.courseDetail.images.size, state = pagerState, modifier = Modifier .fillMaxWidth(), - userScrollEnabled = courseDetailUiState.courseDetailType == CourseDetailType.ADVERTISEMENT || courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine + userScrollEnabled = 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]) + .data(courseDetailUiState.courseDetail.images[page]) .crossfade(true) .build(), contentDescription = null, @@ -233,16 +223,14 @@ fun CourseDetailScreen( ) } - 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) - ) - } + 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), @@ -260,35 +248,24 @@ fun CourseDetailScreen( .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, + text = courseDetailUiState.courseDetail.date, 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, + text = courseDetailUiState.courseDetail.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( @@ -353,21 +330,10 @@ fun CourseDetailScreen( } } } - } - } - - 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) { + if (courseDetailUiState.courseDetail.isCourseMine || courseDetailUiState.courseDetail.isAccess) { item { Column( modifier = Modifier @@ -484,7 +450,7 @@ fun CourseDetailScreen( iconLeftResource = R.drawable.ic_top_bar_back_white, onIconClick = { onTopBarIconClicked() }, buttonContent = { - if (courseDetailUiState.courseDetail.isCourseMine && courseDetailUiState.courseDetailType == CourseDetailType.COURSE) { + if (courseDetailUiState.courseDetail.isCourseMine) { Icon( painterResource(id = R.drawable.btn_course_detail_more_white), contentDescription = null, @@ -588,7 +554,6 @@ fun CourseDetailScreen( fun CourseDetailScreenP() { val dummyCourseDetail = CourseDetailContract.CourseDetailUiState( loadState = LoadState.Success, - courseDetailType = CourseDetailType.COURSE, courseDetail = CourseDetail( courseId = 1, title = "Sample Course", @@ -621,6 +586,7 @@ fun CourseDetailScreenP() { ) CourseDetailScreen( + courseId = 1, courseDetailUiState = dummyCourseDetail, onDialogPointLack = {}, dismissDialogPointLack = {}, 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 6ab142f2c..b4df178a0 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 @@ -37,8 +37,6 @@ class CourseDetailViewModel @Inject constructor( is CourseDetailContract.CourseDetailEvent.OnEditBottomSheet -> setState { copy(isEditBottomSheetOpen = true) } is CourseDetailContract.CourseDetailEvent.DismissEditBottomSheet -> setState { copy(isEditBottomSheetOpen = false) } is CourseDetailContract.CourseDetailEvent.OpenCourse -> setState { copy(courseDetail = courseDetail.copy(isAccess = true)) } - is CourseDetailContract.CourseDetailEvent.InitCourseDetail -> setState { copy(id = event.id, courseDetailType = event.courseDetailType) } - is CourseDetailContract.CourseDetailEvent.FetchAdvertisementDetail -> setState { copy(loadState = event.loadState, advertisementDetail = event.advertisementDetail) } is CourseDetailContract.CourseDetailEvent.FetchCourseDetail -> setState { copy(loadState = event.loadState, courseDetail = event.courseDetail) } is CourseDetailContract.CourseDetailEvent.DeleteCourseLike -> setState { copy(courseDetail = event.courseDetail) } is CourseDetailContract.CourseDetailEvent.PostCourseLike -> setState { copy(courseDetail = event.courseDetail) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/navigation/CourseDetailNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/navigation/CourseDetailNavigation.kt index 5a4de418d..3cb1802d3 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/navigation/CourseDetailNavigation.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/navigation/CourseDetailNavigation.kt @@ -5,12 +5,11 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.navArgument -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.ui.coursedetail.CourseDetailRoute -fun NavController.navigationCourseDetail(courseDetailType: CourseDetailType, id: Int) { - this.navigate(route = CourseDetailRoute.route(courseDetailType = courseDetailType, id = id)) +fun NavController.navigationCourseDetail(courseId: Int) { + this.navigate(route = CourseDetailRoute.route(courseId = courseId)) } fun NavGraphBuilder.courseDetailGraph( @@ -20,33 +19,22 @@ fun NavGraphBuilder.courseDetailGraph( composable( route = CourseDetailRoute.ROUTE_WITH_ARGUMENT, arguments = listOf( - navArgument(CourseDetailRoute.COURSE_DETAIL_TYPE) { - type = NavType.StringType - }, navArgument(CourseDetailRoute.ID) { type = NavType.IntType } ) - ) { backStackEntry -> - val courseDetailType = backStackEntry.arguments?.getString(CourseDetailRoute.COURSE_DETAIL_TYPE)?.let { - CourseDetailType.valueOf(it) - } ?: CourseDetailType.COURSE - - val id = backStackEntry.arguments?.getInt(CourseDetailRoute.ID) ?: 0 - + ) { navBackStackEntry -> CourseDetailRoute( popBackStack = popBackStack, navigateToEnroll = navigateToEnroll, - courseDetailType = courseDetailType, - id = id + courseId = navBackStackEntry.arguments?.getInt(CourseDetailRoute.ID) ?: 0 ) } } object CourseDetailRoute { private const val ROUTE = "courseDetail" - const val COURSE_DETAIL_TYPE = "enrollType" const val ID = "id" - const val ROUTE_WITH_ARGUMENT = "$ROUTE/{$COURSE_DETAIL_TYPE}/{$ID}" - fun route(courseDetailType: CourseDetailType, id: Int) = "$ROUTE/${courseDetailType.name}/$id" + const val ROUTE_WITH_ARGUMENT = "$ROUTE/{$ID}" + fun route(courseId: Int) = "$ROUTE/$courseId" } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt index da2590706..3a447a632 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt @@ -4,7 +4,6 @@ import org.sopt.dateroad.domain.model.Advertisement import org.sopt.dateroad.domain.model.Course import org.sopt.dateroad.domain.model.MainDate import org.sopt.dateroad.domain.model.UserPoint -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.util.base.UiEvent import org.sopt.dateroad.presentation.util.base.UiSideEffect @@ -28,7 +27,8 @@ class HomeContract { data object NavigateToLook : HomeSideEffect data object NavigateToTimeline : HomeSideEffect data class NavigateToEnroll(val enrollType: EnrollType, val id: Int?) : HomeSideEffect - data class NavigateToCourseDetail(val courseDetailType: CourseDetailType, val id: Int) : HomeSideEffect + data class NavigateToAdvertisementDetail(val advertisementId: Int): HomeSideEffect + data class NavigateToCourseDetail(val courseId: Int) : HomeSideEffect } sealed class HomeEvent : UiEvent { diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt index 15fb52d97..c4b7d23bd 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt @@ -39,7 +39,6 @@ import kotlinx.coroutines.launch import org.sopt.dateroad.R import org.sopt.dateroad.domain.model.MainDate import org.sopt.dateroad.domain.type.SortByType -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.type.TagType import org.sopt.dateroad.presentation.ui.component.button.DateRoadImageButton @@ -66,7 +65,8 @@ fun HomeRoute( navigateToLook: () -> Unit, navigateToTimeline: () -> Unit, navigateToEnroll: (EnrollType, Int?) -> Unit, - navigateToCourseDetail: (CourseDetailType, Int) -> Unit + navigateToAdvertisementDetail: (Int) -> Unit, + navigateToCourseDetail: (Int) -> Unit ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() val lifecycleOwner = LocalLifecycleOwner.current @@ -99,7 +99,8 @@ fun HomeRoute( is HomeContract.HomeSideEffect.NavigateToLook -> navigateToLook() is HomeContract.HomeSideEffect.NavigateToTimeline -> navigateToTimeline() is HomeContract.HomeSideEffect.NavigateToEnroll -> navigateToEnroll(homeSideEffect.enrollType, homeSideEffect.id) - is HomeContract.HomeSideEffect.NavigateToCourseDetail -> navigateToCourseDetail(homeSideEffect.courseDetailType, homeSideEffect.id) + is HomeContract.HomeSideEffect.NavigateToAdvertisementDetail -> navigateToAdvertisementDetail(homeSideEffect.advertisementId) + is HomeContract.HomeSideEffect.NavigateToCourseDetail -> navigateToCourseDetail(homeSideEffect.courseId) } } } @@ -119,7 +120,8 @@ fun HomeRoute( navigateToLook = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToLook) }, navigateToTimeline = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToTimeline) }, onFabClick = { viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToEnroll(EnrollType.COURSE, null)) }, - navigateToCourseDetail = { courseDetailType: CourseDetailType, id: Int -> viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToCourseDetail(courseDetailType, id)) } + navigateToAdvertisementDetail = { advertisementId: Int -> viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToAdvertisementDetail(advertisementId = advertisementId)) }, + navigateToCourseDetail = { courseId: Int -> viewModel.setSideEffect(HomeContract.HomeSideEffect.NavigateToCourseDetail(courseId = courseId)) } ) } @@ -137,7 +139,8 @@ fun HomeScreen( navigateToPointHistory: () -> Unit, navigateToLook: () -> Unit, navigateToTimeline: () -> Unit, - navigateToCourseDetail: (CourseDetailType, Int) -> Unit, + navigateToAdvertisementDetail: (Int) -> Unit, + navigateToCourseDetail: (Int) -> Unit, onFabClick: () -> Unit ) { Column( @@ -215,7 +218,7 @@ fun HomeScreen( items(uiState.topLikedCourses) { topLikedCourses -> HomeHotCourseCard( course = topLikedCourses, - onClick = { navigateToCourseDetail(CourseDetailType.COURSE, topLikedCourses.courseId) } + onClick = { navigateToCourseDetail(topLikedCourses.courseId) } ) } } @@ -234,7 +237,7 @@ fun HomeScreen( ) { page -> HomeAdvertisement( advertisement = uiState.advertisements[page], - onClick = { navigateToCourseDetail(CourseDetailType.ADVERTISEMENT, uiState.advertisements[page].advertisementId) } + onClick = { navigateToAdvertisementDetail(uiState.advertisements[page].advertisementId) } ) } DateRoadTextTag( @@ -282,7 +285,7 @@ fun HomeScreen( uiState.latestCourses.forEach { latestCourses -> DateRoadCourseCard( course = latestCourses, - onClick = { navigateToCourseDetail(CourseDetailType.COURSE, latestCourses.courseId) } + onClick = { navigateToCourseDetail(latestCourses.courseId) } ) } } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/navigation/HomeNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/navigation/HomeNavigation.kt index ed652cb3b..3fb05b420 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/navigation/HomeNavigation.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/navigation/HomeNavigation.kt @@ -6,7 +6,6 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import org.sopt.dateroad.presentation.model.MainNavigationBarRoute -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.ui.home.HomeRoute @@ -23,7 +22,8 @@ fun NavGraphBuilder.homeNavGraph( navigateToLook: () -> Unit, navigateToTimeline: () -> Unit, navigateToEnroll: (EnrollType, Int?) -> Unit, - navigateToCourseDetail: (CourseDetailType, Int) -> Unit + navigateToAdvertisement: (Int) -> Unit, + navigateToCourseDetail: (Int) -> Unit ) { composable(route = MainNavigationBarRoute.Home::class.simpleName.orEmpty()) { HomeRoute( @@ -32,6 +32,7 @@ fun NavGraphBuilder.homeNavGraph( navigateToLook = navigateToLook, navigateToTimeline = navigateToTimeline, navigateToEnroll = navigateToEnroll, + navigateToAdvertisementDetail = navigateToAdvertisement, navigateToCourseDetail = navigateToCourseDetail ) } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/look/LookScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/look/LookScreen.kt index f943417ef..ef749504b 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/look/LookScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/look/LookScreen.kt @@ -36,7 +36,6 @@ import org.sopt.dateroad.domain.type.MoneyTagType import org.sopt.dateroad.domain.type.RegionType import org.sopt.dateroad.domain.type.SeoulAreaType import org.sopt.dateroad.presentation.type.ChipType -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EmptyViewType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.ui.component.bottomsheet.DateRoadRegionBottomSheet @@ -59,7 +58,7 @@ fun LookRoute( padding: PaddingValues, viewModel: LookViewModel = hiltViewModel(), navigateToEnroll: (EnrollType, Int?) -> Unit, - navigateToCourseDetail: (CourseDetailType, Int) -> Unit + navigateToCourseDetail: (Int) -> Unit ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() val lifecycleOwner = LocalLifecycleOwner.current @@ -81,7 +80,7 @@ fun LookRoute( viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { lookSideEffect -> when (lookSideEffect) { - is LookContract.LookSideEffect.NavigateToCourseDetail -> navigateToCourseDetail(CourseDetailType.COURSE, lookSideEffect.courseId) + is LookContract.LookSideEffect.NavigateToCourseDetail -> navigateToCourseDetail(lookSideEffect.courseId) is LookContract.LookSideEffect.NavigateToEnroll -> navigateToEnroll(EnrollType.COURSE, null) } } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/look/navigation/LookNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/look/navigation/LookNavigation.kt index 2da838c63..abd968a27 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/look/navigation/LookNavigation.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/look/navigation/LookNavigation.kt @@ -6,7 +6,6 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import org.sopt.dateroad.presentation.model.MainNavigationBarRoute -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.ui.look.LookRoute @@ -20,7 +19,7 @@ fun NavController.navigationLook(navOptions: NavOptions) { fun NavGraphBuilder.lookNavGraph( padding: PaddingValues, navigateToEnroll: (EnrollType, Int?) -> Unit, - navigateToCourseDetail: (CourseDetailType, Int) -> Unit + navigateToCourseDetail: (Int) -> Unit ) { composable(route = MainNavigationBarRoute.Look::class.simpleName.orEmpty()) { LookRoute(padding = padding, navigateToEnroll = navigateToEnroll, navigateToCourseDetail = navigateToCourseDetail) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt index 97a24910d..b59810fae 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt @@ -11,11 +11,11 @@ import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import org.sopt.dateroad.presentation.model.MainNavigationBarRoute import org.sopt.dateroad.presentation.model.Route -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.DateType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.type.MainNavigationBarItemType import org.sopt.dateroad.presentation.type.MyCourseType +import org.sopt.dateroad.presentation.ui.advertisement.navigation.navigationAdvertisement import org.sopt.dateroad.presentation.ui.coursedetail.navigation.navigationCourseDetail import org.sopt.dateroad.presentation.ui.enroll.navigation.navigationEnroll import org.sopt.dateroad.presentation.ui.home.navigation.navigationHome @@ -65,8 +65,12 @@ class MainNavigator( } } - fun navigateToCourseDetail(courseDetailType: CourseDetailType, id: Int) { - navHostController.navigationCourseDetail(courseDetailType = courseDetailType, id = id) + fun navigateToAdvertisement(advertisementId: Int) { + navHostController.navigationAdvertisement(advertisementId = advertisementId) + } + + fun navigateToCourseDetail(courseId: Int) { + navHostController.navigationCourseDetail(courseId = courseId) } fun navigateToEnroll(enrollType: EnrollType, courseId: Int?) { diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt index 7e078ef0a..f725d0be3 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.compose.NavHost import org.sopt.dateroad.presentation.type.ProfileType +import org.sopt.dateroad.presentation.ui.advertisement.navigation.advertisementGraph import org.sopt.dateroad.presentation.ui.coursedetail.navigation.courseDetailGraph import org.sopt.dateroad.presentation.ui.enroll.navigation.enrollNavGraph import org.sopt.dateroad.presentation.ui.home.navigation.homeNavGraph @@ -42,6 +43,10 @@ fun MainNavHost( navController = navigator.navHostController, startDestination = navigator.startDestination ) { + advertisementGraph( + popBackStack = navigator:: popBackStackIfNotHome + ) + courseDetailGraph( popBackStack = navigator::popBackStackIfNotHome, navigateToEnroll = navigator::navigateToEnroll @@ -59,6 +64,7 @@ fun MainNavHost( navigateToLook = navigator::navigateToLook, navigateToTimeline = navigator::navigateTimeline, navigateToEnroll = navigator::navigateToEnroll, + navigateToAdvertisement = navigator::navigateToAdvertisement, navigateToCourseDetail = navigator::navigateToCourseDetail ) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/read/ReadScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/read/ReadScreen.kt index 17ee449e4..f9d25f66c 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/read/ReadScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/read/ReadScreen.kt @@ -28,7 +28,6 @@ import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.flowWithLifecycle import org.sopt.dateroad.R -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EmptyViewType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.ui.component.card.DateRoadCourseCard @@ -47,7 +46,7 @@ fun ReadRoute( padding: PaddingValues, viewModel: ReadViewModel = hiltViewModel(), navigateToEnroll: (EnrollType, Int?) -> Unit, - navigateToCourseDetail: (CourseDetailType, Int) -> Unit + navigateToCourseDetail: (Int) -> Unit ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() val lifecycleOwner = LocalLifecycleOwner.current @@ -61,7 +60,7 @@ fun ReadRoute( viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle).collect { readSideEffect -> when (readSideEffect) { is ReadContract.ReadSideEffect.NavigateToEnroll -> navigateToEnroll(EnrollType.TIMELINE, null) - is ReadContract.ReadSideEffect.NavigateToCourseDetail -> navigateToCourseDetail(CourseDetailType.COURSE, readSideEffect.courseId) + is ReadContract.ReadSideEffect.NavigateToCourseDetail -> navigateToCourseDetail(readSideEffect.courseId) } } } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/read/navigation/ReadNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/read/navigation/ReadNavigation.kt index 51ab86875..b14810af5 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/read/navigation/ReadNavigation.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/read/navigation/ReadNavigation.kt @@ -6,7 +6,6 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import org.sopt.dateroad.presentation.model.MainNavigationBarRoute -import org.sopt.dateroad.presentation.type.CourseDetailType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.ui.read.ReadRoute @@ -20,7 +19,7 @@ fun NavController.navigationRead(navOptions: NavOptions) { fun NavGraphBuilder.readNavGraph( padding: PaddingValues, navigateToEnroll: (EnrollType, Int?) -> Unit, - navigateToCourseDetail: (CourseDetailType, Int) -> Unit + navigateToCourseDetail: (Int) -> Unit ) { composable(route = MainNavigationBarRoute.Read::class.simpleName.orEmpty()) { ReadRoute( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4710f8ed0..46c2982e5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,28 +8,28 @@ jvmTarget = "1.8" kotlinCompilerExtensionVersion = "1.5.13" # Kotlin -agp = "8.5.0" +agp = "8.5.2" kotlin = "1.9.23" # Test junit = "4.13.2" -junitVersion = "1.2.0" -espressoCore = "3.6.0" +junitVersion = "1.2.1" +espressoCore = "3.6.1" # AndroidX coreSplashscreen = "1.0.1" coreKtx = "1.13.1" -lifecycleRuntimeKtx = "2.8.2" -activityCompose = "1.9.0" +lifecycleRuntimeKtx = "2.8.4" +activityCompose = "1.9.1" composeBom = "2024.06.00" navigation = "2.7.7" security = "1.1.0-alpha06" -pagingCommonAndroid = "3.3.0" +pagingCommonAndroid = "3.3.2" # Google googleServices = "4.4.2" firebaseCrashlytics = "3.0.2" -firebaseBom = "33.1.1" +firebaseBom = "33.1.2" # Accompanist accompanistPager = "0.25.0" @@ -39,7 +39,7 @@ accompanistWebview = "0.24.13-rc" okhttp = "4.11.0" retrofit = "2.9.0" retrofitKotlinSerializationConverter = "1.0.0" -kotlinxSerializationJson = "1.5.1" +kotlinxSerializationJson = "1.6.3" daggerHilt = "2.51" hiltNavigationCompose = "1.2.0" ktlint = "11.5.1" @@ -47,19 +47,8 @@ coil = "2.6.0" timber = "5.0.1" sentry = "4.1.1" kakao = "2.20.3" -lifecycleRuntimeComposeAndroid = "2.8.2" - -#Kakao -v2All = "2.20.3" -v2Cert = "2.20.3" -v2Friend = "2.20.3" -v2LinkRx = "2.4.2" -v2Navi = "2.20.3" -v2Share = "2.20.3" -v2ShareVersion = "2.20.3" -v2Talk = "2.20.3" -v2User = "2.20.3" -media3Common = "1.3.1" +lifecycleRuntimeComposeAndroid = "2.8.4" +media3Common = "1.4.0" [libraries] # Test From befe40d6fc9c8edd714d404d975ea6a2c933a616 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sat, 17 Aug 2024 22:29:51 +0900 Subject: [PATCH 03/21] =?UTF-8?q?[chore]=20#176=20conflict=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dateroad/presentation/ui/navigator/MainNavigator.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt index b59810fae..274e6a1c3 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/MainNavigator.kt @@ -11,10 +11,10 @@ import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import org.sopt.dateroad.presentation.model.MainNavigationBarRoute import org.sopt.dateroad.presentation.model.Route -import org.sopt.dateroad.presentation.type.DateType import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.type.MainNavigationBarItemType import org.sopt.dateroad.presentation.type.MyCourseType +import org.sopt.dateroad.presentation.type.TimelineType import org.sopt.dateroad.presentation.ui.advertisement.navigation.navigationAdvertisement import org.sopt.dateroad.presentation.ui.coursedetail.navigation.navigationCourseDetail import org.sopt.dateroad.presentation.ui.enroll.navigation.navigationEnroll @@ -149,8 +149,8 @@ class MainNavigator( ) } - fun navigateToTimelineDetail(dateType: DateType, dateId: Int) { - navHostController.navigateToTimelineDetail(dateType, dateId) + fun navigateToTimelineDetail(timelineType: TimelineType, dateId: Int) { + navHostController.navigateToTimelineDetail(timelineType, dateId) } private fun popBackStack() { From 04dab6ced31e0d944a3598f2695ed71021b96ad6 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sat, 17 Aug 2024 23:02:52 +0900 Subject: [PATCH 04/21] =?UTF-8?q?[chore]=20#176=20HomeTopBar=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt | 2 +- .../DateRoadHomeTopBar.kt => home/component/HomeTopBar.kt} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename app/src/main/java/org/sopt/dateroad/presentation/ui/{component/topbar/DateRoadHomeTopBar.kt => home/component/HomeTopBar.kt} (96%) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt index dbf0ab050..3708b5417 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt @@ -46,7 +46,7 @@ import org.sopt.dateroad.presentation.ui.component.button.DateRoadTextButton import org.sopt.dateroad.presentation.ui.component.card.DateRoadCourseCard import org.sopt.dateroad.presentation.ui.component.partialcolortext.PartialColorText import org.sopt.dateroad.presentation.ui.component.tag.DateRoadTextTag -import org.sopt.dateroad.presentation.ui.component.topbar.DateRoadHomeTopBar +import org.sopt.dateroad.presentation.ui.home.component.DateRoadHomeTopBar 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 diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadHomeTopBar.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/component/HomeTopBar.kt similarity index 96% rename from app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadHomeTopBar.kt rename to app/src/main/java/org/sopt/dateroad/presentation/ui/home/component/HomeTopBar.kt index b7eb8b66c..8474d9541 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadHomeTopBar.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/component/HomeTopBar.kt @@ -1,4 +1,4 @@ -package org.sopt.dateroad.presentation.ui.component.topbar +package org.sopt.dateroad.presentation.ui.home.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column From d07040acbe9d6155e672f2ff76412b6df36b5176 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sat, 17 Aug 2024 23:38:19 +0900 Subject: [PATCH 05/21] [feat] #176 DateRoadScrollResponsiveTopBar --- .../topbar/DateRoadScrollResponsiveTopBar.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt new file mode 100644 index 000000000..54383b12f --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt @@ -0,0 +1,41 @@ +package org.sopt.dateroad.presentation.ui.component.topbar + +import androidx.annotation.DrawableRes +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import org.sopt.dateroad.R +import org.sopt.dateroad.presentation.util.modifier.noRippleClickable +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@Composable +fun DateRoadScrollResponsiveTopBar( + isDefault: Boolean, + defaultBackgroundColor: Color = Color.Transparent, + scrolledBackgroundColor: Color = DateRoadTheme.colors.white, + defaultIconTintColor: Color = DateRoadTheme.colors.white, + scrolledIconTintColor: Color = DateRoadTheme.colors.black, + @DrawableRes leftIconResource: Int = R.drawable.ic_top_bar_back_white, + onLeftIconClick: () -> Unit = {}, + @DrawableRes rightIconResource: Int? = null, + onRightIconClick: () -> Unit = {} +) { + DateRoadBasicTopBar( + backGroundColor = if (isDefault) defaultBackgroundColor else scrolledBackgroundColor, + leftIconResource = leftIconResource, + onLeftIconClick = onLeftIconClick, + leftIconTint = if (isDefault) defaultIconTintColor else scrolledIconTintColor, + buttonContent = { + if (rightIconResource != null) { + Icon( + painter = painterResource(id = rightIconResource), + contentDescription = null, + tint = if (isDefault) defaultIconTintColor else scrolledIconTintColor, + modifier = Modifier.noRippleClickable(onRightIconClick) + ) + } + } + ) +} \ No newline at end of file From 6ae5a423f05c4ab6a956d0541b82bed3e86aadc1 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sat, 17 Aug 2024 23:39:08 +0900 Subject: [PATCH 06/21] [chore] #176 DateRoadBasicTopBar Parameter naming --- .../component/topbar/DateRoadBasicTopBar.kt | 22 +++++++++---------- .../presentation/ui/enroll/EnrollScreen.kt | 8 +++---- .../ui/mycourse/MyCourseScreen.kt | 4 ++-- .../presentation/ui/past/PastScreen.kt | 4 ++-- .../ui/pointguide/PointGuideScreen.kt | 4 ++-- .../ui/pointhistory/PointHistoryScreen.kt | 4 ++-- .../ui/timelinedetail/TimelineDetailScreen.kt | 4 ++-- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadBasicTopBar.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadBasicTopBar.kt index 19e7b1dd1..c81f763f9 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadBasicTopBar.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadBasicTopBar.kt @@ -30,12 +30,12 @@ import org.sopt.dateroad.ui.theme.DateRoadTheme @Composable fun DateRoadBasicTopBar( - title: String, + title: String = "", backGroundColor: Color = Color.Transparent, - onIconClick: () -> Unit = {}, - @DrawableRes iconLeftResource: Int? = null, + onLeftIconClick: () -> Unit = {}, + @DrawableRes leftIconResource: Int? = null, buttonContent: (@Composable () -> Unit)? = null, - leftTint: Color = DateRoadTheme.colors.black + leftIconTint: Color = DateRoadTheme.colors.black ) { var iconWidth by remember { mutableStateOf(0) } var contentWidth by remember { mutableStateOf(0) } @@ -50,19 +50,19 @@ fun DateRoadBasicTopBar( .background(backGroundColor) .padding(vertical = 11.dp) ) { - if (iconLeftResource != null) { + if (leftIconResource != null) { Column( Modifier .align(Alignment.CenterStart) .onGloballyPositioned { coordinates -> iconWidth = coordinates.size.width } - .noRippleClickable(onClick = onIconClick) + .noRippleClickable(onClick = onLeftIconClick) ) { Icon( - painter = painterResource(id = iconLeftResource), + painter = painterResource(id = leftIconResource), contentDescription = null, - tint = leftTint, + tint = leftIconTint, modifier = Modifier .padding(16.dp) ) @@ -101,7 +101,7 @@ fun DateRoadBasicTopBarPreview() { Column { DateRoadBasicTopBar( title = "포인트 내역포인트 내역포인트내역내역포인트포인트내역포인트 내역", - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, backGroundColor = DateRoadTheme.colors.white ) DateRoadBasicTopBar( @@ -110,7 +110,7 @@ fun DateRoadBasicTopBarPreview() { ) DateRoadBasicTopBar( title = "데이트 일정", - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, buttonContent = { Icon( painterResource(id = R.drawable.ic_top_bar_share), @@ -121,7 +121,7 @@ fun DateRoadBasicTopBarPreview() { ) DateRoadBasicTopBar( title = "데이트 일정데이트 일정데이트 일정데이트 일정일정데이트 일정데이트 일정", - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, buttonContent = { DateRoadFilledButton( isEnabled = true, diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollScreen.kt index 23cfd3c0a..6ed471660 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/enroll/EnrollScreen.kt @@ -254,9 +254,9 @@ fun EnrollScreen( EnrollType.COURSE -> { DateRoadBasicTopBar( title = stringResource(id = R.string.top_bar_title_enroll_course), - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, backGroundColor = DateRoadTheme.colors.white, - onIconClick = onTopBarBackButtonClick + onLeftIconClick = onTopBarBackButtonClick ) Spacer(modifier = Modifier.height(8.dp)) EnrollPhotos( @@ -270,8 +270,8 @@ fun EnrollScreen( EnrollType.TIMELINE -> { DateRoadBasicTopBar( title = stringResource(id = R.string.top_bar_title_enroll_timeline), - iconLeftResource = R.drawable.ic_top_bar_back_white, - onIconClick = onTopBarBackButtonClick, + leftIconResource = R.drawable.ic_top_bar_back_white, + onLeftIconClick = onTopBarBackButtonClick, buttonContent = { DateRoadFilledButton( isEnabled = true, diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/mycourse/MyCourseScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/mycourse/MyCourseScreen.kt index ce9f6b1f3..3ba32d965 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/mycourse/MyCourseScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/mycourse/MyCourseScreen.kt @@ -98,9 +98,9 @@ fun MyCourseScreen( ) { DateRoadBasicTopBar( title = stringResource(id = myCourseUiState.myCourseType.topBarTitleRes), - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, backGroundColor = DateRoadTheme.colors.white, - onIconClick = onIconClick + onLeftIconClick = onIconClick ) LazyColumn { if (myCourseUiState.courses.isEmpty()) { diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/past/PastScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/past/PastScreen.kt index b91069b6f..2966406ae 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/past/PastScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/past/PastScreen.kt @@ -88,9 +88,9 @@ fun PastScreen( ) { DateRoadBasicTopBar( title = stringResource(id = R.string.top_bar_title_past), - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, backGroundColor = DateRoadTheme.colors.white, - onIconClick = popBackStack + onLeftIconClick = popBackStack ) if (pastUiState.timelines.isEmpty()) { DateRoadEmptyView(emptyViewType = EmptyViewType.PAST) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/pointguide/PointGuideScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/pointguide/PointGuideScreen.kt index 252e1f49a..a2955e179 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/pointguide/PointGuideScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/pointguide/PointGuideScreen.kt @@ -46,9 +46,9 @@ fun PointGuideScreen( ) { DateRoadBasicTopBar( title = stringResource(id = R.string.point_guide_top_bar), - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, backGroundColor = DateRoadTheme.colors.white, - onIconClick = onIconClick + onLeftIconClick = onIconClick ) Column( modifier = Modifier diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/pointhistory/PointHistoryScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/pointhistory/PointHistoryScreen.kt index fdd78d02e..ca89cc52e 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/pointhistory/PointHistoryScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/pointhistory/PointHistoryScreen.kt @@ -100,9 +100,9 @@ fun PointHistoryScreen( ) { DateRoadBasicTopBar( title = stringResource(id = R.string.top_bar_title_point_history), - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, backGroundColor = DateRoadTheme.colors.white, - onIconClick = onTopBarIconClicked + onLeftIconClick = onTopBarIconClicked ) Spacer(modifier = Modifier.height(22.dp)) PointHistoryPointBox( diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/timelinedetail/TimelineDetailScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/timelinedetail/TimelineDetailScreen.kt index 48ab6b3cd..3110bd762 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/timelinedetail/TimelineDetailScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/timelinedetail/TimelineDetailScreen.kt @@ -134,7 +134,7 @@ fun TimelineDetailScreen( ) { DateRoadBasicTopBar( title = stringResource(id = R.string.top_bar_title_timeline), - iconLeftResource = R.drawable.ic_top_bar_back_white, + leftIconResource = R.drawable.ic_top_bar_back_white, buttonContent = { Icon( painterResource(id = R.drawable.btn_course_detail_more_black), @@ -142,7 +142,7 @@ fun TimelineDetailScreen( modifier = Modifier.noRippleClickable(onClick = onButtonClick) ) }, - onIconClick = onTopBarItemClick + onLeftIconClick = onTopBarItemClick ) Box( modifier = Modifier From 29b841dc1d7bb6ce76f50ef2c29453749061a58a Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 00:19:12 +0900 Subject: [PATCH 07/21] [feat] #176 DateRoadScrollResponsiveTopBar Gradient --- .../topbar/DateRoadScrollResponsiveTopBar.kt | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt index 54383b12f..7d3a9730e 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt @@ -1,9 +1,13 @@ package org.sopt.dateroad.presentation.ui.component.topbar import androidx.annotation.DrawableRes +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import org.sopt.dateroad.R @@ -22,20 +26,36 @@ fun DateRoadScrollResponsiveTopBar( @DrawableRes rightIconResource: Int? = null, onRightIconClick: () -> Unit = {} ) { - DateRoadBasicTopBar( - backGroundColor = if (isDefault) defaultBackgroundColor else scrolledBackgroundColor, - leftIconResource = leftIconResource, - onLeftIconClick = onLeftIconClick, - leftIconTint = if (isDefault) defaultIconTintColor else scrolledIconTintColor, - buttonContent = { - if (rightIconResource != null) { - Icon( - painter = painterResource(id = rightIconResource), - contentDescription = null, - tint = if (isDefault) defaultIconTintColor else scrolledIconTintColor, - modifier = Modifier.noRippleClickable(onRightIconClick) + Box { + Box( + modifier = Modifier + .fillMaxWidth() + .background( + brush = Brush.verticalGradient( + colors = listOf( + DateRoadTheme.colors.black.copy(alpha = 0.6f), + Color.Transparent + ) + ) ) + .matchParentSize() + ) + + DateRoadBasicTopBar( + backGroundColor = if (isDefault) defaultBackgroundColor else scrolledBackgroundColor, + leftIconResource = leftIconResource, + onLeftIconClick = onLeftIconClick, + leftIconTint = if (isDefault) defaultIconTintColor else scrolledIconTintColor, + buttonContent = { + if (rightIconResource != null) { + Icon( + painter = painterResource(id = rightIconResource), + contentDescription = null, + tint = if (isDefault) defaultIconTintColor else scrolledIconTintColor, + modifier = Modifier.noRippleClickable(onRightIconClick) + ) + } } - } - ) + ) + } } \ No newline at end of file From 9993671d307fb6a667597b614ce0c68763dd485c Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 00:19:24 +0900 Subject: [PATCH 08/21] [feat] #176 DateRoadImagePager --- .../ui/component/pager/DateRoadImagePager.kt | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt new file mode 100644 index 000000000..91010fcd0 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt @@ -0,0 +1,76 @@ +package org.sopt.dateroad.presentation.ui.component.pager + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +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.PagerState +import org.sopt.dateroad.R +import org.sopt.dateroad.presentation.type.TagType +import org.sopt.dateroad.presentation.ui.component.tag.DateRoadImageTag +import org.sopt.dateroad.presentation.ui.component.tag.DateRoadTextTag +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@OptIn(ExperimentalPagerApi::class) +@Composable +fun DateRoadImagePager( + modifier: Modifier = Modifier, + pagerState: PagerState = PagerState(), + images: List, + userScrollEnabled: Boolean, + like: String?, +) { + Box(modifier = Modifier.fillMaxWidth()) { + HorizontalPager( + count = images.size, + state = pagerState, + modifier = Modifier.fillMaxWidth(), + userScrollEnabled = userScrollEnabled + ) { page -> + AsyncImage( + model = ImageRequest.Builder(context = LocalContext.current) + .data(images[page]) + .crossfade(true) + .build(), + contentDescription = null, + modifier = modifier + .fillMaxWidth() + .aspectRatio(1f), + contentScale = ContentScale.Crop + ) + } + + if (like != null) { + DateRoadImageTag( + textContent = like, + 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(end = 10.dp, bottom = 10.dp) + .align(Alignment.BottomEnd) + ) + } +} \ No newline at end of file From 8263ae382bbbbc8c197d1f66df8a449b39c94b49 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 00:40:43 +0900 Subject: [PATCH 09/21] [feat] #176 CourseDetailBasicInfo --- .../component/CourseDetailBasicInfo.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt new file mode 100644 index 000000000..5cd04772c --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt @@ -0,0 +1,40 @@ +package org.sopt.dateroad.presentation.ui.coursedetail.component + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@Composable +fun CourseDetailBasicInfo( + date: String, + title: String, + totalTime: String, + totalCost: String, + city: String +) { + Column { + Spacer(modifier = Modifier.height(18.dp)) + Text( + text = date, + style = DateRoadTheme.typography.bodySemi15, + color = DateRoadTheme.colors.gray400 + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = title, + style = DateRoadTheme.typography.titleExtra24, + color = DateRoadTheme.colors.black + ) + Spacer(modifier = Modifier.height(16.dp)) + CourseDetailInfoBar( + totalTime = totalTime, + totalCost = totalCost, + city = city + ) + } +} \ No newline at end of file From 8761a5e5880adbe3347e45062fb9aae4fc6febb5 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 02:22:16 +0900 Subject: [PATCH 10/21] [feat] #176 courseDetailTimeline --- .../component/CourseDetailTimeline.kt | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt 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 new file mode 100644 index 000000000..0f9fadc0c --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTimeline.kt @@ -0,0 +1,40 @@ +package org.sopt.dateroad.presentation.ui.coursedetail.component + +import androidx.compose.foundation.layout.Spacer +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.unit.dp +import org.sopt.dateroad.R +import org.sopt.dateroad.domain.model.Place +import org.sopt.dateroad.presentation.type.PlaceCardType +import org.sopt.dateroad.presentation.ui.component.card.DateRoadPlaceCard +import org.sopt.dateroad.ui.theme.DateRoadTheme + +fun LazyListScope.courseDetailTimeline( + places: List +) { + item { + Spacer(modifier = Modifier.height(30.dp)) + Text( + text = stringResource(id = R.string.course_detail_timeline_title), + style = DateRoadTheme.typography.titleBold18, + color = DateRoadTheme.colors.black, + modifier = Modifier.padding(horizontal = 16.dp) + ) + Spacer(modifier = Modifier.height(12.dp)) + } + items(places.size) { index -> + DateRoadPlaceCard( + modifier = Modifier.padding(horizontal = 16.dp), + placeCardType = PlaceCardType.COURSE_NORMAL, + sequence = index, + place = places[index] + ) + Spacer(modifier = Modifier.height(16.dp)) + } +} \ No newline at end of file From 1bd770af8dc75ec075c422b433e69e289f470619 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 02:39:16 +0900 Subject: [PATCH 11/21] [feat] #176 CourseDetailTag --- .../coursedetail/component/CourseDetailTag.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt new file mode 100644 index 000000000..8d2b737dd --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt @@ -0,0 +1,50 @@ +package org.sopt.dateroad.presentation.ui.coursedetail.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +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.unit.dp +import org.sopt.dateroad.R +import org.sopt.dateroad.presentation.type.ChipType +import org.sopt.dateroad.presentation.type.DateTagType +import org.sopt.dateroad.presentation.ui.component.chip.DateRoadImageChip +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@Composable +fun CourseDetailTag( + tags: List +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.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)) + LazyRow(horizontalArrangement = Arrangement.spacedBy(7.dp)) { + items(tags) { tag -> + DateRoadImageChip( + textId = tag.titleRes, + imageRes = tag.imageRes, + chipType = ChipType.DATE, + isSelected = false + ) + } + } + Spacer(modifier = Modifier.height(30.dp)) + } +} \ No newline at end of file From 5df785c93a513bb7d16dbd10494030b5c81c688f Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 02:43:39 +0900 Subject: [PATCH 12/21] [feat] #176 CourseDetailCost --- .../component/CourseDetailCost.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt new file mode 100644 index 000000000..159c39718 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt @@ -0,0 +1,41 @@ +package org.sopt.dateroad.presentation.ui.coursedetail.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.sopt.dateroad.R +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@Composable +fun CourseDetailCost( + totalCost: String +) { + Spacer(modifier = Modifier.height(14.dp)) + Text( + modifier = Modifier.padding(horizontal = 16.dp), + 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 = totalCost, + style = DateRoadTheme.typography.bodyBold15, + color = DateRoadTheme.colors.black, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .clip(RoundedCornerShape(10.dp)) + .background(DateRoadTheme.colors.gray100) + .padding(start = 20.dp, top = 15.dp, end = 5.dp, bottom = 17.dp) + ) +} \ No newline at end of file From 2b3198d3f130d0baad1f5184c2a634024f89449c Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 02:54:10 +0900 Subject: [PATCH 13/21] [feat] #176 CourseDetailBottomBar --- .../component/CourseDetailBottomBar.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt new file mode 100644 index 000000000..6ce9b2206 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt @@ -0,0 +1,50 @@ +package org.sopt.dateroad.presentation.ui.coursedetail.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.sopt.dateroad.R +import org.sopt.dateroad.presentation.ui.component.button.DateRoadBasicButton +import org.sopt.dateroad.presentation.ui.component.button.DateRoadImageButton +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@Composable +fun CourseDetailBottomBar( + modifier: Modifier = Modifier, + isUserLiked: Boolean, + onLikeButtonClicked: () -> Unit, + onEnrollButtonClicked: () -> Unit +) { + Row( + modifier = modifier + .fillMaxWidth() + .background(color = DateRoadTheme.colors.white) + .padding(horizontal = 16.dp, vertical = 16.dp) + ) { + 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 = isUserLiked, + onClick = onLikeButtonClicked, + cornerRadius = 14.dp, + paddingHorizontal = 23.dp, + paddingVertical = 18.dp + ) + Spacer(modifier = Modifier.width(12.dp)) + DateRoadBasicButton( + modifier = Modifier.weight(1f), + textContent = stringResource(id = R.string.course_detail_get_course), + onClick = onEnrollButtonClicked + ) + } +} \ No newline at end of file From 01e12c41fd5977cbd781104b1758c4db610d18a2 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 03:13:44 +0900 Subject: [PATCH 14/21] [feat] #176 CourseDetailUnopenedDetail --- .../type/CourseDetailUnopenedDetailType.kt | 18 ++++ .../component/CourseDetailGradientBox.kt | 42 -------- .../component/CourseDetailUnopenedDetail.kt | 96 +++++++++++++++++++ 3 files changed, 114 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt delete mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailGradientBox.kt create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt b/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt new file mode 100644 index 000000000..249553e42 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt @@ -0,0 +1,18 @@ +package org.sopt.dateroad.presentation.type + +import androidx.annotation.StringRes +import org.sopt.dateroad.R + +enum class CourseDetailUnopenedDetailType( + @StringRes val descriptionStringRes: Int, + @StringRes val buttonTextStringRes: Int +) { + POINT( + descriptionStringRes = R.string.course_detail_point_read_button_description, + buttonTextStringRes = R.string.course_detail_point_read_button + ), + FREE( + descriptionStringRes = R.string.course_detail_free_read_button_description, + buttonTextStringRes = R.string.course_detail_free_read_button + ) +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailGradientBox.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailGradientBox.kt deleted file mode 100644 index 730dfcb35..000000000 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailGradientBox.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.sopt.dateroad.presentation.ui.coursedetail.component - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color -import org.sopt.dateroad.ui.theme.DateRoadTheme - -@Composable -fun GradientBoxWithText(text: String) { - Box( - modifier = Modifier.fillMaxWidth() - ) { - Text( - text = text, - style = DateRoadTheme.typography.bodyMed13Context, - color = DateRoadTheme.colors.black, - maxLines = 3, - modifier = Modifier.fillMaxWidth() - ) - - Box( - modifier = Modifier - .fillMaxWidth() - .background( - brush = Brush.verticalGradient( - colors = listOf( - Color.Transparent, - Color.White.copy(alpha = 0.6f), - Color.White.copy(alpha = 1f) - - ) - ) - ) - .matchParentSize() - ) - } -} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt new file mode 100644 index 000000000..e56280d1f --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt @@ -0,0 +1,96 @@ +package org.sopt.dateroad.presentation.ui.coursedetail.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.sopt.dateroad.R +import org.sopt.dateroad.presentation.type.CourseDetailUnopenedDetailType +import org.sopt.dateroad.presentation.ui.component.button.DateRoadFilledButton +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@Composable +fun CourseDetailUnopenedDetail( + text: String, + courseDetailUnopenedDetailType: CourseDetailUnopenedDetailType, + onButtonClicked: () -> Unit +) { + Column { + Box( + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = text, + style = DateRoadTheme.typography.bodyMed13Context, + color = DateRoadTheme.colors.black, + maxLines = 3, + modifier = Modifier.fillMaxWidth() + ) + + Box( + modifier = Modifier + .fillMaxWidth() + .background( + brush = Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.White.copy(alpha = 0.6f), + Color.White.copy(alpha = 1f) + ) + ) + ) + .matchParentSize() + ) + } + 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 = stringResource(id = courseDetailUnopenedDetailType.descriptionStringRes), + 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 = stringResource(id = courseDetailUnopenedDetailType.buttonTextStringRes), + onClick = onButtonClicked, + 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)) + } +} From c4f43059afeaeb68ffebc5eec807491ead692bd7 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 03:18:03 +0900 Subject: [PATCH 15/21] [feat] #176 courseDetailOpenedDetail --- .../component/CourseDetailOpenedDetail.kt | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt new file mode 100644 index 000000000..c274f5129 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt @@ -0,0 +1,37 @@ +package org.sopt.dateroad.presentation.ui.coursedetail.component + +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.Text +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import org.sopt.dateroad.domain.model.Place +import org.sopt.dateroad.presentation.type.DateTagType +import org.sopt.dateroad.ui.theme.DateRoadTheme + +fun LazyListScope.courseDetailOpenedDetail( + description: String, + places: List, + totalCost: String, + tags: List +) { + item { + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = description, + style = DateRoadTheme.typography.bodyMed13Context, + color = DateRoadTheme.colors.black + ) + } + item { + Spacer(modifier = Modifier.height(16.dp)) + } + courseDetailTimeline(places = places) + item { + CourseDetailCost(totalCost = totalCost) + } + item { + CourseDetailTag(tags = tags) + } +} \ No newline at end of file From c862039677f98583045f1ed03ff0bd9900393870 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 03:44:18 +0900 Subject: [PATCH 16/21] =?UTF-8?q?[feat]=20#176=20CourseDetailScreen=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/coursedetail/CourseDetailScreen.kt | 590 +++++------------- 1 file changed, 164 insertions(+), 426 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 8987331e0..095761250 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,13 @@ 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 +17,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,36 +25,26 @@ 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.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.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.view.LoadState import org.sopt.dateroad.ui.theme.DATEROADTheme import org.sopt.dateroad.ui.theme.DateRoadTheme @@ -167,257 +141,80 @@ fun CourseDetailScreen( 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 } } + val isViewable = courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine + val courseDetailUnopenedType = if (courseDetailUiState.courseDetail.free > 0) CourseDetailUnopenedDetailType.FREE else CourseDetailUnopenedDetailType.POINT + Box(modifier = Modifier.fillMaxSize()) { - Column { + Column( + modifier = Modifier + .fillMaxSize() + .background(DateRoadTheme.colors.white) + ) { LazyColumn( state = scrollState, modifier = Modifier .fillMaxSize() - .background(DateRoadTheme.colors.white), - userScrollEnabled = true + .background(DateRoadTheme.colors.white) ) { - item { - Box(modifier = Modifier.fillMaxWidth()) { - HorizontalPager( - count = courseDetailUiState.courseDetail.images.size, - state = pagerState, - modifier = Modifier - .fillMaxWidth(), - userScrollEnabled = courseDetailUiState.courseDetail.isAccess || courseDetailUiState.courseDetail.isCourseMine - ) { page -> - AsyncImage( - model = ImageRequest.Builder(context = LocalContext.current) - .data(courseDetailUiState.courseDetail.images[page]) - .crossfade(true) - .build(), - contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .aspectRatio(1f) - .onGloballyPositioned { coordinates -> - imageHeight = coordinates.size.height - }, - contentScale = ContentScale.Crop - ) - } - - 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) - ) { - Text( - text = courseDetailUiState.courseDetail.date, - style = DateRoadTheme.typography.bodySemi15, - color = DateRoadTheme.colors.gray400 - ) - Spacer(modifier = Modifier.height(16.dp)) - Text( - text = courseDetailUiState.courseDetail.title, - style = DateRoadTheme.typography.titleExtra24, - color = DateRoadTheme.colors.black - ) - Spacer(modifier = Modifier.height(16.dp)) - CourseDetailInfoBar( - totalTime = courseDetailUiState.courseDetail.totalTime, - totalCost = courseDetailUiState.courseDetail.totalCostTag, - city = courseDetailUiState.courseDetail.city - ) - Spacer(modifier = Modifier.height(16.dp)) - 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)) - } - } - } - } - } - } - if (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)) + ) } } } @@ -425,190 +222,131 @@ fun CourseDetailScreen( } } - 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 - ) - ) - } + DateRoadScrollResponsiveTopBar( + isDefault = isScrollResponsiveDefault, + onLeftIconClick = onTopBarIconClicked, + onRightIconClick = onEditBottomSheet, + rightIconResource = if (isViewable) R.drawable.btn_course_detail_more_white else null + ) + + if (isViewable && !courseDetailUiState.courseDetail.isCourseMine){ + CourseDetailBottomBar( + modifier = Modifier.align(Alignment.BottomCenter), + isUserLiked = courseDetailUiState.courseDetail.isUserLiked, + onLikeButtonClicked = onLikeButtonClicked, + onEnrollButtonClicked = 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.courseDetail.isCourseMine) { - 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() } - ) + } + + if (courseDetailUiState.isPointReadDialogOpen) { + DateRoadTwoButtonDialogWithDescription( + twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.READ_COURSE, + onDismissRequest = { dismissDialogLookedByPoint() }, + onClickConfirm = { + dismissDialogLookedByPoint() + if (courseDetailUiState.courseDetail.totalPoint < 50) { + onDialogPointLack() + } else { + openCourseDetail() } }, - leftTint = if (isTopBarTransparent) DateRoadTheme.colors.white else DateRoadTheme.colors.black + onClickDismiss = { dismissDialogLookedByPoint() } ) } - 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 (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 { + if (courseDetailUiState.isFreeReadDialogOpen) { + DateRoadTwoButtonDialogWithDescription( + twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.FREE_READ, + onDismissRequest = { dismissDialogLookedForFree() }, + onClickConfirm = { + dismissDialogLookedForFree() openCourseDetail() - } - }, - onClickDismiss = { dismissDialogLookedByPoint() } - ) - } - - if (courseDetailUiState.isPointLackDialogOpen) { - DateRoadTwoButtonDialogWithDescription( - twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.POINT_LACK, - onDismissRequest = dismissDialogPointLack, - onClickConfirm = onDialogPointLackConfirm, - onClickDismiss = dismissDialogPointLack - ) - } - - if (courseDetailUiState.isFreeReadDialogOpen) { - DateRoadTwoButtonDialogWithDescription( - twoButtonDialogWithDescriptionType = TwoButtonDialogWithDescriptionType.FREE_READ, - onDismissRequest = { dismissDialogLookedForFree() }, - onClickConfirm = { - dismissDialogLookedForFree() - openCourseDetail() - }, - onClickDismiss = { dismissDialogLookedForFree() } - ) - } - - 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() - } - ), - onDismissRequest = { dismissEditBottomSheet() }, - onButtonClick = { - dismissEditBottomSheet() + }, + onClickDismiss = { dismissDialogLookedForFree() } + ) } - ) -} -@Composable -fun 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" - ) + 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() + } ), - isCourseMine = true, - isAccess = true, - isUserLiked = false, - like = 10, - free = 2, - totalPoint = 30 + onDismissRequest = { dismissEditBottomSheet() }, + onButtonClick = { + dismissEditBottomSheet() + } ) - ) - - CourseDetailScreen( - courseId = 1, - courseDetailUiState = dummyCourseDetail, - onDialogPointLack = {}, - dismissDialogPointLack = {}, - onDialogPointLackConfirm = {}, - onDialogLookedForFree = {}, - dismissDialogLookedForFree = {}, - onDialogLookedByPoint = {}, - dismissDialogLookedByPoint = {}, - onLikeButtonClicked = {}, - onDeleteButtonClicked = {}, - onEditBottomSheet = {}, - dismissEditBottomSheet = {}, - enrollSchedule = {}, - onTopBarIconClicked = {}, - openCourseDetail = {} - ) + } } @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 = {}, + onEditBottomSheet = {}, + dismissEditBottomSheet = {}, + enrollSchedule = {}, + onTopBarIconClicked = {}, + openCourseDetail = {} + ) } } From f733a29bd98a2d8a98064c3323ee9448d7791928 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 03:44:48 +0900 Subject: [PATCH 17/21] =?UTF-8?q?[chore]=20#176=20=EC=A2=8C=EC=9A=B0=20?= =?UTF-8?q?=ED=8C=A8=EB=94=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/component/pager/DateRoadImagePager.kt | 2 +- .../component/CourseDetailBasicInfo.kt | 6 ++++- .../component/CourseDetailOpenedDetail.kt | 2 ++ .../component/CourseDetailUnopenedDetail.kt | 26 +++++++++++++------ 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt index 91010fcd0..a98abed8c 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt @@ -29,7 +29,7 @@ import org.sopt.dateroad.ui.theme.DateRoadTheme @Composable fun DateRoadImagePager( modifier: Modifier = Modifier, - pagerState: PagerState = PagerState(), + pagerState: PagerState, images: List, userScrollEnabled: Boolean, like: String?, diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt index 5cd04772c..2942418e3 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt @@ -3,6 +3,7 @@ package org.sopt.dateroad.presentation.ui.coursedetail.component import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -17,7 +18,10 @@ fun CourseDetailBasicInfo( totalCost: String, city: String ) { - Column { + Column( + modifier = Modifier + .padding(horizontal = 16.dp) + ) { Spacer(modifier = Modifier.height(18.dp)) Text( text = date, diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt index c274f5129..dedcc247d 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt @@ -2,6 +2,7 @@ package org.sopt.dateroad.presentation.ui.coursedetail.component import androidx.compose.foundation.layout.Spacer 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.ui.Modifier @@ -19,6 +20,7 @@ fun LazyListScope.courseDetailOpenedDetail( item { Spacer(modifier = Modifier.height(16.dp)) Text( + modifier = Modifier.padding(horizontal = 16.dp), text = description, style = DateRoadTheme.typography.bodyMed13Context, color = DateRoadTheme.colors.black diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt index e56280d1f..167077731 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -24,6 +25,7 @@ import org.sopt.dateroad.ui.theme.DateRoadTheme @Composable fun CourseDetailUnopenedDetail( text: String, + free: Int, courseDetailUnopenedDetailType: CourseDetailUnopenedDetailType, onButtonClicked: () -> Unit ) { @@ -31,13 +33,18 @@ fun CourseDetailUnopenedDetail( Box( modifier = Modifier.fillMaxWidth() ) { - Text( - text = text, - style = DateRoadTheme.typography.bodyMed13Context, - color = DateRoadTheme.colors.black, - maxLines = 3, - modifier = Modifier.fillMaxWidth() - ) + Column { + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = text, + style = DateRoadTheme.typography.bodyMed13Context, + color = DateRoadTheme.colors.black, + maxLines = 3, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) + } Box( modifier = Modifier @@ -80,7 +87,10 @@ fun CourseDetailUnopenedDetail( modifier = Modifier .align(Alignment.CenterHorizontally), isEnabled = true, - textContent = stringResource(id = courseDetailUnopenedDetailType.buttonTextStringRes), + textContent = when(courseDetailUnopenedDetailType) { + CourseDetailUnopenedDetailType.FREE -> stringResource(id = courseDetailUnopenedDetailType.buttonTextStringRes, free) + CourseDetailUnopenedDetailType.POINT -> stringResource(id = courseDetailUnopenedDetailType.buttonTextStringRes) + }, onClick = onButtonClicked, textStyle = DateRoadTheme.typography.bodyBold15, enabledBackgroundColor = DateRoadTheme.colors.purple600, From e8408413966ce6d0595a6ea9e6772ca481cb8ace Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 04:08:51 +0900 Subject: [PATCH 18/21] [feat] #176 AdvertisementDetail --- .../component/AdvertisementDetail.kt | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt new file mode 100644 index 000000000..467cc0456 --- /dev/null +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt @@ -0,0 +1,50 @@ +package org.sopt.dateroad.presentation.ui.advertisement.component + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import org.sopt.dateroad.presentation.type.TagType +import org.sopt.dateroad.presentation.ui.component.tag.DateRoadTextTag +import org.sopt.dateroad.ui.theme.DateRoadTheme + +@Composable +fun AdvertisementDetail( + advertisementTagTitle: String, + createAt: String, + title: String, + description: String +) { + Column( + modifier = Modifier.padding(horizontal = 16.dp) + ) { + Spacer(modifier = Modifier.height(20.dp)) + DateRoadTextTag( + textContent = advertisementTagTitle, + tagContentType = TagType.ADVERTISEMENT_TITLE + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = createAt, + style = DateRoadTheme.typography.bodySemi15, + color = DateRoadTheme.colors.gray400 + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = title, + style = DateRoadTheme.typography.titleExtra24, + color = DateRoadTheme.colors.black + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = description, + style = DateRoadTheme.typography.bodyMed13Context, + color = DateRoadTheme.colors.black + ) + Spacer(modifier = Modifier.height(54.dp)) + } +} \ No newline at end of file From a70eac76a55a5aca47c5199c160561016b7daaa6 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 04:09:16 +0900 Subject: [PATCH 19/21] =?UTF-8?q?[chore]=20#176=20AdvertisementNavigation?= =?UTF-8?q?=20route=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/advertisement/navigation/AdvertisementNavigation.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt index 038249748..17f2592c7 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt @@ -32,6 +32,6 @@ fun NavGraphBuilder.advertisementGraph( object AdvertisementRoute { private const val ROUTE = "advertisement" const val ID = "id" - const val ROUTE_WITH_ARGUMENT = "${ROUTE}/${ID}" - fun route(advertisementId: Int) = "${ROUTE}/$advertisementId" + const val ROUTE_WITH_ARGUMENT = "$ROUTE/{$ID}" + fun route(advertisementId: Int) = "$ROUTE/$advertisementId" } \ No newline at end of file From 306e36d19427e36d0d516b75156ebbb8b1a22f99 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 04:09:49 +0900 Subject: [PATCH 20/21] [chore] #176 AdvertisementScreen --- .../ui/advertisement/AdvertisementScreen.kt | 98 ++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt index ffb13058a..9e5d26ef3 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt @@ -1,10 +1,33 @@ package org.sopt.dateroad.presentation.ui.advertisement +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.onGloballyPositioned import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.lifecycle.flowWithLifecycle +import com.google.accompanist.pager.ExperimentalPagerApi +import com.google.accompanist.pager.PagerState +import org.sopt.dateroad.presentation.ui.advertisement.component.AdvertisementDetail +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.util.view.LoadState +import org.sopt.dateroad.ui.theme.DateRoadTheme @Composable fun AdvertisementRoute( @@ -14,11 +37,84 @@ fun AdvertisementRoute( ) { val uiState by viewmodel.uiState.collectAsStateWithLifecycle() val lifecycleOwner = LocalLifecycleOwner.current + + LaunchedEffect(viewmodel.sideEffect, lifecycleOwner) { + viewmodel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) + .collect { advertisementSideEffect -> + when (advertisementSideEffect) { + is AdvertisementContract.AdvertisementSideEffect.PopBackStack -> popBackStack() + } + } + } + + LaunchedEffect(Unit) { + viewmodel.fetchAdvertisementDetail(advertisementId = advertisementId) + } + + when (uiState.loadState) { + LoadState.Idle -> DateRoadIdleView() + + LoadState.Loading -> DateRoadLoadingView() + + LoadState.Success -> AdvertisementScreen( + advertisementUiState = uiState, + onTopBarIconClicked = { viewmodel.setSideEffect(AdvertisementContract.AdvertisementSideEffect.PopBackStack) } + ) + + LoadState.Error -> DateRoadErrorView() + } } +@OptIn(ExperimentalPagerApi::class) @Composable fun AdvertisementScreen( - + advertisementUiState: AdvertisementContract.AdvertisementUiState, + onTopBarIconClicked: () -> Unit ) { + var imageHeight by remember { mutableIntStateOf(0) } + + val scrollState = rememberLazyListState() + val isScrollResponsiveDefault by remember { + derivedStateOf { + scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset < imageHeight + } + } + + Box(modifier = Modifier.fillMaxSize()) { + LazyColumn( + state = scrollState, + modifier = Modifier + .fillMaxSize() + .background(DateRoadTheme.colors.white) + ) { + with(advertisementUiState.advertisementDetail) { + item { + DateRoadImagePager( + modifier = Modifier + .onGloballyPositioned { coordinates -> + imageHeight = coordinates.size.height + }, + pagerState = PagerState(), + images = images, + userScrollEnabled = true, + like = null + ) + } + + item { + AdvertisementDetail( + advertisementTagTitle = advertisementTagTitle, + createAt = createAt, + title = title, + description = description + ) + } + } + } + DateRoadScrollResponsiveTopBar( + isDefault = isScrollResponsiveDefault, + onLeftIconClick = onTopBarIconClicked + ) + } } \ No newline at end of file From 1b4fe57b7f8943f6fc2aea0f2ec20e613ca3d600 Mon Sep 17 00:00:00 2001 From: jihyunniiii Date: Sun, 18 Aug 2024 04:10:03 +0900 Subject: [PATCH 21/21] [chore] #176 ktlitFormat --- .../type/CourseDetailUnopenedDetailType.kt | 2 +- .../ui/advertisement/AdvertisementContract.kt | 2 +- .../ui/advertisement/AdvertisementScreen.kt | 2 +- .../advertisement/AdvertisementViewModel.kt | 6 +- .../component/AdvertisementDetail.kt | 2 +- .../navigation/AdvertisementNavigation.kt | 2 +- .../ui/component/pager/DateRoadImagePager.kt | 8 +- .../topbar/DateRoadScrollResponsiveTopBar.kt | 2 +- .../ui/coursedetail/CourseDetailContract.kt | 1 - .../ui/coursedetail/CourseDetailScreen.kt | 103 ++++++++---------- .../ui/coursedetail/CourseDetailViewModel.kt | 1 - .../component/CourseDetailBasicInfo.kt | 2 +- .../component/CourseDetailBottomBar.kt | 2 +- .../component/CourseDetailCost.kt | 2 +- .../component/CourseDetailOpenedDetail.kt | 2 +- .../coursedetail/component/CourseDetailTag.kt | 2 +- .../component/CourseDetailTimeline.kt | 3 +- .../component/CourseDetailUnopenedDetail.kt | 4 +- .../presentation/ui/home/HomeContract.kt | 2 +- .../presentation/ui/home/HomeScreen.kt | 2 +- .../ui/navigator/component/MainNavHost.kt | 2 +- 21 files changed, 70 insertions(+), 84 deletions(-) diff --git a/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt b/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt index 249553e42..d854a9404 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/type/CourseDetailUnopenedDetailType.kt @@ -15,4 +15,4 @@ enum class CourseDetailUnopenedDetailType( descriptionStringRes = R.string.course_detail_free_read_button_description, buttonTextStringRes = R.string.course_detail_free_read_button ) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt index 646a71b3e..76196a92b 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementContract.kt @@ -19,4 +19,4 @@ class AdvertisementContract { sealed class AdvertisementEvent : UiEvent { data class FetchAdvertisementDetail(val loadState: LoadState, val advertisementDetail: AdvertisementDetail) : AdvertisementEvent() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt index 9e5d26ef3..acea7706c 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementScreen.kt @@ -117,4 +117,4 @@ fun AdvertisementScreen( onLeftIconClick = onTopBarIconClicked ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt index ac718250b..6a09f4d93 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/AdvertisementViewModel.kt @@ -2,15 +2,15 @@ package org.sopt.dateroad.presentation.ui.advertisement import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.launch import org.sopt.dateroad.domain.usecase.GetAdvertisementDetailUseCase import org.sopt.dateroad.presentation.util.base.BaseViewModel import org.sopt.dateroad.presentation.util.view.LoadState -import javax.inject.Inject @HiltViewModel class AdvertisementViewModel @Inject constructor( - private val getAdvertisementDetailUseCase: GetAdvertisementDetailUseCase, + private val getAdvertisementDetailUseCase: GetAdvertisementDetailUseCase ) : BaseViewModel() { override fun createInitialState(): AdvertisementContract.AdvertisementUiState = AdvertisementContract.AdvertisementUiState() @@ -30,4 +30,4 @@ class AdvertisementViewModel @Inject constructor( } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt index 467cc0456..743c61994 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/component/AdvertisementDetail.kt @@ -47,4 +47,4 @@ fun AdvertisementDetail( ) Spacer(modifier = Modifier.height(54.dp)) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt index 17f2592c7..377ac9365 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/advertisement/navigation/AdvertisementNavigation.kt @@ -34,4 +34,4 @@ object AdvertisementRoute { const val ID = "id" const val ROUTE_WITH_ARGUMENT = "$ROUTE/{$ID}" fun route(advertisementId: Int) = "$ROUTE/$advertisementId" -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt index a98abed8c..de6c7eccd 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/pager/DateRoadImagePager.kt @@ -1,6 +1,5 @@ package org.sopt.dateroad.presentation.ui.component.pager -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxWidth @@ -8,8 +7,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -23,7 +20,6 @@ import org.sopt.dateroad.R import org.sopt.dateroad.presentation.type.TagType import org.sopt.dateroad.presentation.ui.component.tag.DateRoadImageTag import org.sopt.dateroad.presentation.ui.component.tag.DateRoadTextTag -import org.sopt.dateroad.ui.theme.DateRoadTheme @OptIn(ExperimentalPagerApi::class) @Composable @@ -32,7 +28,7 @@ fun DateRoadImagePager( pagerState: PagerState, images: List, userScrollEnabled: Boolean, - like: String?, + like: String? ) { Box(modifier = Modifier.fillMaxWidth()) { HorizontalPager( @@ -73,4 +69,4 @@ fun DateRoadImagePager( .align(Alignment.BottomEnd) ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt index 7d3a9730e..afdd33eca 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/component/topbar/DateRoadScrollResponsiveTopBar.kt @@ -58,4 +58,4 @@ fun DateRoadScrollResponsiveTopBar( } ) } -} \ No newline at end of file +} 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 bf6c38687..dbc2aa1dd 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 @@ -1,6 +1,5 @@ package org.sopt.dateroad.presentation.ui.coursedetail -import org.sopt.dateroad.domain.model.AdvertisementDetail import org.sopt.dateroad.domain.model.CourseDetail import org.sopt.dateroad.presentation.type.EnrollType import org.sopt.dateroad.presentation.util.base.UiEvent 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 095761250..08825f2d3 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 @@ -2,7 +2,6 @@ package org.sopt.dateroad.presentation.ui.coursedetail import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height @@ -104,7 +103,7 @@ fun CourseDetailRoute( onEditBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OnEditBottomSheet) }, dismissEditBottomSheet = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.DismissEditBottomSheet) }, enrollSchedule = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.NavigateToEnroll(EnrollType.TIMELINE, courseId)) }, - onTopBarIconClicked = popBackStack, + onTopBarIconClicked = { viewModel.setSideEffect(CourseDetailContract.CourseDetailSideEffect.PopBackStack) }, openCourseDetail = { viewModel.setEvent(CourseDetailContract.CourseDetailEvent.OpenCourse) viewModel.postUsePoint(courseId = courseId) @@ -154,68 +153,62 @@ fun CourseDetailScreen( val courseDetailUnopenedType = if (courseDetailUiState.courseDetail.free > 0) CourseDetailUnopenedDetailType.FREE else CourseDetailUnopenedDetailType.POINT Box(modifier = Modifier.fillMaxSize()) { - Column( + LazyColumn( + state = scrollState, modifier = Modifier .fillMaxSize() .background(DateRoadTheme.colors.white) ) { - LazyColumn( - state = scrollState, - modifier = Modifier - .fillMaxSize() - .background(DateRoadTheme.colors.white) - ) { - with(courseDetailUiState.courseDetail) { - item { - DateRoadImagePager( - modifier = Modifier - .onGloballyPositioned { coordinates -> - imageHeight = coordinates.size.height - }, - pagerState = PagerState(), - images = courseDetailUiState.courseDetail.images, - userScrollEnabled = isViewable, - like = courseDetailUiState.courseDetail.like.toString() - ) - } + with(courseDetailUiState.courseDetail) { + item { + DateRoadImagePager( + modifier = Modifier + .onGloballyPositioned { coordinates -> + imageHeight = coordinates.size.height + }, + pagerState = PagerState(), + images = courseDetailUiState.courseDetail.images, + userScrollEnabled = isViewable, + like = courseDetailUiState.courseDetail.like.toString() + ) + } - item { - CourseDetailBasicInfo( - date = date, - title = title, - totalTime = totalTime, + item { + CourseDetailBasicInfo( + date = date, + title = title, + totalTime = totalTime, + totalCost = totalCost, + city = city + ) + } + + when (isViewable) { + true -> { + courseDetailOpenedDetail( + description = description, + places = places, totalCost = totalCost, - city = city + tags = tags.mapNotNull { tag -> tag.getDateTagTypeByName() } ) - } - - when (isViewable) { - true -> { - courseDetailOpenedDetail( - description = description, - places = places, - totalCost = totalCost, - tags = tags.mapNotNull { tag -> tag.getDateTagTypeByName() } - ) - if (!isCourseMine) { - item { - Spacer(modifier = Modifier.height(86.dp)) - } + if (!isCourseMine) { + item { + Spacer(modifier = Modifier.height(86.dp)) } } + } - false -> { - item { - CourseDetailUnopenedDetail( - text = description, - free = free, - courseDetailUnopenedDetailType = courseDetailUnopenedType, - onButtonClicked = when(courseDetailUnopenedType) { - CourseDetailUnopenedDetailType.FREE -> onDialogLookedForFree - CourseDetailUnopenedDetailType.POINT -> onDialogLookedByPoint - } - ) - } + false -> { + item { + CourseDetailUnopenedDetail( + text = description, + free = free, + courseDetailUnopenedDetailType = courseDetailUnopenedType, + onButtonClicked = when (courseDetailUnopenedType) { + CourseDetailUnopenedDetailType.FREE -> onDialogLookedForFree + CourseDetailUnopenedDetailType.POINT -> onDialogLookedByPoint + } + ) } } } @@ -229,7 +222,7 @@ fun CourseDetailScreen( rightIconResource = if (isViewable) R.drawable.btn_course_detail_more_white else null ) - if (isViewable && !courseDetailUiState.courseDetail.isCourseMine){ + if (isViewable && !courseDetailUiState.courseDetail.isCourseMine) { CourseDetailBottomBar( modifier = Modifier.align(Alignment.BottomCenter), isUserLiked = courseDetailUiState.courseDetail.isUserLiked, 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 b4df178a0..3707668a0 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 @@ -7,7 +7,6 @@ import kotlinx.coroutines.launch import org.sopt.dateroad.domain.model.UsePoint import org.sopt.dateroad.domain.usecase.DeleteCourseLikeUseCase import org.sopt.dateroad.domain.usecase.DeleteCourseUseCase -import org.sopt.dateroad.domain.usecase.GetAdvertisementDetailUseCase import org.sopt.dateroad.domain.usecase.GetCourseDetailUseCase import org.sopt.dateroad.domain.usecase.PostCourseLikeUseCase import org.sopt.dateroad.domain.usecase.PostUsePointUseCase diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt index 2942418e3..c19f4468c 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBasicInfo.kt @@ -41,4 +41,4 @@ fun CourseDetailBasicInfo( city = city ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt index 6ce9b2206..6c438f1e0 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailBottomBar.kt @@ -47,4 +47,4 @@ fun CourseDetailBottomBar( onClick = onEnrollButtonClicked ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt index 159c39718..254bd7478 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailCost.kt @@ -38,4 +38,4 @@ fun CourseDetailCost( .background(DateRoadTheme.colors.gray100) .padding(start = 20.dp, top = 15.dp, end = 5.dp, bottom = 17.dp) ) -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt index dedcc247d..f6a116596 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailOpenedDetail.kt @@ -36,4 +36,4 @@ fun LazyListScope.courseDetailOpenedDetail( item { CourseDetailTag(tags = tags) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt index 8d2b737dd..f0b01c965 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailTag.kt @@ -47,4 +47,4 @@ fun CourseDetailTag( } Spacer(modifier = Modifier.height(30.dp)) } -} \ No newline at end of file +} 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 0f9fadc0c..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,7 +5,6 @@ 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.unit.dp @@ -37,4 +36,4 @@ fun LazyListScope.courseDetailTimeline( ) Spacer(modifier = Modifier.height(16.dp)) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt index 167077731..4774a535e 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/coursedetail/component/CourseDetailUnopenedDetail.kt @@ -42,7 +42,7 @@ fun CourseDetailUnopenedDetail( maxLines = 3, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = 16.dp) ) } @@ -87,7 +87,7 @@ fun CourseDetailUnopenedDetail( modifier = Modifier .align(Alignment.CenterHorizontally), isEnabled = true, - textContent = when(courseDetailUnopenedDetailType) { + textContent = when (courseDetailUnopenedDetailType) { CourseDetailUnopenedDetailType.FREE -> stringResource(id = courseDetailUnopenedDetailType.buttonTextStringRes, free) CourseDetailUnopenedDetailType.POINT -> stringResource(id = courseDetailUnopenedDetailType.buttonTextStringRes) }, diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt index 0da1dff1a..c54d0113f 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeContract.kt @@ -27,7 +27,7 @@ class HomeContract { data object NavigateToLook : HomeSideEffect data object NavigateToTimeline : HomeSideEffect data class NavigateToEnroll(val enrollType: EnrollType, val id: Int?) : HomeSideEffect - data class NavigateToAdvertisementDetail(val advertisementId: Int): HomeSideEffect + data class NavigateToAdvertisementDetail(val advertisementId: Int) : HomeSideEffect data class NavigateToCourseDetail(val courseId: Int) : HomeSideEffect } diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt index 3708b5417..5f63cb6d1 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/home/HomeScreen.kt @@ -46,10 +46,10 @@ import org.sopt.dateroad.presentation.ui.component.button.DateRoadTextButton import org.sopt.dateroad.presentation.ui.component.card.DateRoadCourseCard import org.sopt.dateroad.presentation.ui.component.partialcolortext.PartialColorText import org.sopt.dateroad.presentation.ui.component.tag.DateRoadTextTag -import org.sopt.dateroad.presentation.ui.home.component.DateRoadHomeTopBar 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.home.component.DateRoadHomeTopBar import org.sopt.dateroad.presentation.ui.home.component.HomeAdvertisement import org.sopt.dateroad.presentation.ui.home.component.HomeHotCourseCard import org.sopt.dateroad.presentation.ui.home.component.HomeTimeLineCard diff --git a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt index f725d0be3..fc363ed4c 100644 --- a/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt +++ b/app/src/main/java/org/sopt/dateroad/presentation/ui/navigator/component/MainNavHost.kt @@ -44,7 +44,7 @@ fun MainNavHost( startDestination = navigator.startDestination ) { advertisementGraph( - popBackStack = navigator:: popBackStackIfNotHome + popBackStack = navigator::popBackStackIfNotHome ) courseDetailGraph(