diff --git a/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSource.kt b/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSource.kt index e12a32de..b79633fa 100644 --- a/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSource.kt +++ b/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSource.kt @@ -8,8 +8,10 @@ import org.gdsc.domain.FoodCategory import org.gdsc.domain.SortType import org.gdsc.domain.model.Location import org.gdsc.domain.model.RestaurantLocationInfo +import org.gdsc.domain.model.request.ModifyRestaurantInfoRequest import org.gdsc.domain.model.request.RestaurantRegistrationRequest import org.gdsc.domain.model.request.RestaurantSearchMapRequest +import org.gdsc.domain.model.response.RestaurantInfoResponse interface RestaurantDataSource { @@ -18,6 +20,8 @@ interface RestaurantDataSource { longitude: String, page: Int ): List + suspend fun getRecommendRestaurantInfo(recommendRestaurantId: Int): RestaurantInfoResponse + suspend fun checkRestaurantRegistration(kakaoSubId: String): Boolean suspend fun postRestaurantLocationInfo(restaurantLocationInfo: RestaurantLocationInfo): String @@ -27,4 +31,7 @@ interface RestaurantDataSource { suspend fun getRestaurants( userId: Int, locationData: Location, sortType: SortType, foodCategory: FoodCategory, drinkPossibility: DrinkPossibility ): Flow> + + suspend fun putRestaurantInfo(putRestaurantInfoRequest: ModifyRestaurantInfoRequest): String + } \ No newline at end of file diff --git a/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSourceImpl.kt b/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSourceImpl.kt index 3c20e0f9..4b88ae78 100644 --- a/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSourceImpl.kt +++ b/data/src/main/java/org/gdsc/data/datasource/RestaurantDataSourceImpl.kt @@ -18,8 +18,10 @@ import org.gdsc.domain.SortType import org.gdsc.domain.model.Filter import org.gdsc.domain.model.Location import org.gdsc.domain.model.RestaurantLocationInfo +import org.gdsc.domain.model.request.ModifyRestaurantInfoRequest import org.gdsc.domain.model.request.RestaurantRegistrationRequest import org.gdsc.domain.model.request.RestaurantSearchMapRequest +import org.gdsc.domain.model.response.RestaurantInfoResponse import retrofit2.HttpException import javax.inject.Inject @@ -38,6 +40,10 @@ class RestaurantDataSourceImpl @Inject constructor( return restaurantAPI.getRestaurantLocationInfo(query, latitude, longitude, page).data } + override suspend fun getRecommendRestaurantInfo(recommendRestaurantId: Int): RestaurantInfoResponse { + return restaurantAPI.getRecommendRestaurantInfo(recommendRestaurantId).data + } + override suspend fun checkRestaurantRegistration(kakaoSubId: String): Boolean { runCatching { restaurantAPI.checkRestaurantRegistration(kakaoSubId) @@ -127,4 +133,11 @@ class RestaurantDataSourceImpl @Inject constructor( }.flow } +} + + override suspend fun putRestaurantInfo(putRestaurantInfoRequest: ModifyRestaurantInfoRequest): String { + return restaurantAPI.putRestaurantInfo(putRestaurantInfoRequest).data + } + + } diff --git a/data/src/main/java/org/gdsc/data/network/RestaurantAPI.kt b/data/src/main/java/org/gdsc/data/network/RestaurantAPI.kt index 97321106..394acbc0 100644 --- a/data/src/main/java/org/gdsc/data/network/RestaurantAPI.kt +++ b/data/src/main/java/org/gdsc/data/network/RestaurantAPI.kt @@ -6,11 +6,14 @@ import org.gdsc.data.database.RegisteredRestaurantPaging import org.gdsc.data.model.Response import org.gdsc.domain.model.RestaurantLocationInfo import org.gdsc.domain.model.request.RestaurantSearchMapRequest +import org.gdsc.domain.model.request.ModifyRestaurantInfoRequest +import org.gdsc.domain.model.response.RestaurantInfoResponse import org.gdsc.domain.model.response.RestaurantRegistrationResponse import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.Multipart import retrofit2.http.POST +import retrofit2.http.PUT import retrofit2.http.Part import retrofit2.http.PartMap import retrofit2.http.Path @@ -26,6 +29,11 @@ interface RestaurantAPI { @Query("page") page: Int, ): Response> + @GET("api/v1/restaurant/{recommendRestaurantId}") + suspend fun getRecommendRestaurantInfo( + @Path("recommendRestaurantId") recommendRestaurantId: Int, + ): Response + @GET("api/v1/restaurant/registration/{kakaoSubId}") suspend fun checkRestaurantRegistration( @Path("kakaoSubId") kakaoSubId: String, @@ -51,4 +59,10 @@ interface RestaurantAPI { @Query("sort") sort: String? = null, @Body restaurantSearchMapRequest: RestaurantSearchMapRequest, ): Response + + @PUT("api/v1/restaurant") + suspend fun putRestaurantInfo( + @Body putRestaurantInfoRequest: ModifyRestaurantInfoRequest, + ): Response + } \ No newline at end of file diff --git a/data/src/main/java/org/gdsc/data/repository/RestaurantRepositoryImpl.kt b/data/src/main/java/org/gdsc/data/repository/RestaurantRepositoryImpl.kt index 6bb305ae..3e1a8c48 100644 --- a/data/src/main/java/org/gdsc/data/repository/RestaurantRepositoryImpl.kt +++ b/data/src/main/java/org/gdsc/data/repository/RestaurantRepositoryImpl.kt @@ -11,8 +11,10 @@ import org.gdsc.domain.SortType import org.gdsc.domain.model.Location import org.gdsc.domain.model.RegisteredRestaurant import org.gdsc.domain.model.RestaurantLocationInfo +import org.gdsc.domain.model.request.ModifyRestaurantInfoRequest import org.gdsc.domain.model.request.RestaurantRegistrationRequest import org.gdsc.domain.model.request.RestaurantSearchMapRequest +import org.gdsc.domain.model.response.RestaurantInfoResponse import org.gdsc.domain.repository.RestaurantRepository import javax.inject.Inject @@ -26,6 +28,10 @@ class RestaurantRepositoryImpl @Inject constructor( return restaurantDataSource.getRestaurantLocationInfo(query, latitude, longitude, page) } + override suspend fun getRecommendRestaurantInfo(recommendRestaurantId: Int): RestaurantInfoResponse { + return restaurantDataSource.getRecommendRestaurantInfo(recommendRestaurantId) + } + override suspend fun checkRestaurantRegistration(kakaoSubId: String): Boolean { return restaurantDataSource.checkRestaurantRegistration(kakaoSubId) } @@ -65,5 +71,9 @@ class RestaurantRepositoryImpl @Inject constructor( } pagingTemp } + + override suspend fun putRestaurantInfo(putRestaurantInfoRequest: ModifyRestaurantInfoRequest): String { + return restaurantDataSource.putRestaurantInfo(putRestaurantInfoRequest) + } } \ No newline at end of file diff --git a/domain/src/main/java/org/gdsc/domain/FoodCategory.kt b/domain/src/main/java/org/gdsc/domain/FoodCategory.kt index b418a4a6..0af8b1a7 100644 --- a/domain/src/main/java/org/gdsc/domain/FoodCategory.kt +++ b/domain/src/main/java/org/gdsc/domain/FoodCategory.kt @@ -25,5 +25,6 @@ enum class FoodCategory(val id: Long, val text: String, val key:String) { val ALL = values().toList().dropLast(1) fun fromId(id: Long) = values().first { it.id == id } + fun fromName(name: String) = values().first { it.text == name } } } \ No newline at end of file diff --git a/domain/src/main/java/org/gdsc/domain/model/request/ModifyRestaurantInfoRequest.kt b/domain/src/main/java/org/gdsc/domain/model/request/ModifyRestaurantInfoRequest.kt new file mode 100644 index 00000000..2921b300 --- /dev/null +++ b/domain/src/main/java/org/gdsc/domain/model/request/ModifyRestaurantInfoRequest.kt @@ -0,0 +1,10 @@ +package org.gdsc.domain.model.request + +data class ModifyRestaurantInfoRequest( + val canDrinkLiquor: Boolean, + val categoryId: Int, + val goWellWithLiquor: String, + val id: Int, + val introduce: String, + val recommendMenu: String +) \ No newline at end of file diff --git a/domain/src/main/java/org/gdsc/domain/model/response/RestaurantInfoResponse.kt b/domain/src/main/java/org/gdsc/domain/model/response/RestaurantInfoResponse.kt new file mode 100644 index 00000000..57d49e35 --- /dev/null +++ b/domain/src/main/java/org/gdsc/domain/model/response/RestaurantInfoResponse.kt @@ -0,0 +1,20 @@ +package org.gdsc.domain.model.response + +data class RestaurantInfoResponse( + val address: String, + val canDrinkLiquor: Boolean, + val category: String, + val goWellWithLiquor: String, + val introduce: String, + val name: String, + val phone: String, + val pictures: List, + val placeUrl: String, + val recommendMenu: String, + val roadAddress: String, + val userId: Int, + val userNickName: String, + val userProfileImageUrl: String, + val x: Double, + val y: Double +) \ No newline at end of file diff --git a/domain/src/main/java/org/gdsc/domain/repository/RestaurantRepository.kt b/domain/src/main/java/org/gdsc/domain/repository/RestaurantRepository.kt index bacd7b4d..599c9dc7 100644 --- a/domain/src/main/java/org/gdsc/domain/repository/RestaurantRepository.kt +++ b/domain/src/main/java/org/gdsc/domain/repository/RestaurantRepository.kt @@ -8,8 +8,10 @@ import org.gdsc.domain.SortType import org.gdsc.domain.model.Location import org.gdsc.domain.model.RegisteredRestaurant import org.gdsc.domain.model.RestaurantLocationInfo +import org.gdsc.domain.model.request.ModifyRestaurantInfoRequest import org.gdsc.domain.model.request.RestaurantRegistrationRequest import org.gdsc.domain.model.request.RestaurantSearchMapRequest +import org.gdsc.domain.model.response.RestaurantInfoResponse interface RestaurantRepository { @@ -18,6 +20,8 @@ interface RestaurantRepository { longitude: String, page: Int ): List + suspend fun getRecommendRestaurantInfo(recommendRestaurantId: Int): RestaurantInfoResponse + suspend fun checkRestaurantRegistration(kakaoSubId: String): Boolean suspend fun postRestaurantLocationInfo(restaurantLocationInfo: RestaurantLocationInfo): String @@ -27,4 +31,7 @@ interface RestaurantRepository { suspend fun getRestaurants( userId: Int, locationData: Location, sortType: SortType, foodCategory: FoodCategory, drinkPossibility: DrinkPossibility ): Flow> + + suspend fun putRestaurantInfo(putRestaurantInfoRequest: ModifyRestaurantInfoRequest): String + } \ No newline at end of file diff --git a/domain/src/main/java/org/gdsc/domain/usecase/GetRestaurantInfoUseCase.kt b/domain/src/main/java/org/gdsc/domain/usecase/GetRestaurantInfoUseCase.kt new file mode 100644 index 00000000..0a76a077 --- /dev/null +++ b/domain/src/main/java/org/gdsc/domain/usecase/GetRestaurantInfoUseCase.kt @@ -0,0 +1,14 @@ +package org.gdsc.domain.usecase + +import org.gdsc.domain.model.response.RestaurantInfoResponse +import org.gdsc.domain.repository.RestaurantRepository +import javax.inject.Inject + +class GetRestaurantInfoUseCase @Inject constructor( + private val restaurantRepository: RestaurantRepository +){ + + suspend operator fun invoke(recommendRestaurantId: Int): RestaurantInfoResponse { + return restaurantRepository.getRecommendRestaurantInfo(recommendRestaurantId) + } +} \ No newline at end of file diff --git a/domain/src/main/java/org/gdsc/domain/usecase/PutRestaurantInfoUseCase.kt b/domain/src/main/java/org/gdsc/domain/usecase/PutRestaurantInfoUseCase.kt new file mode 100644 index 00000000..678c971a --- /dev/null +++ b/domain/src/main/java/org/gdsc/domain/usecase/PutRestaurantInfoUseCase.kt @@ -0,0 +1,13 @@ +package org.gdsc.domain.usecase + +import org.gdsc.domain.model.request.ModifyRestaurantInfoRequest +import org.gdsc.domain.repository.RestaurantRepository +import javax.inject.Inject + +class PutRestaurantInfoUseCase @Inject constructor( + private val restaurantRepository: RestaurantRepository +){ + suspend operator fun invoke(putRestaurantInfoRequest: ModifyRestaurantInfoRequest) { + restaurantRepository.putRestaurantInfo(putRestaurantInfoRequest) + } +} \ No newline at end of file diff --git a/presentation/src/main/java/org/gdsc/presentation/model/FoodCategoryItem.kt b/presentation/src/main/java/org/gdsc/presentation/model/FoodCategoryItem.kt index ec22560d..ceb4dc63 100644 --- a/presentation/src/main/java/org/gdsc/presentation/model/FoodCategoryItem.kt +++ b/presentation/src/main/java/org/gdsc/presentation/model/FoodCategoryItem.kt @@ -1,11 +1,27 @@ package org.gdsc.presentation.model +import androidx.annotation.DrawableRes import org.gdsc.domain.FoodCategory +import org.gdsc.presentation.R data class FoodCategoryItem( val categoryItem: FoodCategory, ) { companion object { val INIT = FoodCategoryItem(FoodCategory.INIT) + + } + + @DrawableRes fun getIcon(): Int { + return when(this.categoryItem) { + FoodCategory.KOREAN -> R.drawable.ic_korean + FoodCategory.JAPANESE -> R.drawable.ic_japanese + FoodCategory.CHINESE -> R.drawable.ic_chinese + FoodCategory.WESTERN -> R.drawable.ic_western + FoodCategory.CAFE -> R.drawable.ic_cafe + FoodCategory.BAR -> R.drawable.ic_bar + FoodCategory.ETC -> R.drawable.ic_etc + else -> R.drawable.ic_etc + } } } \ No newline at end of file diff --git a/presentation/src/main/java/org/gdsc/presentation/view/MainActivity.kt b/presentation/src/main/java/org/gdsc/presentation/view/MainActivity.kt index e31eb41f..96458eb1 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/MainActivity.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/MainActivity.kt @@ -27,6 +27,7 @@ import org.gdsc.presentation.utils.slideDown import org.gdsc.presentation.utils.slideUp import org.gdsc.presentation.utils.toPx import org.gdsc.presentation.view.mypage.viewmodel.MyPageViewModel +import org.gdsc.presentation.view.home.HomeFragmentDirections @AndroidEntryPoint class MainActivity : BaseActivity() { @@ -186,6 +187,14 @@ class MainActivity : BaseActivity() { binding.toolBar.isVisible = isVisible } + fun navigateToEditRestaurantInfo(restaurantId: Int) { + + val action = HomeFragmentDirections.actionHomeFragmentToRegisterRestaurantFragment( + targetRestaurantId = restaurantId + ) + navController.navigate(action) + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { navController.popBackStack() diff --git a/presentation/src/main/java/org/gdsc/presentation/view/WebAppInterface.kt b/presentation/src/main/java/org/gdsc/presentation/view/WebAppInterface.kt index 7e91d7c2..626c6a09 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/WebAppInterface.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/WebAppInterface.kt @@ -5,11 +5,28 @@ import android.webkit.JavascriptInterface import android.widget.Toast /** Instantiate the interface and set the context */ -class WebAppInterface(private val mContext: Context) { +class WebAppInterface( + private val mContext: Context, + private val slideUpBottomNavigationView: () -> Unit = {}, + private val slideDownBottomNavigationView: () -> Unit = {}, + private val navigateToRestaurantEdit: (Int) -> Unit = {} +) { /** Show a toast from the web page */ @JavascriptInterface fun showToast(toast: String) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show() } + + @JavascriptInterface + fun navigationEnable(isVisible: Boolean) { + if (isVisible) slideUpBottomNavigationView() + else slideDownBottomNavigationView() + } + + @JavascriptInterface + fun editRestaurantInfo(restaurantId: Int) { + navigateToRestaurantEdit(restaurantId) + } + } \ No newline at end of file diff --git a/presentation/src/main/java/org/gdsc/presentation/view/home/HomeFragment.kt b/presentation/src/main/java/org/gdsc/presentation/view/home/HomeFragment.kt index 79b204b9..84c45f9d 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/home/HomeFragment.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/home/HomeFragment.kt @@ -9,6 +9,8 @@ import android.view.ViewGroup import android.webkit.WebViewClient import dagger.hilt.android.AndroidEntryPoint import org.gdsc.presentation.databinding.FragmentHomeBinding +import org.gdsc.presentation.view.MainActivity +import org.gdsc.presentation.view.WebAppInterface @AndroidEntryPoint class HomeFragment : Fragment() { @@ -28,11 +30,27 @@ class HomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val parentActivity = requireActivity() as MainActivity + binding.webView.apply { loadUrl("https://jmt-matzip.dev") settings.javaScriptEnabled = true webViewClient = WebViewClient() + + addJavascriptInterface(WebAppInterface( + requireContext(), + { + parentActivity.slideUpBottomNavigationView() + }, + { + parentActivity.slideDownBottomNavigationView() + }, + { + parentActivity.navigateToEditRestaurantInfo(it) + } + ), "Android") } + } override fun onDestroyView() { diff --git a/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/RegisterRestaurantFragment.kt b/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/RegisterRestaurantFragment.kt index 1848c8fd..f5397fc9 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/RegisterRestaurantFragment.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/RegisterRestaurantFragment.kt @@ -2,13 +2,11 @@ package org.gdsc.presentation.view.restaurantregistration import android.content.Intent import android.os.Bundle -import android.util.Log import android.view.KeyEvent -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels @@ -32,7 +30,6 @@ import org.gdsc.presentation.utils.repeatWhenUiStarted import org.gdsc.presentation.utils.animateShrinkWidth import org.gdsc.presentation.utils.checkMediaPermissions import org.gdsc.presentation.utils.findPath -import org.gdsc.presentation.utils.showMediaPermissionsDialog import org.gdsc.presentation.view.MainActivity import org.gdsc.presentation.view.WebViewActivity import org.gdsc.presentation.view.custom.FoodCategoryBottomSheetDialog @@ -79,19 +76,64 @@ class RegisterRestaurantFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - initInfo() observeStates() setFoodCategoryContainer() setDrinkPossibilityCheckbox() setIntroductionEditText() - setAddImageButton() - setImageList() - setRecommendDrinkEditText() setRecommendMenuEditText() - setToolbarTitle() - + setRecommendDrinkEditText() setAdapter() + // register + if (navArgs.targetRestaurantId == -1) { + initInfo() + setToolbarTitle(navArgs.restaurantLocationInfo?.placeName ?: String.Empty) + setAddImageButton() + setImageList() + + // modify + } else { + viewModel.getRestaurantInfo(navArgs.targetRestaurantId) { + setToolbarTitle(it.name) + binding.introductionEditText.setText(it.introduce) + binding.recommendDrinkEditText.editText.setText(it.goWellWithLiquor) + it.recommendMenu.split('#').drop(1).forEach { menu -> + binding.recommendMenuChipGroup.addView( + Chip(requireContext()).apply { + text = menu + isCloseIconVisible = true + + closeIcon = ContextCompat.getDrawable( + requireContext(), + R.drawable.cancel_icon + ) + closeIconTint = ContextCompat.getColorStateList( + requireContext(), + R.color.grey200 + ) + + chipBackgroundColor = ContextCompat.getColorStateList( + requireContext(), + R.color.white + ) + chipStrokeColor = ContextCompat.getColorStateList( + requireContext(), + R.color.grey200 + ) + chipStrokeWidth = 1f + + setOnCloseIconClickListener { + binding.recommendMenuChipGroup.removeView(this) + viewModel.removeRecommendMenu(text.toString()) + } + } + ) + } + + } + } + + } private fun setImageList() { @@ -116,7 +158,7 @@ class RegisterRestaurantFragment : BaseFragment() { // nullable한 타입이 있다면 핸들링 처리 해주기 private fun initInfo() { - navArgs.restaurantLocationInfo.let { + navArgs.restaurantLocationInfo?.let { viewModel.setRestaurantLocationIno(it) } navArgs.restaurantDetailInfo?.let { @@ -161,35 +203,58 @@ class RegisterRestaurantFragment : BaseFragment() { binding.selectImageCountText.text = getString( R.string.text_counter_max_ten, - viewModel.isFoodImagesListState.value.size ?: 0 + viewModel.isFoodImagesListState.value.size ) adapter.submitList(list) - binding.registerButton.setOnClickListener { + binding.registerButton.apply { - val pictures = mutableListOf() + if (navArgs.targetRestaurantId == -1) this.text = "등록하기" + else this.text = "수정하기" - list.forEach { + setOnClickListener { - val file = File(it.toUri().findPath(requireContext())) + if (navArgs.targetRestaurantId == -1) { + val pictures = mutableListOf() - val requestFile = RequestBody.create(MediaType.parse("image/png"), file) - val body = - MultipartBody.Part.createFormData("pictures", file.name, requestFile) + list.forEach { - pictures.add(body) + val file = File(it.toUri().findPath(requireContext())) - } + val requestFile = + RequestBody.create(MediaType.parse("image/png"), file) + val body = + MultipartBody.Part.createFormData( + "pictures", + file.name, + requestFile + ) + + pictures.add(body) - lifecycleScope.launch(Dispatchers.IO) { - viewModel.registerRestaurant(pictures, navArgs.restaurantLocationInfo) { restaurantId -> + } - val intent = Intent(requireContext(), WebViewActivity::class.java) - // 주소는 변경 되어야 함, 현재는 Lucy LocalHost 테스트 - intent.putExtra("url", "http://172.20.10.13:3000/detail/$restaurantId") - startActivity(intent) + lifecycleScope.launch(Dispatchers.IO) { + viewModel.registerRestaurant( + pictures, + navArgs.restaurantLocationInfo ?: throw Exception() + ) { restaurantId -> + + val intent = + Intent(requireContext(), WebViewActivity::class.java) + // 주소는 변경 되어야 함, 현재는 Lucy LocalHost 테스트 + intent.putExtra( + "url", + "http://172.20.10.13:3000/detail/$restaurantId" + ) + startActivity(intent) + } + } + } else { + viewModel.modifyRestaurantInfo(navArgs.targetRestaurantId) } + } } } @@ -231,6 +296,30 @@ class RegisterRestaurantFragment : BaseFragment() { binding.recommendMenuChipGroup.addView( Chip(requireContext()).apply { text = binding.recommendMenuEditText.text + isCloseIconVisible = true + closeIcon = ContextCompat.getDrawable( + requireContext(), + R.drawable.cancel_icon + ) + closeIconTint = ContextCompat.getColorStateList( + requireContext(), + R.color.grey200 + ) + + chipBackgroundColor = ContextCompat.getColorStateList( + requireContext(), + R.color.white + ) + chipStrokeColor = ContextCompat.getColorStateList( + requireContext(), + R.color.grey200 + ) + chipStrokeWidth = 1f + + setOnCloseIconClickListener { + binding.recommendMenuChipGroup.removeView(this) + viewModel.removeRecommendMenu(text.toString()) + } } ) binding.recommendMenuEditText.editText.setText(String.Empty) @@ -266,10 +355,8 @@ class RegisterRestaurantFragment : BaseFragment() { LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) } - private fun setToolbarTitle() { - (requireActivity() as MainActivity).changeToolbarTitle( - navArgs.restaurantLocationInfo.placeName - ) + private fun setToolbarTitle(restaurantName: String) { + (requireActivity() as MainActivity).changeToolbarTitle(restaurantName) } override fun onDestroyView() { diff --git a/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/adapter/FoodCategoryListAdapter.kt b/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/adapter/FoodCategoryListAdapter.kt index 73b2e180..d0fa99e5 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/adapter/FoodCategoryListAdapter.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/adapter/FoodCategoryListAdapter.kt @@ -2,9 +2,11 @@ package org.gdsc.presentation.view.restaurantregistration.adapter import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import org.gdsc.presentation.R import org.gdsc.presentation.databinding.FoodCategoryItemBinding import org.gdsc.presentation.model.FoodCategoryItem @@ -24,6 +26,19 @@ class FoodCategoryRecyclerAdapter( binding.categoryName.text = item.categoryItem.text binding.root.isSelected = selectedItem?.categoryItem?.text == item.categoryItem.text + binding.categoryImage.apply { + setImageDrawable( + ContextCompat.getDrawable( + binding.root.context, + item.getIcon() + ) + ) + imageTintList = ContextCompat.getColorStateList( + binding.root.context, + if (binding.root.isSelected) R.color.main600 else R.color.grey100 + ) + } + } } diff --git a/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/viewmodel/RegisterRestaurantViewModel.kt b/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/viewmodel/RegisterRestaurantViewModel.kt index 1e164ee4..a22a0056 100644 --- a/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/viewmodel/RegisterRestaurantViewModel.kt +++ b/presentation/src/main/java/org/gdsc/presentation/view/restaurantregistration/viewmodel/RegisterRestaurantViewModel.kt @@ -1,7 +1,5 @@ package org.gdsc.presentation.view.restaurantregistration.viewmodel -import android.net.Uri -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -18,15 +16,21 @@ import org.gdsc.domain.Empty import org.gdsc.domain.FoodCategory import org.gdsc.domain.model.RestaurantDetailInfo import org.gdsc.domain.model.RestaurantLocationInfo +import org.gdsc.domain.model.request.ModifyRestaurantInfoRequest +import org.gdsc.domain.model.response.RestaurantInfoResponse +import org.gdsc.domain.usecase.GetRestaurantInfoUseCase import org.gdsc.domain.usecase.PostRestaurantInfoUseCase import org.gdsc.domain.usecase.PostRestaurantLocationInfoUseCase +import org.gdsc.domain.usecase.PutRestaurantInfoUseCase import org.gdsc.presentation.model.FoodCategoryItem import javax.inject.Inject @HiltViewModel class RegisterRestaurantViewModel @Inject constructor( private val postRestaurantLocationInfoUseCase: PostRestaurantLocationInfoUseCase, - private val postRestaurantInfoUseCase: PostRestaurantInfoUseCase + private val postRestaurantInfoUseCase: PostRestaurantInfoUseCase, + private val getRestaurantLocationInfoUseCase: GetRestaurantInfoUseCase, + private val putRestaurantInfoUseCase: PutRestaurantInfoUseCase ) : ViewModel() { private var _restaurantPlaceName = MutableStateFlow("") @@ -52,7 +56,7 @@ class RegisterRestaurantViewModel @Inject constructor( private var _recommendMenuListState: MutableStateFlow> = MutableStateFlow(emptyList()) - private val recommendMenuListState = _recommendMenuListState.asStateFlow() + val recommendMenuListState = _recommendMenuListState.asStateFlow() val isRecommendMenuFullState: StateFlow get() = recommendMenuListState.map { @@ -106,6 +110,10 @@ class RegisterRestaurantViewModel @Inject constructor( _recommendMenuListState.value = _recommendMenuListState.value + text } + fun removeRecommendMenu(text: String) { + _recommendMenuListState.value = _recommendMenuListState.value.filter { it != text } + } + private fun setImageButtonAnimatingTime(animationTime: Long = 300L) { viewModelScope.launch { _isImageButtonAnimating.value = true @@ -114,7 +122,7 @@ class RegisterRestaurantViewModel @Inject constructor( } } - fun setRestaurantDetailInfo(detailData : RestaurantDetailInfo) { + fun setRestaurantDetailInfo(detailData: RestaurantDetailInfo) { _foodCategoryState.value = FoodCategoryItem(FoodCategory.fromId(detailData.categoryId)) _drinkPossibilityState.value = detailData.canDrinkLiquor _recommendDrinkTextState.value = detailData.goWellWithLiquor @@ -140,7 +148,7 @@ class RegisterRestaurantViewModel @Inject constructor( introduce = introductionTextState.value, categoryId = foodCategoryState.value.categoryItem.id, pictures = pictures, - canDrinkLiquor = _drinkPossibilityState.value, + canDrinkLiquor = drinkPossibilityState.value, goWellWithLiquor = recommendDrinkTextState.value, recommendMenu = recommendMenuListState.value.joinToString(" ") { "#$it" @@ -152,4 +160,39 @@ class RegisterRestaurantViewModel @Inject constructor( } } + fun getRestaurantInfo(restaurantId: Int, setTheView: (RestaurantInfoResponse) -> Unit) { + viewModelScope.launch { + getRestaurantLocationInfoUseCase(restaurantId).let { + _foodCategoryState.value = FoodCategoryItem(FoodCategory.fromName(it.category)) + _drinkPossibilityState.value = it.canDrinkLiquor + _recommendDrinkTextState.value = it.goWellWithLiquor + _recommendMenuListState.value = it.recommendMenu.split("#").drop(1).apply { + println(" isRecommendMenuFullState 테스트 초기화 : ${this}") + } + _introductionTextState.value = it.introduce + _restaurantPlaceName.value = it.name + _restaurantLocationId.value = restaurantId.toString() + setTheView(it) + } + + } + } + + fun modifyRestaurantInfo(restaurantId: Int) { + viewModelScope.launch { + putRestaurantInfoUseCase.invoke( + ModifyRestaurantInfoRequest( + canDrinkLiquor = drinkPossibilityState.value, + goWellWithLiquor = recommendDrinkTextState.value, + introduce = introductionTextState.value, + recommendMenu = recommendMenuListState.value.joinToString(" ") { + "#$it" + }, + categoryId = foodCategoryState.value.categoryItem.id.toInt(), + id = restaurantId, + ) + ) + } + } + } \ No newline at end of file diff --git a/presentation/src/main/res/drawable/ic_bar.xml b/presentation/src/main/res/drawable/ic_bar.xml new file mode 100644 index 00000000..308bd2e2 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_bar.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/presentation/src/main/res/drawable/ic_cafe.xml b/presentation/src/main/res/drawable/ic_cafe.xml new file mode 100644 index 00000000..91b71846 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_cafe.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/presentation/src/main/res/drawable/ic_chinese.xml b/presentation/src/main/res/drawable/ic_chinese.xml new file mode 100644 index 00000000..ad58ca0a --- /dev/null +++ b/presentation/src/main/res/drawable/ic_chinese.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/presentation/src/main/res/drawable/ic_etc.xml b/presentation/src/main/res/drawable/ic_etc.xml new file mode 100644 index 00000000..838c0f24 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_etc.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/presentation/src/main/res/drawable/ic_japanese.xml b/presentation/src/main/res/drawable/ic_japanese.xml new file mode 100644 index 00000000..60ec055d --- /dev/null +++ b/presentation/src/main/res/drawable/ic_japanese.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/presentation/src/main/res/drawable/ic_korean.xml b/presentation/src/main/res/drawable/ic_korean.xml new file mode 100644 index 00000000..550121cf --- /dev/null +++ b/presentation/src/main/res/drawable/ic_korean.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/presentation/src/main/res/drawable/ic_western.xml b/presentation/src/main/res/drawable/ic_western.xml new file mode 100644 index 00000000..89149ef6 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_western.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/presentation/src/main/res/layout/fragment_register_restaurant.xml b/presentation/src/main/res/layout/fragment_register_restaurant.xml index 7f63b38c..fafa6e92 100644 --- a/presentation/src/main/res/layout/fragment_register_restaurant.xml +++ b/presentation/src/main/res/layout/fragment_register_restaurant.xml @@ -248,7 +248,7 @@ + tools:layout="@layout/fragment_home" > + + + app:argType="org.gdsc.domain.model.RestaurantLocationInfo" + app:nullable="true" + android:defaultValue="@null"/> + + + @@ -112,7 +124,7 @@