Skip to content

Commit

Permalink
[FEAT]#30: 자동 로그인을 추가해요
Browse files Browse the repository at this point in the history
  • Loading branch information
flash159483 committed Jul 17, 2024
1 parent 37bcf3d commit 8781c1c
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.bff.wespot.model.constants

enum class LoginState {
LOGIN_SUCCESS, LOGIN_FAILURE;
}
45 changes: 41 additions & 4 deletions feature/auth/src/main/kotlin/com/bff/wespot/auth/AuthActivity.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package com.bff.wespot.auth

import android.os.Bundle
import android.view.View
import android.view.ViewTreeObserver
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Surface
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.rememberNavController
import com.bff.wespot.auth.screen.NavGraphs
import com.bff.wespot.auth.screen.destinations.ClassScreenDestination
Expand All @@ -21,9 +23,11 @@ import com.bff.wespot.auth.screen.destinations.GenderScreenDestination
import com.bff.wespot.auth.screen.destinations.GradeScreenDestination
import com.bff.wespot.auth.screen.destinations.NameScreenDestination
import com.bff.wespot.auth.screen.destinations.SchoolScreenDestination
import com.bff.wespot.auth.state.AuthAction
import com.bff.wespot.auth.state.AuthSideEffect
import com.bff.wespot.auth.viewmodel.AuthViewModel
import com.bff.wespot.designsystem.theme.WeSpotTheme
import com.bff.wespot.model.constants.LoginState
import com.danggeun.navigation.Navigator
import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.navigation.dependency
Expand All @@ -36,17 +40,22 @@ import javax.inject.Inject

@AndroidEntryPoint
class AuthActivity : ComponentActivity() {
private val viewModel by viewModels<AuthViewModel>()
private lateinit var loginState: LoginState

@Inject
lateinit var navigator: Navigator

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
login()

setContent {
val navController = rememberNavController()
val engine = rememberNavHostEngine()
val viewModel: AuthViewModel = hiltViewModel()

val state by viewModel.collectAsState()
val action = viewModel::onAction

viewModel.collectSideEffect {
when (it) {
Expand Down Expand Up @@ -82,7 +91,8 @@ class AuthActivity : ComponentActivity() {
}

AuthSideEffect.NavigateToMainActivity -> {
navigator.navigateToMain(this)
val intent = navigator.navigateToMain(this)
startActivity(intent)
}
}
}
Expand All @@ -107,6 +117,33 @@ class AuthActivity : ComponentActivity() {
CircularProgressIndicator()
}
}

LaunchedEffect(key1 = Unit) {
action(AuthAction.autoLogin)
}
}
}

private fun login() {
viewModel.onAction(AuthAction.autoLogin)
viewModel.loginState.observe(this) {
loginState = it
}

val content: View = findViewById(android.R.id.content)
content.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
return if (::loginState.isInitialized) {
if (loginState == LoginState.LOGIN_SUCCESS) {
val intent = navigator.navigateToMain(this@AuthActivity)
startActivity(intent)
}
content.viewTreeObserver.removeOnPreDrawListener(this)
true
} else {
false
}
}
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ sealed class AuthAction {

data object signUp : AuthAction()

data object autoLogin : AuthAction()

data class Navigation(val navigate: NavigationAction) : AuthAction()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.bff.wespot.auth.viewmodel

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.bff.wespot.auth.state.AuthAction
import com.bff.wespot.auth.state.AuthSideEffect
import com.bff.wespot.auth.state.AuthUiState
import com.bff.wespot.auth.state.NavigationAction
import com.bff.wespot.domain.repository.DataStoreRepository
import com.bff.wespot.domain.repository.auth.AuthRepository
import com.bff.wespot.domain.usecase.KakaoLoginUseCase
import com.bff.wespot.domain.util.DataStoreKey
import com.bff.wespot.model.auth.request.SignUp
import com.bff.wespot.model.auth.response.School
import com.bff.wespot.model.constants.LoginState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.MutableStateFlow
Expand All @@ -29,9 +34,13 @@ class AuthViewModel @Inject constructor(
private val kakaoLoginUseCase: KakaoLoginUseCase,
private val authRepository: AuthRepository,
private val dispatcher: CoroutineDispatcher,
private val dataStoreRepository: DataStoreRepository,
) : ViewModel(), ContainerHost<AuthUiState, AuthSideEffect> {
override val container = container<AuthUiState, AuthSideEffect>(AuthUiState())

private val loginState_: MutableLiveData<LoginState> = MutableLiveData()
val loginState: LiveData<LoginState> = loginState_

private val userInput = MutableStateFlow("")

init {
Expand All @@ -50,6 +59,7 @@ class AuthViewModel @Inject constructor(
is AuthAction.Navigation -> handleNavigation(action.navigate)
is AuthAction.LoginWithKakao -> loginWithKakao()
is AuthAction.signUp -> signUp()
is AuthAction.autoLogin -> autoLogin()
else -> {}
}
}
Expand All @@ -68,6 +78,17 @@ class AuthViewModel @Inject constructor(
}
}

private fun autoLogin() {
viewModelScope.launch {
dataStoreRepository.getString(DataStoreKey.ACCESS_TOKEN)
.collect {
if(it.isNotEmpty()) {
loginState_.postValue(LoginState.LOGIN_SUCCESS)
}
}
}
}

private fun signUp() = intent {
reduce {
state.copy(
Expand Down Expand Up @@ -118,7 +139,6 @@ class AuthViewModel @Inject constructor(

private fun fetchSchoolList(search: String) = intent {
viewModelScope.launch(dispatcher) {
Timber.d("enter")
authRepository.getSchoolList(search)
.onSuccess {
reduce {
Expand Down

0 comments on commit 8781c1c

Please sign in to comment.