Skip to content

Commit 1adc672

Browse files
committed
DailyRestaurantViewModel.getFilteredMenuGroups 로직 수정
1 parent ba52d19 commit 1adc672

File tree

2 files changed

+59
-46
lines changed

2 files changed

+59
-46
lines changed

app/src/main/java/com/wafflestudio/siksha2/ui/main/restaurant/DailyRestaurantFragment.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -357,10 +357,6 @@ class DailyRestaurantFragment : Fragment() {
357357
binding.dateBefore.setOnClickListener { vm.addDateOffset(-1L) }
358358
binding.dateAfter.setOnClickListener { vm.addDateOffset(1L) }
359359

360-
parentFragmentManager.setFragmentResultListener("FilterDialog", this) { _, _ ->
361-
getFilteredMenuGroups()
362-
}
363-
364360
if (featureChecker.isFeatureEnabled("filterFeatureEnabled")) {
365361
binding.filterLayout.visibility = View.VISIBLE
366362
setUpFilterOptions()
@@ -452,12 +448,10 @@ class DailyRestaurantFragment : Fragment() {
452448

453449
binding.filterOpen.setOnClickListener {
454450
vm.toggleOpenFilter()
455-
getFilteredMenuGroups()
456451
}
457452

458453
binding.filterReview.setOnClickListener {
459454
vm.toggleReviewFilter()
460-
getFilteredMenuGroups()
461455
}
462456

463457
binding.filterRating.setOnClickListener {
@@ -489,7 +483,6 @@ class DailyRestaurantFragment : Fragment() {
489483
checked = vm.showFestival.collectAsState(),
490484
onClick = {
491485
vm.toggleFestival()
492-
getFilteredMenuGroups()
493486
}
494487
)
495488
}

app/src/main/java/com/wafflestudio/siksha2/ui/main/restaurant/DailyRestaurantViewModel.kt

Lines changed: 59 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -203,25 +203,35 @@ class DailyRestaurantViewModel @Inject constructor(
203203
}
204204

205205
fun getFilteredMenuGroups(showOnlyFavorite: Boolean): Flow<List<MenuGroup>> {
206-
val menuBase = _dateFilter.asFlow()
206+
// 기본 메뉴 로직
207+
return _dateFilter.asFlow()
207208
.flatMapLatest {
208209
menuRepository.getDailyMenuFlow(it)
209210
}
210-
.combine(_mealsOfDayFilter.asFlow()) { dailyMenuGroups, mealsOfDay ->
211-
if (dailyMenuGroups == null) {
211+
.combine(_mealsOfDayFilter.asFlow()) { menuGroups, mealsOfDay ->
212+
if (menuGroups == null) {
212213
emptyList()
213214
} else {
214215
when (mealsOfDay!!) {
215-
MealsOfDay.BR -> dailyMenuGroups.data.breakfast
216-
MealsOfDay.LU -> dailyMenuGroups.data.lunch
217-
MealsOfDay.DN -> dailyMenuGroups.data.dinner
216+
MealsOfDay.BR -> menuGroups.data.breakfast
217+
MealsOfDay.LU -> menuGroups.data.lunch
218+
MealsOfDay.DN -> menuGroups.data.dinner
218219
}
219220
}
221+
}.map { it.filter { item -> item.isFavorite || showOnlyFavorite.not() } }
222+
// 축제 적용
223+
.combine(showFestival) { menuGroups, showFestivalFlag ->
224+
menuGroups.filter { menuGroup ->
225+
menuGroup.nameKr!!.startsWith("[축제]") == showFestivalFlag
226+
}
220227
}
221-
.combine(allRestaurant) { menuGroups, allRes ->
228+
// 필터 적용
229+
.combine(menuFilterCondition) { menuGroups, filterConditions -> Pair(menuGroups, filterConditions) }
230+
.combine(allRestaurant) { (menuGroups, filterCondition), allRes ->
222231
val dateTime = LocalDateTime.now()
223232
val date = dateTime.toLocalDate()
224233
val time = dateTime.toLocalTime()
234+
225235
menuGroups.map { menuGroup ->
226236
menuGroup.copy(
227237
isFavorite = allRes.find { menuGroup.id == it.id }?.isFavorite ?: false
@@ -245,34 +255,40 @@ class DailyRestaurantViewModel @Inject constructor(
245255
)
246256
}
247257
}
248-
.map { it.filter { item -> item.isFavorite || showOnlyFavorite.not() } }
249-
.combine(if (showOnlyFavorite) favoriteRestaurantOrder else restaurantOrder) { menuGroups, (order) ->
250-
val result = mutableListOf<MenuGroup>()
251-
val sortedMenuGroups = menuGroups.sortedByDescending { it.id }
252-
order.forEach {
253-
sortedMenuGroups.find { item -> item.id == it }?.also { result.add(it) }
258+
// 영업중 필터
259+
.combine(allRestaurant) { menuGroups, allRes ->
260+
val dateTime = LocalDateTime.now()
261+
val date = dateTime.toLocalDate()
262+
val time = dateTime.toLocalTime()
263+
menuGroups.map { menuGroup ->
264+
menuGroup.copy(
265+
isFavorite = allRes.find { menuGroup.id == it.id }?.isFavorite ?: false
266+
)
267+
}.filter { menuGroup ->
268+
val restaurantInfo = allRes.find { menuGroup.id == it.id }
269+
val operatingHour = restaurantInfo?.etc?.operatingHours?.let {
270+
when (date.dayOfWeek) {
271+
DayOfWeek.SATURDAY -> it.saturday
272+
DayOfWeek.SUNDAY -> it.holiday
273+
else -> it.weekdays
274+
}
275+
}
276+
!_menuFilterCondition.value.isOpen ||
277+
(
278+
!operatingHour.isNullOrEmpty() &&
279+
operatingHour.any { interval ->
280+
val (start, end) = interval.split("-").map { LocalTime.parse(it) }
281+
time in start..end
282+
}
283+
)
254284
}
255-
result.addAll(sortedMenuGroups.filterNot { item -> item.id in order })
256-
result
257-
}
258-
val menuFestivalApplied = menuBase.map {
259-
it.filter { item ->
260-
item.nameKr!!.startsWith("[축제]") == showFestival.value
261-
}
262-
}
263-
val menuFilterApplied = if (featureChecker.isFeatureEnabled("filterFeatureEnabled")) {
264-
menuFestivalApplied
265-
// 사용자 필터
266-
.map { menuGroupList ->
267-
menuGroupList.filter { item ->
285+
.filter { item ->
268286
_menuFilterCondition.value.distance == default.distance ||
269287
getDistance(item)?.let {
270288
it <= _menuFilterCondition.value.distance
271289
} ?: true
272290
}
273-
}
274-
.map { menuGroupList ->
275-
menuGroupList.map { restaurant ->
291+
.map { restaurant ->
276292
val newRestaurant = restaurant.copy(
277293
menus = restaurant.menus.filter { menu ->
278294
menu.price?.let { menuPrice ->
@@ -295,9 +311,7 @@ class DailyRestaurantViewModel @Inject constructor(
295311
)
296312
newRestaurant
297313
}
298-
}
299-
.map { menuGroupList ->
300-
menuGroupList.map { restaurant ->
314+
.map { restaurant ->
301315
val newRestaurant = restaurant.copy(
302316
menus = restaurant.menus.filter { menu ->
303317
_menuFilterCondition.value.categories.let { selectedCategories ->
@@ -307,14 +321,20 @@ class DailyRestaurantViewModel @Inject constructor(
307321
)
308322
newRestaurant
309323
}
324+
}
325+
// 식당 순서, 표시 여부 조정
326+
.combine(if (showOnlyFavorite) favoriteRestaurantOrder else restaurantOrder) { menuGroups, (order) ->
327+
val result = mutableListOf<MenuGroup>()
328+
val sortedMenuGroups = menuGroups.sortedByDescending { it.id }
329+
order.forEach {
330+
sortedMenuGroups.find { item -> item.id == it }?.also { result.add(it) }
310331
}
311-
.combine(showEmptyRestaurant) { menuGroups, showEmpty ->
312-
menuGroups.filter { it.menus.isNotEmpty() || showEmpty }
313-
}
314-
} else {
315-
menuFestivalApplied
316-
}
317-
return menuFilterApplied
332+
result.addAll(sortedMenuGroups.filterNot { item -> item.id in order })
333+
result
334+
}
335+
.combine(showEmptyRestaurant) { menuGroups, showEmpty ->
336+
menuGroups.filter { it.menus.isNotEmpty() || showEmpty }
337+
}
318338
}
319339

320340
suspend fun getRestaurantInfo(id: Long): RestaurantInfo? {

0 commit comments

Comments
 (0)