From bd83a7e731a2751179370784c49066e46175d905 Mon Sep 17 00:00:00 2001 From: nyunn2 Date: Thu, 21 Aug 2025 17:49:04 +0900 Subject: [PATCH 01/24] =?UTF-8?q?=EB=82=B4=EA=B0=80=20=EC=B0=9C=ED=95=9C?= =?UTF-8?q?=20=EB=A9=94=EB=89=B4=20=EB=82=B4=EB=B9=84=EA=B2=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/setting/SettingFragment.kt | 6 ++ .../favoriteMenu/FavoriteMenuFragment.kt | 28 +++++++ .../res/layout/fragment_favorite_menu.xml | 81 +++++++++++++++++++ app/src/main/res/layout/fragment_setting.xml | 17 +++- app/src/main/res/navigation/nav_setting.xml | 9 +++ 5 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt create mode 100644 app/src/main/res/layout/fragment_favorite_menu.xml diff --git a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt index cc58b3782..143e7c79e 100644 --- a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt +++ b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt @@ -70,6 +70,12 @@ class SettingFragment : Fragment() { findNavController().navigate(action) } + binding.myFavoriteMenuRow.setOnClickListener { + val action = + SettingFragmentDirections.actionSettingFragmentToFavoriteMenuFragment() + findNavController().navigate(action) + } + binding.orderRestaurantRow.setOnClickListener { val action = MainFragmentDirections.actionMainFragmentToReorderRestaurantFragment() diff --git a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt new file mode 100644 index 000000000..e2ac6dbba --- /dev/null +++ b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt @@ -0,0 +1,28 @@ +package com.wafflestudio.siksha2.ui.main.setting.favoriteMenu + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.wafflestudio.siksha2.databinding.FragmentFavoriteMenuBinding + +class FavoriteMenuFragment : Fragment() { + + private lateinit var binding: FragmentFavoriteMenuBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentFavoriteMenuBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + } +} diff --git a/app/src/main/res/layout/fragment_favorite_menu.xml b/app/src/main/res/layout/fragment_favorite_menu.xml new file mode 100644 index 000000000..9921466a8 --- /dev/null +++ b/app/src/main/res/layout/fragment_favorite_menu.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index 02b243488..3a8916b7e 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -61,7 +61,7 @@ android:layout_marginHorizontal="16dp" android:layout_marginTop="20dp" android:background="@drawable/frame_setting_layout" - android:orientation="horizontal" + android:orientation="vertical" android:layout_gravity="center"> + + + + + + + \ No newline at end of file From b4e45bef611010241e908d83c3eb209a794996a7 Mon Sep 17 00:00:00 2001 From: nyunn2 Date: Sat, 23 Aug 2025 20:21:14 +0900 Subject: [PATCH 02/24] =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EB=B0=9B=EC=9D=84?= =?UTF-8?q?=20=EB=A9=94=EB=89=B4=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable/selector_checkbox.xml | 9 +++ app/src/main/res/layout/item_notify_menu.xml | 52 ++++++++++++ .../res/layout/item_notify_menu_group.xml | 79 +++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 app/src/main/res/drawable/selector_checkbox.xml create mode 100644 app/src/main/res/layout/item_notify_menu.xml create mode 100644 app/src/main/res/layout/item_notify_menu_group.xml diff --git a/app/src/main/res/drawable/selector_checkbox.xml b/app/src/main/res/drawable/selector_checkbox.xml new file mode 100644 index 000000000..48b523af7 --- /dev/null +++ b/app/src/main/res/drawable/selector_checkbox.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/layout/item_notify_menu.xml b/app/src/main/res/layout/item_notify_menu.xml new file mode 100644 index 000000000..92a45ace4 --- /dev/null +++ b/app/src/main/res/layout/item_notify_menu.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_notify_menu_group.xml b/app/src/main/res/layout/item_notify_menu_group.xml new file mode 100644 index 000000000..53a03af7d --- /dev/null +++ b/app/src/main/res/layout/item_notify_menu_group.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From c377b732448ec6bcd0b7347c317d4e283d89afc7 Mon Sep 17 00:00:00 2001 From: nyunn2 Date: Wed, 10 Sep 2025 16:43:20 +0900 Subject: [PATCH 03/24] =?UTF-8?q?=EB=82=B4=EA=B0=80=20=EC=B0=9C=ED=95=9C?= =?UTF-8?q?=20=EB=A9=94=EB=89=B4=20api=20=EC=97=B0=EA=B2=B0=20(=EC=9E=91?= =?UTF-8?q?=EB=8F=99=20X)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wafflestudio/siksha2/network/SikshaApi.kt | 5 + .../network/dto/GetFavoriteMenuResponse.kt | 36 ++++++ .../repositories/FavoriteMenuRepository.kt | 16 +++ .../ui/main/setting/SettingFragment.kt | 2 +- .../favoriteMenu/FavoriteMenuFragment.kt | 87 ++++++++++++- .../favoriteMenu/FavoriteMenuViewModel.kt | 39 ++++++ .../favoriteMenu/NotifyMenuFragment.kt | 4 + .../main/res/layout/fragment_notify_menu.xml | 116 ++++++++++++++++++ app/src/main/res/navigation/nav_graph.xml | 13 ++ 9 files changed, 316 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/wafflestudio/siksha2/network/dto/GetFavoriteMenuResponse.kt create mode 100644 app/src/main/java/com/wafflestudio/siksha2/repositories/FavoriteMenuRepository.kt create mode 100644 app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuViewModel.kt create mode 100644 app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/NotifyMenuFragment.kt create mode 100644 app/src/main/res/layout/fragment_notify_menu.xml diff --git a/app/src/main/java/com/wafflestudio/siksha2/network/SikshaApi.kt b/app/src/main/java/com/wafflestudio/siksha2/network/SikshaApi.kt index 0badea7c1..969a94085 100644 --- a/app/src/main/java/com/wafflestudio/siksha2/network/SikshaApi.kt +++ b/app/src/main/java/com/wafflestudio/siksha2/network/SikshaApi.kt @@ -43,6 +43,11 @@ interface SikshaApi { @GET("/restaurants/") suspend fun fetchRestaurants(): NetworkResult + @GET("/menus/me") + suspend fun getFavoriteMenus( + @Header("authorization-token") token: String + ): NetworkResult + @POST("/reviews/") suspend fun leaveMenuReview(@Body req: LeaveReviewParam): NetworkResult diff --git a/app/src/main/java/com/wafflestudio/siksha2/network/dto/GetFavoriteMenuResponse.kt b/app/src/main/java/com/wafflestudio/siksha2/network/dto/GetFavoriteMenuResponse.kt new file mode 100644 index 000000000..e8e00b9c4 --- /dev/null +++ b/app/src/main/java/com/wafflestudio/siksha2/network/dto/GetFavoriteMenuResponse.kt @@ -0,0 +1,36 @@ +package com.wafflestudio.siksha2.network.dto + +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class GetFavoriteMenusResponse( + val count: Int, + val result: List +) + +@JsonClass(generateAdapter = true) +data class FavoriteRestaurantDto( + val id: Long, + val code: String?, + val name_kr: String, + val name_en: String?, + val addr: String?, + val lat: Double?, + val lng: Double?, + val menus: List +) + +@JsonClass(generateAdapter = true) +data class FavoriteMenuDto( + val id: Long, + val code: String?, + val name_kr: String, + val name_en: String?, + val price: Int?, + val etc: List?, + val score: Int?, + val review_cnt: Int?, + val like_cnt: Int?, + val is_liked: Boolean, + val alarm: Boolean? = null +) diff --git a/app/src/main/java/com/wafflestudio/siksha2/repositories/FavoriteMenuRepository.kt b/app/src/main/java/com/wafflestudio/siksha2/repositories/FavoriteMenuRepository.kt new file mode 100644 index 000000000..e37b967bd --- /dev/null +++ b/app/src/main/java/com/wafflestudio/siksha2/repositories/FavoriteMenuRepository.kt @@ -0,0 +1,16 @@ +package com.wafflestudio.siksha2.repositories + +import com.wafflestudio.siksha2.network.SikshaApi +import com.wafflestudio.siksha2.network.dto.GetFavoriteMenusResponse +import com.wafflestudio.siksha2.network.result.NetworkResult +import javax.inject.Inject + +class FavoriteMenuRepository @Inject constructor( + private val api: SikshaApi +) { + suspend fun getFavoriteMenus(token: String): NetworkResult { + return api.getFavoriteMenus(token) + } +} + + diff --git a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt index 143e7c79e..c298c2ad5 100644 --- a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt +++ b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/SettingFragment.kt @@ -72,7 +72,7 @@ class SettingFragment : Fragment() { binding.myFavoriteMenuRow.setOnClickListener { val action = - SettingFragmentDirections.actionSettingFragmentToFavoriteMenuFragment() + MainFragmentDirections.actionMainFragmentToFavoriteMenuFragment() findNavController().navigate(action) } diff --git a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt index e2ac6dbba..a6e88924f 100644 --- a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt +++ b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuFragment.kt @@ -4,13 +4,36 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.unit.dp import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import com.wafflestudio.siksha2.databinding.FragmentFavoriteMenuBinding +import com.wafflestudio.siksha2.ui.SikshaTheme +import dagger.hilt.android.AndroidEntryPoint +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.Divider +import androidx.compose.material.Text +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.wafflestudio.siksha2.preferences.SikshaPrefObjects +import javax.inject.Inject -class FavoriteMenuFragment : Fragment() { +@AndroidEntryPoint +class FavoriteMenuFragment : Fragment() { private lateinit var binding: FragmentFavoriteMenuBinding + private val vm: FavoriteMenuViewModel by viewModels() + @Inject + lateinit var sikshaPrefObjects: SikshaPrefObjects override fun onCreateView( inflater: LayoutInflater, @@ -24,5 +47,67 @@ class FavoriteMenuFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val token = sikshaPrefObjects.accessToken.getValue() + + vm.loadFavoriteMenus(token) + + binding.menuGroupList.setContent { + SikshaTheme { + val restaurants by vm.restaurants.collectAsState() + + if (restaurants.isEmpty()) { + binding.emptyText.visibility = View.VISIBLE + } else { + binding.emptyText.visibility = View.GONE + + LazyColumn( + modifier = Modifier.fillMaxSize(), + contentPadding = PaddingValues(vertical = 8.dp) + ) { + items(restaurants) { restaurant -> + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 8.dp) + ) { + // 식당명 + Text( + text = restaurant.name_kr, + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + modifier = Modifier.padding(bottom = 4.dp) + ) + + // 메뉴 리스트 + restaurant.menus.forEach { menu -> + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 2.dp) + ) { + Text( + text = menu.name_kr, + fontSize = 15.sp, + modifier = Modifier.weight(1f) + ) + Text( + text = "${menu.price ?: 0}원", + fontSize = 14.sp + ) + } + } + Divider(modifier = Modifier.padding(top = 8.dp)) + } + } + } + } + } + } + + // 뒤로가기 버튼 + binding.backButton.setOnClickListener { + findNavController().popBackStack() + } } } + diff --git a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuViewModel.kt b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuViewModel.kt new file mode 100644 index 000000000..253ad14d9 --- /dev/null +++ b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/FavoriteMenuViewModel.kt @@ -0,0 +1,39 @@ +package com.wafflestudio.siksha2.ui.main.setting.favoriteMenu + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.wafflestudio.siksha2.repositories.FavoriteMenuRepository +import com.wafflestudio.siksha2.network.dto.FavoriteRestaurantDto +import com.wafflestudio.siksha2.network.result.NetworkResult +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class FavoriteMenuViewModel @Inject constructor( + private val repository: FavoriteMenuRepository +) : ViewModel() { + + private val _restaurants = MutableStateFlow>(emptyList()) + val restaurants: StateFlow> = _restaurants + + private val _isLoading = MutableStateFlow(false) + val isLoading: StateFlow = _isLoading + + fun loadFavoriteMenus(token: String) { + viewModelScope.launch { + _isLoading.value = true + when (val result = repository.getFavoriteMenus(token)) { + is NetworkResult.Success -> { + _restaurants.value = result.body.result + } + else -> { + _restaurants.value = emptyList() + } + } + _isLoading.value = false + } + } +} diff --git a/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/NotifyMenuFragment.kt b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/NotifyMenuFragment.kt new file mode 100644 index 000000000..81eda5bd7 --- /dev/null +++ b/app/src/main/java/com/wafflestudio/siksha2/ui/main/setting/favoriteMenu/NotifyMenuFragment.kt @@ -0,0 +1,4 @@ +package com.wafflestudio.siksha2.ui.main.setting.favoriteMenu + +class NotifyMenuFragment { +} diff --git a/app/src/main/res/layout/fragment_notify_menu.xml b/app/src/main/res/layout/fragment_notify_menu.xml new file mode 100644 index 000000000..a7c7b0068 --- /dev/null +++ b/app/src/main/res/layout/fragment_notify_menu.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + +