Skip to content

Commit

Permalink
[mod] #13 회원정보 조회 뷰모델 분리
Browse files Browse the repository at this point in the history
  • Loading branch information
Hyobeen-Park committed May 30, 2024
1 parent c8853ca commit f31e03f
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 90 deletions.
93 changes: 32 additions & 61 deletions app/src/main/java/com/sopt/now/presentation/Home/HomeFragment.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package com.sopt.now.presentation.Home

import android.icu.util.Freezable
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import com.sopt.now.presentation.Home.Friend.Friend
Expand All @@ -17,20 +22,27 @@ import com.sopt.now.data.model.response.ResponseUserInfoDto
import com.sopt.now.data.model.response.ResponseUserListDto
import com.sopt.now.data.ServicePool
import com.sopt.now.databinding.FragmentHomeBinding
import com.sopt.now.presentation.Key.USERID
import com.sopt.now.presentation.common.ViewModelFactory
import com.sopt.now.util.UiState
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class HomeFragment : Fragment() {
private val authService by lazy { ServicePool.authService }
private val userService by lazy { ServicePool.userService }
private var _binding: FragmentHomeBinding? = null
private val binding: FragmentHomeBinding
get() = requireNotNull(_binding) { }

private var user: User? = null
private val homeViewModel: HomeViewModel by viewModels { ViewModelFactory() }
private var friendList: List<Friend> ?= null

private lateinit var userAdapter: UserAdapter
private lateinit var friendAdapter: FriendAdapter

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -43,8 +55,10 @@ class HomeFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

initUserData()
getUserList()
homeViewModel.getUserInfo(activity?.intent?.getStringExtra(USERID) ?: "0")
initAdapter()
collectUserInfo()
// getUserList()

}

Expand All @@ -53,70 +67,27 @@ class HomeFragment : Fragment() {
_binding = null
}

private fun initUserData() {
activity?.intent?.apply {
getUserInfo(getStringExtra("userId") ?: "0")
}
}

