Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package org.sopt.dosopttemplate.presentation.home.follower

import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.fragment.app.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseFragment
import org.sopt.dosopttemplate.databinding.FragmentFollowerBinding
import org.sopt.dosopttemplate.util.UiState

@AndroidEntryPoint
class FollowerFragment : BaseFragment<FragmentFollowerBinding>() {
Expand All @@ -33,8 +37,14 @@ class FollowerFragment : BaseFragment<FragmentFollowerBinding>() {

followerViewModel.getFollowerList()

followerViewModel.followerList.observe(viewLifecycleOwner) {
followerAdapter.submitList(it)
}
followerViewModel.followerList.flowWithLifecycle(lifecycle).onEach { uiState ->
when (uiState) {
is UiState.Success -> {
followerAdapter.submitList(uiState.data)
}

else -> {}
}
}.launchIn(lifecycleScope)
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
package org.sopt.dosopttemplate.presentation.home.follower

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import org.sopt.dosopttemplate.data.entity.FollowerList
import org.sopt.dosopttemplate.data.repository.FollowerRepository
import org.sopt.dosopttemplate.util.UiState
import javax.inject.Inject

@HiltViewModel
class FollowerViewModel @Inject constructor(
private val repository: FollowerRepository
) : ViewModel() {

private val _followerList = MutableLiveData<List<FollowerList.FollowerListData>>()
val followerList: LiveData<List<FollowerList.FollowerListData>>
private val _followerList: MutableStateFlow<UiState<List<FollowerList.FollowerListData>>> =
MutableStateFlow(UiState.Loading)
val followerList: StateFlow<UiState<List<FollowerList.FollowerListData>>>
get() = _followerList

fun getFollowerList() {
viewModelScope.launch {
repository.getFollowerList().onSuccess { response ->
Log.d("follower viewModel: ", "연결 성공")
_followerList.value = response.data.toList()
_followerList.value = UiState.Success(response.data.toList())
}.onFailure {
Log.d("follower viewModel: ", "연결 실패")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ import android.content.Intent
import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseActivity
import org.sopt.dosopttemplate.data.entity.UserData
Expand All @@ -13,6 +17,7 @@ import org.sopt.dosopttemplate.presentation.home.home.HomeActivity
import org.sopt.dosopttemplate.presentation.signUp.SignUpActivity
import org.sopt.dosopttemplate.util.SnackBar.makeSnackBar
import org.sopt.dosopttemplate.util.Toast.makeToast
import org.sopt.dosopttemplate.util.UiState

@AndroidEntryPoint
class LogInActivity : BaseActivity<ActivityLoginBinding>(R.layout.activity_login) {
Expand Down Expand Up @@ -70,14 +75,23 @@ class LogInActivity : BaseActivity<ActivityLoginBinding>(R.layout.activity_login
}

private fun initObserveLogInEnabled() {
viewModel.signInEnabled.observe(this) { response ->
if (response) doLogIn()
else makeSnackBar(binding.root, MESSAGE_LOGIN_FAIL)
}
viewModel.signInAuthData.flowWithLifecycle(lifecycle).onEach { uiState ->
when (uiState) {
is UiState.Success -> {
doLogIn(uiState.data.id)
}

is UiState.Failure -> {
makeSnackBar(binding.root, MESSAGE_LOGIN_FAIL)
}

else -> {}
}
}.launchIn(lifecycleScope)
}

private fun doLogIn() {
makeToast(applicationContext, viewModel.signInAuthData.value?.id.toString())
private fun doLogIn(id: String) {
makeToast(applicationContext, id)
val intentToMain = Intent(this, HomeActivity::class.java)
startActivity(intentToMain)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import org.sopt.dosopttemplate.data.entity.AuthData
import org.sopt.dosopttemplate.data.repository.AuthRepository
import org.sopt.dosopttemplate.util.UiState
import javax.inject.Inject

@HiltViewModel
Expand All @@ -19,8 +22,9 @@ class LogInViewModel @Inject constructor(
val username: MutableLiveData<String> = MutableLiveData()
val password: MutableLiveData<String> = MutableLiveData()

private val _signInAuthData: MutableLiveData<AuthData> = MutableLiveData()
val signInAuthData: LiveData<AuthData>
private val _signInAuthData: MutableStateFlow<UiState<AuthData>> =
MutableStateFlow(UiState.Loading)
val signInAuthData: StateFlow<UiState<AuthData>>
get() = _signInAuthData

private val _signInEnabled = MutableLiveData<Boolean>()
Expand All @@ -35,10 +39,11 @@ class LogInViewModel @Inject constructor(
username,
password
).onSuccess { data ->
_signInAuthData.value = data
_signInAuthData.value = UiState.Success(data)
_signInEnabled.value = true
}.onFailure {
Log.d("signIn viewModel: ", "실패")
_signInAuthData.value = UiState.Failure(it.message.toString())
_signInEnabled.value = false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@ package org.sopt.dosopttemplate.presentation.signUp
import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseActivity
import org.sopt.dosopttemplate.databinding.ActivitySignupBinding
import org.sopt.dosopttemplate.presentation.logIn.LogInActivity
import org.sopt.dosopttemplate.util.SnackBar.makeSnackBar
import org.sopt.dosopttemplate.util.UiState

@AndroidEntryPoint
class SignUpActivity : BaseActivity<ActivitySignupBinding>(R.layout.activity_signup) {
Expand Down Expand Up @@ -62,10 +67,19 @@ class SignUpActivity : BaseActivity<ActivitySignupBinding>(R.layout.activity_sig
}

private fun initObserveSignUpEnabled() {
viewModel.signUpEnabled.observe(this) { response ->
if (response) doSignUp()
else makeSnackBar(binding.root, MESSAGE_SIGNUP_FAIL)
}
viewModel.signUpEnabled.flowWithLifecycle(lifecycle).onEach { uiState ->
when (uiState) {
is UiState.Success -> {
doSignUp()
}

is UiState.Failure -> {
makeSnackBar(binding.root, MESSAGE_SIGNUP_FAIL)
}

else -> {}
}
}.launchIn(lifecycleScope)
}

private fun doSignUp() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package org.sopt.dosopttemplate.presentation.signUp

import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import org.sopt.dosopttemplate.data.repository.AuthRepository
import org.sopt.dosopttemplate.util.UiState
import java.util.regex.Pattern
import javax.inject.Inject

Expand All @@ -22,8 +24,10 @@ class SignUpViewModel @Inject constructor(
val password: MutableLiveData<String> = MutableLiveData()
val mbti: MutableLiveData<String> = MutableLiveData()

private val _signUpEnabled = MutableLiveData<Boolean>()
val signUpEnabled: LiveData<Boolean> = _signUpEnabled
private val _signUpEnabled: MutableStateFlow<UiState<Boolean>> =
MutableStateFlow(UiState.Loading)
val signUpEnabled: StateFlow<UiState<Boolean>>
get() = _signUpEnabled

val checkBtnEnabled = MediatorLiveData<Boolean>().apply {
addSource(username) { value = isSignUpValid() }
Expand Down Expand Up @@ -60,10 +64,10 @@ class SignUpViewModel @Inject constructor(
nickname,
password
).onSuccess { response ->
_signUpEnabled.value = true
_signUpEnabled.value = UiState.Success(true)
Log.d("signUp viewModel: ", "${_signUpEnabled.value}")
}.onFailure {
_signUpEnabled.value = false
_signUpEnabled.value = UiState.Failure(it.message.toString())
Log.d("signUp viewModel: ", "실패")
}
}
Expand Down
14 changes: 14 additions & 0 deletions app/src/main/java/org/sopt/dosopttemplate/util/UiState.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.sopt.dosopttemplate.util

sealed interface UiState<out T> {

object Loading : UiState<Nothing>

data class Success<T>(
val data: T
) : UiState<T>

data class Failure(
val error: String
) : UiState<Nothing>
}