Skip to content

Commit

Permalink
[chore] #176 AdvertisementScreen
Browse files Browse the repository at this point in the history
  • Loading branch information
jihyunniiii committed Aug 17, 2024
1 parent a70eac7 commit 306e36d
Showing 1 changed file with 97 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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
)
}
}

0 comments on commit 306e36d

Please sign in to comment.