Skip to content

Commit 8d08a69

Browse files
committed
[feature/withdraw] 식당리스트 화면 리뷰 분기처리 (#96)
1 parent d902932 commit 8d08a69

File tree

10 files changed

+77
-22
lines changed

10 files changed

+77
-22
lines changed

data/src/main/java/com/everymeal/data/datasource/review/ReviewDataSource.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import kotlinx.coroutines.flow.Flow
1010
interface ReviewDataSource {
1111

1212
suspend fun getPagingStoreReviews(
13-
offset: Int,
14-
limit: Int,
1513
order: String?,
1614
group: String?,
1715
grade: Int?,

data/src/main/java/com/everymeal/data/datasource/review/ReviewDataSourceImpl.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ class ReviewDataSourceImpl @Inject constructor(
1616
private val storeReviewApi: StoreReviewApi,
1717
) : ReviewDataSource {
1818
override suspend fun getPagingStoreReviews(
19-
offset: Int,
20-
limit: Int,
2119
order: String?,
2220
group: String?,
2321
grade: Int?,

data/src/main/java/com/everymeal/data/repository/review/DefaultReviewRepository.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ class DefaultReviewRepository @Inject constructor(
2020
private val reviewDataSource: ReviewDataSource,
2121
) : ReviewRepository {
2222
override suspend fun getPagingStoreReviews(
23-
offset: Int,
24-
limit: Int,
2523
order: String?,
2624
group: String?,
2725
grade: Int?,
2826
campusIdx: Int
2927
): Flow<PagingData<StoreReviewEntity>> {
3028
return reviewDataSource.getPagingStoreReviews(
31-
offset,
32-
limit,
3329
order,
3430
group,
3531
grade,

domain/src/main/java/com/everymeal/domain/repository/review/ReviewRepository.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import kotlinx.coroutines.flow.Flow
99

1010
interface ReviewRepository {
1111
suspend fun getPagingStoreReviews(
12-
offset: Int,
13-
limit: Int,
1412
order: String?,
1513
group: String?,
1614
grade: Int?,

domain/src/main/java/com/everymeal/domain/usecase/review/GetStoreReviewUseCase.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@ class GetStoreReviewUseCase @Inject constructor(
1010
private val reviewRepository: ReviewRepository
1111
) {
1212
suspend operator fun invoke(
13-
offset: Int,
14-
limit: Int,
1513
order: String?,
1614
group: String?,
1715
grade: Int?,
1816
campusIdx: Int
1917
) : Flow<PagingData<StoreReviewEntity>> {
20-
return reviewRepository.getPagingStoreReviews(offset, limit, order, group, grade, campusIdx)
18+
return reviewRepository.getPagingStoreReviews(order, group, grade, campusIdx)
2119
}
2220
}

presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListContract.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ class DetailContract {
1616
val reportCategoryType: ReportCategoryType = ReportCategoryType.NONE,
1717
val restaurantCategoryType: RestaurantCategoryType = RestaurantCategoryType.NONE,
1818
val rating: Int = 0,
19+
val isReviewScreen: Boolean = false
1920
) : ViewState
2021

2122
sealed class DetailEvent : ViewEvent {
22-
object InitDetailScreen : DetailEvent()
23+
data class InitDetailScreen(val isReviewScreen: Boolean = false) : DetailEvent()
2324
data class SortBottomSheetStateChange(val sortBottomSheetState: Boolean) : DetailEvent()
2425
data class MealRatingBottomSheetStateChange(val mealRatingBottomSheetState: Boolean) : DetailEvent()
2526
data class ReportBottomSheetStateChange(val reportBottomSheetState: Boolean) : DetailEvent()

presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListScreen.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ import androidx.hilt.navigation.compose.hiltViewModel
3131
import androidx.paging.compose.LazyPagingItems
3232
import androidx.paging.compose.collectAsLazyPagingItems
3333
import com.everymeal.domain.model.restaurant.RestaurantDataEntity
34+
import com.everymeal.domain.model.review.StoreReviewEntity
3435
import com.everymeal.presentation.R
3536
import com.everymeal.presentation.components.EveryMealCategoryRatingBottomSheetDialog
3637
import com.everymeal.presentation.components.EveryMealDetailReportBottomSheetDialog
3738
import com.everymeal.presentation.components.EveryMealReportBottomSheetDialog
3839
import com.everymeal.presentation.components.EveryMealRestaurantItem
40+
import com.everymeal.presentation.components.EveryMealReviewItem
3941
import com.everymeal.presentation.components.EveryMealSortCategoryBottomSheetDialog
4042
import com.everymeal.presentation.ui.save.SaveTopBar
4143
import com.everymeal.presentation.ui.theme.Grey2
@@ -55,8 +57,11 @@ fun DetailListScreen(
5557
val pagingRestaurantList: LazyPagingItems<RestaurantDataEntity> =
5658
detailListViewModel.restaurantItems.collectAsLazyPagingItems()
5759

60+
val pagingReviewList: LazyPagingItems<StoreReviewEntity> =
61+
detailListViewModel.restaurantReviews.collectAsLazyPagingItems()
62+
5863
LaunchedEffect(Unit) {
59-
detailListViewModel.setEvent(DetailContract.DetailEvent.InitDetailScreen)
64+
detailListViewModel.setEvent(DetailContract.DetailEvent.InitDetailScreen(title == "리뷰"))
6065
}
6166

6267
LaunchedEffect(key1 = detailListViewModel.effect) {
@@ -258,6 +263,19 @@ fun DetailListScreen(
258263
Spacer(modifier = Modifier.padding(16.dp))
259264
}
260265
}
266+
267+
items(pagingReviewList.itemCount) { index ->
268+
val item = pagingReviewList[index]
269+
item?.let {
270+
EveryMealReviewItem(
271+
review = it,
272+
onDetailRestaurantClick = { restaurantId ->
273+
detailListViewModel.setEvent(DetailContract.DetailEvent.OnRestaurantDetailClick(restaurantId))
274+
}
275+
)
276+
Spacer(modifier = Modifier.padding(16.dp))
277+
}
278+
}
261279
}
262280
}
263281
}

presentation/src/main/java/com/everymeal/presentation/ui/detail/DetailListViewModel.kt

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import androidx.lifecycle.viewModelScope
44
import androidx.paging.PagingData
55
import androidx.paging.cachedIn
66
import com.everymeal.domain.model.restaurant.RestaurantDataEntity
7+
import com.everymeal.domain.model.review.StoreReviewEntity
78
import com.everymeal.domain.usecase.local.GetUniversityIndexUseCase
89
import com.everymeal.domain.usecase.restaurant.GetUnivRestaurantUseCase
10+
import com.everymeal.domain.usecase.review.GetStoreReviewUseCase
911
import com.everymeal.presentation.base.BaseViewModel
1012
import com.everymeal.presentation.ui.detail.DetailContract.DetailEvent
1113
import com.everymeal.presentation.ui.detail.DetailContract.DetailState
@@ -21,23 +23,38 @@ import javax.inject.Inject
2123
@HiltViewModel
2224
class DetailListViewModel @Inject constructor(
2325
private val getUnivRestaurantUseCase: GetUnivRestaurantUseCase,
24-
private val getUniversityIndexUseCase: GetUniversityIndexUseCase
26+
private val getUniversityIndexUseCase: GetUniversityIndexUseCase,
27+
private val getStoreReviewUseCase: GetStoreReviewUseCase
2528
): BaseViewModel<DetailState, DetailEffect, DetailEvent>(
2629
DetailState()
2730
) {
2831
private val _restaurantItems : MutableStateFlow<PagingData<RestaurantDataEntity>> = MutableStateFlow(value = PagingData.empty())
2932
val restaurantItems : StateFlow<PagingData<RestaurantDataEntity>> = _restaurantItems.asStateFlow()
3033

34+
private val _restaurantReviews : MutableStateFlow<PagingData<StoreReviewEntity>> = MutableStateFlow(value = PagingData.empty())
35+
val restaurantReviews : StateFlow<PagingData<StoreReviewEntity>> = _restaurantReviews.asStateFlow()
36+
3137
override fun handleEvents(event: DetailEvent) {
3238
when (event) {
3339
is DetailEvent.InitDetailScreen -> {
34-
getRestaurantList()
40+
reflectUpdateState(
41+
isReviewScreen = event.isReviewScreen
42+
)
43+
if(event.isReviewScreen) {
44+
getReviewList()
45+
} else {
46+
getRestaurantList()
47+
}
3548
}
3649
is DetailEvent.OnClickDetailListCategoryType -> {
3750
reflectUpdateState(
3851
detailSortCategoryType = event.detailSortCategoryType
3952
)
40-
getRestaurantList()
53+
if(viewState.value.isReviewScreen) {
54+
getReviewList()
55+
} else {
56+
getRestaurantList()
57+
}
4158
}
4259
is DetailEvent.SortBottomSheetStateChange -> {
4360
reflectUpdateState(
@@ -48,7 +65,11 @@ class DetailListViewModel @Inject constructor(
4865
reflectUpdateState(
4966
mealRatingBottomSheetState = event.mealRatingBottomSheetState
5067
)
51-
getRestaurantList()
68+
if(viewState.value.isReviewScreen) {
69+
getReviewList()
70+
} else {
71+
getRestaurantList()
72+
}
5273
}
5374
is DetailEvent.ReportBottomSheetStateChange -> {
5475
reflectUpdateState(
@@ -79,20 +100,42 @@ class DetailListViewModel @Inject constructor(
79100
reflectUpdateState(
80101
restaurantCategoryType = RestaurantCategoryType.NONE
81102
)
82-
getRestaurantList()
103+
if(viewState.value.isReviewScreen) {
104+
getReviewList()
105+
} else {
106+
getRestaurantList()
107+
}
83108
}
84109
is DetailEvent.OnDeleteClickRating -> {
85110
reflectUpdateState(
86111
rating = 0
87112
)
88-
getRestaurantList()
113+
if(viewState.value.isReviewScreen) {
114+
getReviewList()
115+
} else {
116+
getRestaurantList()
117+
}
89118
}
90119
is DetailEvent.OnRestaurantDetailClick -> {
91120
sendEffect({ DetailEffect.OnRestaurantClickEffect(event.restaurantId) })
92121
}
93122
}
94123
}
95124

125+
private fun getReviewList() {
126+
viewModelScope.launch {
127+
getStoreReviewUseCase(
128+
order = viewState.value.detailSortCategoryType.sort(),
129+
group = viewState.value.restaurantCategoryType.sort(),
130+
grade = if(viewState.value.rating == 0) null else viewState.value.rating,
131+
campusIdx = getUniversityIndexUseCase().first().toInt()
132+
).cachedIn(viewModelScope)
133+
.collect {
134+
_restaurantReviews.emit(it)
135+
}
136+
}
137+
}
138+
96139
private fun getRestaurantList() {
97140
viewModelScope.launch {
98141
getUnivRestaurantUseCase(
@@ -116,6 +159,7 @@ class DetailListViewModel @Inject constructor(
116159
reportCategoryType: ReportCategoryType = viewState.value.reportCategoryType,
117160
rating: Int = viewState.value.rating,
118161
restaurantCategoryType: RestaurantCategoryType = viewState.value.restaurantCategoryType,
162+
isReviewScreen: Boolean = viewState.value.isReviewScreen
119163
) {
120164
updateState {
121165
copy(
@@ -127,6 +171,7 @@ class DetailListViewModel @Inject constructor(
127171
reportCategoryType = reportCategoryType,
128172
rating = rating,
129173
restaurantCategoryType = restaurantCategoryType,
174+
isReviewScreen = isReviewScreen
130175
)
131176
}
132177
}

presentation/src/main/java/com/everymeal/presentation/ui/home/HomeContract.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ enum class DetailListScreenType {
3434
RESTAURANT,
3535
CAFE,
3636
DRINK,
37+
REVIEW
3738
}
3839

3940
fun String.DetailListScreenType(): DetailListScreenType {
@@ -42,6 +43,7 @@ fun String.DetailListScreenType(): DetailListScreenType {
4243
"밥집" -> DetailListScreenType.RESTAURANT
4344
"카페" -> DetailListScreenType.CAFE
4445
"술집" -> DetailListScreenType.DRINK
46+
"리뷰" -> DetailListScreenType.REVIEW
4547
else -> DetailListScreenType.RECOMMEND
4648
}
4749
}
@@ -52,5 +54,6 @@ fun DetailListScreenType.title(): String {
5254
DetailListScreenType.RESTAURANT -> "밥집"
5355
DetailListScreenType.CAFE -> "카페"
5456
DetailListScreenType.DRINK -> "술집"
57+
DetailListScreenType.REVIEW -> "리뷰"
5558
}
5659
}

presentation/src/main/java/com/everymeal/presentation/ui/home/HomeScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ fun HomeScreen(
196196
EveryMealLineButton(
197197
text = stringResource(R.string.home_restaurant_review_button_text),
198198
onClick = {
199-
199+
homeViewModel.setEvent(HomeContract.HomeEvent.OnClickDetailList("리뷰".DetailListScreenType()))
200200
},
201201
)
202202
}

0 commit comments

Comments
 (0)