diff --git a/core-ui/src/main/java/com/velogm/core_ui/base/BindingFragment.kt b/core-ui/src/main/java/com/velogm/core_ui/base/BindingFragment.kt index a1354d5..2df0a8f 100644 --- a/core-ui/src/main/java/com/velogm/core_ui/base/BindingFragment.kt +++ b/core-ui/src/main/java/com/velogm/core_ui/base/BindingFragment.kt @@ -29,7 +29,7 @@ abstract class BindingFragment( override fun onDestroyView() { - super.onDestroyView() _binding = null + super.onDestroyView() } } \ No newline at end of file diff --git a/data-remote/src/main/java/com/data_remote/api/SignApiService.kt b/data-remote/src/main/java/com/data_remote/api/SignApiService.kt index f3cd95b..addae87 100644 --- a/data-remote/src/main/java/com/data_remote/api/SignApiService.kt +++ b/data-remote/src/main/java/com/data_remote/api/SignApiService.kt @@ -2,12 +2,18 @@ package com.data_remote.api import com.velogm.data.dto.response.TokenResponseDto import retrofit2.http.GET -import retrofit2.http.POST import retrofit2.http.Query interface SignApiService { - @GET("/sign-api/google-login") + + companion object { + const val SIGN_API = "sign-api" + const val GOOGLE_LOGIN = "google-login" + const val CODE = "code" + } + + @GET("/$SIGN_API/$GOOGLE_LOGIN") suspend fun getGoogleLogin( - @Query("code") code: String + @Query(CODE) code: String ): TokenResponseDto } \ No newline at end of file diff --git a/data-remote/src/main/java/com/data_remote/api/SubscribeApiService.kt b/data-remote/src/main/java/com/data_remote/api/SubscribeApiService.kt index 91a0dd6..0251f9a 100644 --- a/data-remote/src/main/java/com/data_remote/api/SubscribeApiService.kt +++ b/data-remote/src/main/java/com/data_remote/api/SubscribeApiService.kt @@ -12,32 +12,44 @@ import retrofit2.http.Path import retrofit2.http.Query interface SubscribeApiService { - - @GET("/subscribe/trendposts") + companion object { + const val SUBSCRIBE = "subscribe" + const val TREND_POSTS = "trendposts" + const val SUBSCRIBER_POSTS = "subscriberpost" + const val GET_SUBSCRIBER = "getsubscriber" + const val UNSUBSCRIBE = "unsubscribe" + const val TARGET_NAME = "targetName" + const val INPUT_NAME = "inputname" + const val NAME = "name" + const val ADD_SUBSCRIBER = "addsubscriber" + const val FCM_TOKEN = "fcmToken" + } + + @GET("/$SUBSCRIBE/$TREND_POSTS") suspend fun getTrendPost( ): PostListDto - @GET("/subscribe/subscriberpost") + @GET("/$SUBSCRIBE/$SUBSCRIBER_POSTS") suspend fun getFollowPost( ): PostFollowListDto - @GET("/subscribe/getsubscriber") + @GET("/$SUBSCRIBE/$GET_SUBSCRIBER") suspend fun getFollower( ): List - @DELETE("/subscribe/unsubscribe/{targetName}") + @DELETE("/$SUBSCRIBE/$UNSUBSCRIBE/{$TARGET_NAME}") suspend fun deleteFollower( - @Path(value = "targetName") followerName: String + @Path(value = TARGET_NAME) followerName: String ): DeleteFollowerDto - @GET("/subscribe/inputname/{name}") + @GET("/$SUBSCRIBE/$INPUT_NAME/{$NAME}") suspend fun getInputFollower( - @Path(value = "name") followerName: String? + @Path(value = NAME) followerName: String? ): InputFollowerDto - @POST("/subscribe/addsubscriber") + @POST("/$SUBSCRIBE/$ADD_SUBSCRIBER") suspend fun postAddFollower( - @Query("fcmToken") token: String, - @Query("name") followerName: String + @Query(FCM_TOKEN) token: String, + @Query(NAME) followerName: String ): String } \ No newline at end of file diff --git a/data-remote/src/main/java/com/data_remote/api/TagApiService.kt b/data-remote/src/main/java/com/data_remote/api/TagApiService.kt index 1b621ce..51fdac6 100644 --- a/data-remote/src/main/java/com/data_remote/api/TagApiService.kt +++ b/data-remote/src/main/java/com/data_remote/api/TagApiService.kt @@ -7,27 +7,36 @@ import retrofit2.http.POST import retrofit2.http.Query interface TagApiService { - @GET("/tag/gettag") + + companion object { + const val TAG = "tag" + const val GET_TAG = "gettag" + const val POPULAR_POST = "popularpost" + const val DELETE_TAG = "deletetag" + const val ADD_TAG = "addtag" + const val GET_TAG_POST = "gettagpost" + } + + @GET("/$TAG/$GET_TAG") suspend fun getTag( - ):List + ): List - @GET("/tag/popularpost") + @GET("/$TAG/$POPULAR_POST") suspend fun getPopularTag( - ):List + ): List - @DELETE("/tag/deletetag") + @DELETE("/$TAG/$DELETE_TAG") suspend fun deleteTag( - @Query("tag") tag:String - ):String + @Query(TAG) tag: String + ): String - @POST("/tag/addtag") + @POST("/$TAG/$ADD_TAG") suspend fun addTag( - @Query("tag") tag:String - ):String + @Query(TAG) tag: String + ): String - @GET("/tag/gettagpost") + @GET("/$TAG/$GET_TAG_POST") suspend fun getTagPost( - @Query("tag") tag:String + @Query(TAG) tag: String ): List - } \ No newline at end of file diff --git a/presentation/src/main/java/com/velogm/presentation/ui/follow/AddFollowerFragment.kt b/presentation/src/main/java/com/velogm/presentation/ui/follow/AddFollowerFragment.kt index fe1be75..f6dd9a1 100644 --- a/presentation/src/main/java/com/velogm/presentation/ui/follow/AddFollowerFragment.kt +++ b/presentation/src/main/java/com/velogm/presentation/ui/follow/AddFollowerFragment.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.velogm.core_ui.base.BindingFragment +import com.velogm.core_ui.context.hideKeyboard import com.velogm.core_ui.view.UiState import com.velogm.presentation.R import com.velogm.presentation.databinding.FragmentAddFollowerBinding @@ -34,42 +35,10 @@ class AddFollowerFragment : initClickEventListeners() initEditText() addFollower() + removeText() collectInputResult() collectEventData() collectDeleteFollower() - removeText() - } - - private fun collectInputResult() { - addFollowerViewModel.getInputFollower.flowWithLifecycle(lifecycle).onEach { - when (it) { - is UiState.Loading -> { - } - - is UiState.Success -> { - with(binding) { - addFollower = it.data - val list: ArrayList? = - requireArguments().getStringArrayList(FOLLOWER_LIST) - - layoutAddFollower.visibility = - if (it.data.validate) View.VISIBLE else View.GONE - - if (list != null) { - val isFollowing = it.data.userName in list - binding.tvAddFollowerLabel.text = if (isFollowing) "팔로우 취소" else "팔로우" - } - - layoutAddFollowerEmpty.visibility = - if (!it.data.validate) View.VISIBLE else View.GONE - } - } - - else -> { - binding.layoutAddFollowerEmpty.visibility = View.VISIBLE - } - } - }.launchIn(lifecycleScope) } private fun initClickEventListeners() { @@ -85,6 +54,7 @@ class AddFollowerFragment : if (actionId == EditorInfo.IME_ACTION_DONE || (event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER)) { addFollowerViewModel.getInputFollower(binding.etAddFollowerSearch.text.toString()) binding.etAddFollowerSearch.text?.clear() + requireActivity().hideKeyboard(binding.root) true } else { false @@ -94,7 +64,7 @@ class AddFollowerFragment : private fun addFollower() { binding.tvAddFollowerLabel.setOnClickListener { - if (binding.tvAddFollowerLabel.text == "팔로우") { + if (binding.tvAddFollowerLabel.text == getString(R.string.tv_add_follower_button)) { addFollowerViewModel.addFollower(binding.tvAddFollowerName.text.toString()) } else { val dialog = DeleteFollowerDialogFragment(deleteFollower = { @@ -105,44 +75,71 @@ class AddFollowerFragment : } } - private fun collectEventData() { - addFollowerViewModel.eventData.flowWithLifecycle(lifecycle).onEach { - when (it) { - is UiState.Loading -> { + private fun removeText() { + with(binding) { + etAddFollowerSearch.doAfterTextChanged { text -> + if (text?.length == 0) { + ivAddFollowerCancel.visibility = View.INVISIBLE + } else { + ivAddFollowerCancel.visibility = View.VISIBLE + ivAddFollowerCancel.setOnClickListener { etAddFollowerSearch.text.clear() } } + } + } + } + + private fun collectInputResult() { + addFollowerViewModel.getInputFollower.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Loading -> Unit is UiState.Success -> { - binding.tvAddFollowerLabel.text = "팔로우 취소" + with(binding) { + addFollower = it.data + val list: ArrayList? = + requireArguments().getStringArrayList(FOLLOWER_LIST) + + layoutAddFollower.visibility = + if (it.data.validate) View.VISIBLE else View.GONE + + if (list != null) { + val isFollowing = it.data.userName in list + binding.tvAddFollowerLabel.text = + if (isFollowing) getString(R.string.tv_item_rv_follow_cancel) else getString( + R.string.tv_add_follower_button + ) + } + + layoutAddFollowerEmpty.visibility = + if (!it.data.validate) View.VISIBLE else View.GONE + } } - else -> {} + else -> binding.layoutAddFollowerEmpty.visibility = View.VISIBLE } }.launchIn(lifecycleScope) } - private fun collectDeleteFollower() { - followViewModel.deleteFollower.flowWithLifecycle(lifecycle).onEach { + private fun collectEventData() { + addFollowerViewModel.eventData.flowWithLifecycle(lifecycle).onEach { when (it) { - is UiState.Success -> { - binding.tvAddFollowerLabel.text = "팔로우" - } + is UiState.Success -> binding.tvAddFollowerLabel.text = + getString(R.string.tv_item_rv_follow_cancel) - else -> {} + else -> Unit } }.launchIn(lifecycleScope) } - private fun removeText() { - with(binding) { - etAddFollowerSearch.doAfterTextChanged { text -> - if (text?.length == 0) { - ivAddFollowerCancel.visibility = View.INVISIBLE - } else { - ivAddFollowerCancel.visibility = View.VISIBLE - ivAddFollowerCancel.setOnClickListener { etAddFollowerSearch.text.clear() } - } + private fun collectDeleteFollower() { + followViewModel.deleteFollower.flowWithLifecycle(lifecycle).onEach { + when (it) { + is UiState.Success -> binding.tvAddFollowerLabel.text = + getString(R.string.tv_add_follower_button) + + else -> Unit } - } + }.launchIn(lifecycleScope) } } diff --git a/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowFragment.kt b/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowFragment.kt index 401f101..9a1b154 100644 --- a/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowFragment.kt +++ b/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowFragment.kt @@ -8,7 +8,6 @@ import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.velogm.core_ui.base.BindingFragment -import com.velogm.core_ui.fragment.toast import com.velogm.core_ui.view.UiState import com.velogm.presentation.R import com.velogm.presentation.databinding.FragmentFollowBinding @@ -40,21 +39,23 @@ class FollowFragment : BindingFragment(R.layout.fragment_ private fun collectFollowerNameList() { viewModel.getFollowerNameList.flowWithLifecycle(lifecycle).onEach { when (it) { - is UiState.Success -> { - openAddFollower(it.data.name) - } - - else -> {} + is UiState.Success -> openAddFollower(it.data.name) + else -> Unit } }.launchIn(lifecycleScope) } + private fun openAddFollower(list: ArrayList) { + binding.tvFollowAddFollower.setOnClickListener { + findNavController().navigate( + R.id.action_follow_to_addFollowerFragment, bundleOf(FOLLOWER_LIST to list) + ) + } + } + private fun collectFollower() { viewModel.getFollower.flowWithLifecycle(lifecycle).onEach { when (it) { - is UiState.Loading -> { - } - is UiState.Success -> { binding.rvFollow.adapter = FollowerAdapter(deleteFollowerClick = { val dialog = DeleteFollowerDialogFragment(deleteFollower = { @@ -68,7 +69,7 @@ class FollowFragment : BindingFragment(R.layout.fragment_ } } - else -> {} + else -> Unit } }.launchIn(lifecycleScope) } @@ -76,20 +77,9 @@ class FollowFragment : BindingFragment(R.layout.fragment_ private fun collectDeleteFollower() { viewModel.deleteFollower.flowWithLifecycle(lifecycle).onEach { when (it) { - is UiState.Success -> { - viewModel.getFollower() - } - - else -> {} + is UiState.Success -> viewModel.getFollower() + else -> Unit } }.launchIn(lifecycleScope) } - - private fun openAddFollower(list: ArrayList) { - binding.tvFollowAddFollower.setOnClickListener { - findNavController().navigate( - R.id.action_follow_to_addFollowerFragment, bundleOf(FOLLOWER_LIST to list) - ) - } - } } \ No newline at end of file diff --git a/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowViewModel.kt b/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowViewModel.kt index 22da1a0..a2bf7ec 100644 --- a/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowViewModel.kt +++ b/presentation/src/main/java/com/velogm/presentation/ui/follow/FollowViewModel.kt @@ -50,5 +50,4 @@ class FollowViewModel @Inject constructor( } _deleteFollower.value = UiState.Loading } - } \ No newline at end of file diff --git a/presentation/src/main/java/com/velogm/presentation/ui/setting/SettingFragment.kt b/presentation/src/main/java/com/velogm/presentation/ui/setting/SettingFragment.kt index a8b7155..29a185a 100644 --- a/presentation/src/main/java/com/velogm/presentation/ui/setting/SettingFragment.kt +++ b/presentation/src/main/java/com/velogm/presentation/ui/setting/SettingFragment.kt @@ -42,5 +42,4 @@ class SettingFragment : BindingFragment(R.layout.fragmen dialog.show(childFragmentManager, "withdrawal") } } - } \ No newline at end of file diff --git a/presentation/src/main/res/layout/fragment_add_follower.xml b/presentation/src/main/res/layout/fragment_add_follower.xml index 33d0dd4..789ace2 100644 --- a/presentation/src/main/res/layout/fragment_add_follower.xml +++ b/presentation/src/main/res/layout/fragment_add_follower.xml @@ -53,6 +53,7 @@ android:drawableStart="@drawable/ic_follow_reading_glasses" android:drawablePadding="10dp" android:hint="@string/et_follow_hint" + android:maxLines="1" android:paddingHorizontal="14dp" android:paddingVertical="10dp" android:textAppearance="@style/TextAppearance.VelogM.Body1_M"