@@ -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