private fun initFriendRecyclerView() {
val userAdapter = UserAdapter().apply { user?.let { setUserList(it) } }
val friendAdapter = FriendAdapter().apply { friendList?.let { setFriendList(it) } }
private fun initAdapter() {
userAdapter = UserAdapter()
friendAdapter = FriendAdapter()


binding.rvHomeFriends.run {
adapter = ConcatAdapter(userAdapter, friendAdapter)
layoutManager = LinearLayoutManager(requireContext())
}
binding.rvHomeFriends.adapter = ConcatAdapter(userAdapter, friendAdapter)
}

private fun getUserInfo(userId: String) {
authService.getUserInfo(userId).enqueue(object : Callback<ResponseUserInfoDto> {
override fun onResponse(
call: Call<ResponseUserInfoDto>,
response: Response<ResponseUserInfoDto>
) {
if(response.isSuccessful) {
val data : ResponseUserInfoDto? = response.body()
user = User(
R.drawable.ic_person_white_24,
data?.data?.authenticationId ?: "id",
data?.data?.nickname ?: "닉네임",
data?.data?.phone ?: "phone"
)
initFriendRecyclerView()
} else {
val error = response.message()
Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
private fun collectUserInfo() {
homeViewModel.homeUserState.flowWithLifecycle(lifecycle).onEach { homeUserState ->
when(homeUserState) {
is UiState.Success -> {
userAdapter.setUserList(homeUserState.data)
}
is UiState.Error -> showToastMessage(homeUserState.message)
else -> Unit
}

override fun onFailure(call: Call<ResponseUserInfoDto>, t: Throwable) {
Toast.makeText(context, R.string.server_connection_error, Toast.LENGTH_SHORT).show()
}
})
}.launchIn(lifecycleScope)
}

private fun getUserList() {
userService.getUserList(2).enqueue(object : Callback<ResponseUserListDto> {
override fun onResponse(
call: Call<ResponseUserListDto>,
response: Response<ResponseUserListDto>
) {
if(response.isSuccessful) {
val data : ResponseUserListDto? = response.body()
friendList = data?.data
initFriendRecyclerView()
} else {
val error = response.message()
Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
}
}

override fun onFailure(call: Call<ResponseUserListDto>, t: Throwable) {
Toast.makeText(context, R.string.server_connection_error, Toast.LENGTH_SHORT).show()
}
})
private fun showToastMessage(message: String?) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,30 @@
package com.sopt.now.presentation.Home

class HomeViewModel {
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.now.domain.model.User
import com.sopt.now.domain.repository.AuthRepository
import com.sopt.now.util.UiState
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch

class HomeViewModel(
private val authRepository: AuthRepository,
): ViewModel() {
private val _homeUserState = MutableStateFlow<UiState<User>>(UiState.Empty)
val homeUserState get() = _homeUserState.asStateFlow()

fun getUserInfo(memberId: String) {
viewModelScope.launch {
_homeUserState.value = UiState.Loading
authRepository.getUserInfo(memberId = memberId).onSuccess { user ->
_homeUserState.value = UiState.Success(user)
}.onFailure { exception: Throwable ->
_homeUserState.value = UiState.Error(exception.message)
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.sopt.now.databinding.ItemUserBinding
import com.sopt.now.domain.model.User

class UserAdapter(): RecyclerView.Adapter<UserViewHolder>() {
class UserAdapter() : RecyclerView.Adapter<UserViewHolder>() {
private var userList: List<User> = emptyList()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
Expand All @@ -21,7 +22,7 @@ class UserAdapter(): RecyclerView.Adapter<UserViewHolder>() {
override fun getItemCount() = userList.size

fun setUserList(user: User) {
this.userList = listOf (user)
this.userList = listOf(user)
notifyDataSetChanged()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ package com.sopt.now.presentation.Home.User

import androidx.recyclerview.widget.RecyclerView
import com.sopt.now.databinding.ItemUserBinding
import com.sopt.now.domain.model.User

class UserViewHolder(private val binding: ItemUserBinding): RecyclerView.ViewHolder(binding.root){
class UserViewHolder(private val binding: ItemUserBinding) : RecyclerView.ViewHolder(binding.root) {
fun onBind(userData: User) {
binding.run {
ivUserProfileImg.setImageResource(userData.profileImage)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.sopt.now.presentation.Login

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
Expand Down Expand Up @@ -51,7 +52,7 @@ class LoginActivity : AppCompatActivity() {
is UiState.Success -> {
showToastMessage("${loginState.data} 님 로그인에 성공했습니다")
Intent(this@LoginActivity, HomeActivity::class.java).apply {
putExtra(USERID, loginState.data)
putExtra(USERID, loginState.data.toString())
startActivity(this)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class MypageFragment : Fragment() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
getUserInfo(getUserId())
// getUserInfo(getUserId())
}

override fun onDestroyView() {
Expand All @@ -50,26 +50,26 @@ class MypageFragment : Fragment() {
return activity?.intent?.getStringExtra("userId") ?: "0"
}

private fun getUserInfo(userId: String) {
authService.getUserInfo(userId).enqueue(object : Callback<ResponseUserInfoDto> {
override fun onResponse(
call: Call<ResponseUserInfoDto>,
response: Response<ResponseUserInfoDto>
) {
if (response.isSuccessful) {
val data: ResponseUserInfoDto? = response.body()
data?.data?.apply {
initTextViews(authenticationId, nickname, phone)
}
} else {
val error = response.message()
Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
}
}

override fun onFailure(call: Call<ResponseUserInfoDto>, t: Throwable) {
Toast.makeText(context, "서버 통신 에러", Toast.LENGTH_SHORT).show()
}
})
}
// private fun getUserInfo(userId: String) {
// authService.getUserInfo(userId).enqueue(object : Callback<ResponseUserInfoDto> {
// override fun onResponse(
// call: Call<ResponseUserInfoDto>,
// response: Response<ResponseUserInfoDto>
// ) {
// if (response.isSuccessful) {
// val data: ResponseUserInfoDto? = response.body()
// data?.data?.apply {
// initTextViews(authenticationId, nickname, phone)
// }
// } else {
// val error = response.message()
// Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
// }
// }
//
// override fun onFailure(call: Call<ResponseUserInfoDto>, t: Throwable) {
// Toast.makeText(context, "서버 통신 에러", Toast.LENGTH_SHORT).show()
// }
// })
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class ViewModelFactory: ViewModelProvider.Factory {
} else if(modelClass.isAssignableFrom(LoginViewModel::class.java)) {
return LoginViewModel(AuthRepositoryImpl(AuthRemoteDataSourceImpl())) as T
} else if(modelClass.isAssignableFrom(HomeViewModel::class.java)) {
return HomeViewModel() as T
return HomeViewModel(AuthRepositoryImpl(AuthRemoteDataSourceImpl())) as T
} else if(modelClass.isAssignableFrom(MypageViewModel::class.java)) {
return MypageViewModel() as T
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/fragment_home.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_friend" />

</androidx.constraintlayout.widget.ConstraintLayout>

0 comments on commit f31e03f

Please sign in to comment.