From 63c5f3418d7fb23447c8c8182034938bbf5f4788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=9E=AC=EC=B0=AC?= Date: Tue, 1 Sep 2026 00:39:32 +0900 Subject: [PATCH] =?UTF-8?q?[Fix]=20=ED=95=99=EC=8B=9D=20=EB=AF=B8=EC=9A=B4?= =?UTF-8?q?=EC=98=81=20=EC=8B=9D=EB=8B=B9=20=EB=B9=88=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cafeteria/menu/MenuAdapter.kt | 13 ++++++- .../cafeteria/menu/MenuFragment.kt | 19 ++-------- .../cafeteria/menu/MenuSectionBuilder.kt | 21 +++++++++++ .../res/layout/item_cafeteria_section.xml | 14 ++++++- app/src/main/res/values-en/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../menu/MenuSectionBuilderBehaviorSpec.kt | 37 +++++++++++++++++++ language.csv | 4 ++ 10 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilder.kt create mode 100644 app/src/test/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilderBehaviorSpec.kt diff --git a/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuAdapter.kt b/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuAdapter.kt index 651a44cdb..e2724c719 100644 --- a/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuAdapter.kt +++ b/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuAdapter.kt @@ -3,6 +3,7 @@ package com.eatssu.android.presentation.cafeteria.menu import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.LinearLayoutManager @@ -45,11 +46,19 @@ class MenuAdapter( binding.tvCafeteriaLocation.text = binding.root.context.getString(sectionModel.cafeteria.locationResId) + val menuList = sectionModel.menuList.orEmpty() + val hasMenu = menuList.isNotEmpty() + + binding.rvMenu.isVisible = hasMenu + binding.tvClosedMessage.isVisible = !hasMenu + binding.rvMenu.apply { setHasFixedSize(true) layoutManager = LinearLayoutManager(binding.root.context) - adapter = sectionModel.menuList?.let { - MenuSubAdapter(it, sectionModel.cafeteria, analyticsTracker) + adapter = if (hasMenu) { + MenuSubAdapter(menuList, sectionModel.cafeteria, analyticsTracker) + } else { + null } } } diff --git a/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuFragment.kt b/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuFragment.kt index eda4c9eb6..125f78505 100644 --- a/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuFragment.kt +++ b/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuFragment.kt @@ -94,22 +94,9 @@ class MenuFragment : Fragment() { val menuMap = state.data.menuMap Timber.d("Menu map received: $menuMap") - val sectionList = buildList { - menuMap - .filter { (_, menuList) -> menuList.isNotEmpty() } - .forEach { (restaurant, menuList) -> - val location = - infoViewModel.getRestaurantInfo(restaurant)?.location ?: "" - add( - Section( - restaurant.menuType, - restaurant, - menuList, - location - ) - ) - } - }.sortedBy { it.cafeteria.ordinal } + val sectionList = buildMenuSections(menuMap) { restaurant -> + infoViewModel.getRestaurantInfo(restaurant)?.location.orEmpty() + } setupRecyclerView(sectionList) } diff --git a/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilder.kt b/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilder.kt new file mode 100644 index 000000000..9a1eea475 --- /dev/null +++ b/app/src/main/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilder.kt @@ -0,0 +1,21 @@ +package com.eatssu.android.presentation.cafeteria.menu + +import com.eatssu.android.domain.model.Menu +import com.eatssu.android.domain.model.Section +import com.eatssu.common.enums.Restaurant + +internal suspend fun buildMenuSections( + menuMap: Map>, + locationProvider: suspend (Restaurant) -> String, +): List
= buildList { + for ((restaurant, menuList) in menuMap) { + add( + Section( + menuType = restaurant.menuType, + cafeteria = restaurant, + menuList = menuList, + cafeteriaLocation = locationProvider(restaurant), + ) + ) + } +}.sortedBy { it.cafeteria.ordinal } diff --git a/app/src/main/res/layout/item_cafeteria_section.xml b/app/src/main/res/layout/item_cafeteria_section.xml index 1bc900e10..cf4950220 100644 --- a/app/src/main/res/layout/item_cafeteria_section.xml +++ b/app/src/main/res/layout/item_cafeteria_section.xml @@ -136,8 +136,20 @@ android:layout_marginTop="11dp" android:layout_marginBottom="18dp" tools:listitem="@layout/item_menu" /> + + - \ No newline at end of file + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 1b38e1f92..c4661465e 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -188,6 +188,7 @@ Today\'s Menu + It\'s outside business hours. Price ★ Student Cafeteria diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 205ff2c9a..2c5a5b5a5 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -188,6 +188,7 @@ 今日のメニュー + 営業時間外です。 価格 ★ 学生食堂 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 8ec618781..5a5715425 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -188,6 +188,7 @@ Thực đơn hôm nay + Hiện đang ngoài giờ phục vụ. Giá ★ Nhà ăn sinh viên diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60f4b5627..51711eafd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -185,6 +185,7 @@ 오늘의 메뉴 + 영업 시간이 아니에요. 가격 평점 학생식당 diff --git a/app/src/test/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilderBehaviorSpec.kt b/app/src/test/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilderBehaviorSpec.kt new file mode 100644 index 000000000..4350e7670 --- /dev/null +++ b/app/src/test/java/com/eatssu/android/presentation/cafeteria/menu/MenuSectionBuilderBehaviorSpec.kt @@ -0,0 +1,37 @@ +package com.eatssu.android.presentation.cafeteria.menu + +import com.eatssu.android.domain.model.Menu +import com.eatssu.android.test.AppBehaviorSpec +import com.eatssu.common.enums.Restaurant +import io.kotest.matchers.shouldBe +import kotlinx.coroutines.test.runTest + +class MenuSectionBuilderBehaviorSpec : AppBehaviorSpec({ + + given("식당별 메뉴 섹션 구성") { + `when`("메뉴가 비어 있는 식당이 포함되면") { + val menu = Menu(id = 1, name = "오늘의 메뉴", price = 5_000, rate = 4.0) + val menuMap = linkedMapOf( + Restaurant.DODAM to emptyList(), + Restaurant.HAKSIK to listOf(menu), + ) + + then("빈 식당을 제거하지 않고 식당 순서대로 구성한다") { + runTest { + val sections = buildMenuSections(menuMap) { restaurant -> + "${restaurant.name} 위치" + } + + sections.map { it.cafeteria } shouldBe listOf( + Restaurant.HAKSIK, + Restaurant.DODAM, + ) + sections.first { it.cafeteria == Restaurant.HAKSIK }.menuList shouldBe listOf(menu) + sections.first { it.cafeteria == Restaurant.DODAM }.menuList shouldBe emptyList() + sections.first { it.cafeteria == Restaurant.DODAM }.cafeteriaLocation shouldBe + "DODAM 위치" + } + } + } + } +}) diff --git a/language.csv b/language.csv index 6895fb6cb..ac9f82a33 100644 --- a/language.csv +++ b/language.csv @@ -98,6 +98,7 @@ none_review_my,첫 리뷰를 남겨 주세요!,Be the first to leave a review!, none_review_list_detail,메뉴에 가장 먼저 리뷰를 남겨주세요!,Be the first to review this menu item!,このメニューに最初のレビューを残しましょう!,Hãy là người đầu tiên đánh giá món này! rate_n,%1$d점,%1$d pts,%1$d点,%1$d điểm today_menu,오늘의 메뉴,Today's Menu,今日のメニュー,Thực đơn hôm nay +cafeteria_outside_business_hours,영업 시간이 아니에요.,It's outside business hours.,営業時間外です。,Hiện đang ngoài giờ phục vụ. price,가격,Price,価格,Giá rate,평점,★,★,★ student_cafeteria,학생식당,Student Cafeteria,学生食堂,Nhà ăn sinh viên @@ -163,6 +164,9 @@ time,영업 시간,Hours,営業時間,Giờ mở cửa favorite_partnership,찜한 제휴,Favorite Partners,お気に入りの提携,Ưu đãi yêu thích partnership_filter_mine,내 제휴,My Partners,自分の提携,Ưu đãi của tôi partnership_filter_all,전체,All,すべて,Tất cả +partnership_filter_restaurant,음식점,Restaurant,レストラン,Nhà hàng +partnership_filter_cafe,카페,Cafe,カフェ,Quán cà phê +partnership_filter_pub,주점,Pub,居酒屋,Quán rượu partnership_filter_department_placeholder,학과,Department,学科,Ngành/Khoa policy_url,https://github.com/EAT-SSU/Docs/wiki/EAT%E2%80%90SSU-%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8,,, terms_url,https://github.com/EAT-SSU/Docs/wiki/EAT%E2%80%90SSU-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%9D%B4%EC%9A%A9%EC%95%BD%EA%B4%80,,,