Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] isRegistered에 따른 로직 분기 구현 #49

Merged
merged 1 commit into from
Aug 24, 2024
Merged
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
3 changes: 2 additions & 1 deletion app/src/main/java/pokitmons/pokit/navigation/RootNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ fun RootNavHost(
val viewModel: LoginViewModel = hiltViewModel()
LoginScreen(
loginViewModel = viewModel,
onNavigateToTermsOfServiceScreen = { navHostController.navigate(TermOfService.route) }
onNavigateToTermsOfServiceScreen = { navHostController.navigate(TermOfService.route) },
onNavigateToHomeScreen = { navHostController.navigate(Home.route) }
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class TokenManager @Inject constructor(
companion object {
val ACCESS_TOKEN = stringPreferencesKey("access_token")
val REFRESH_TOKEN = stringPreferencesKey("refresh_token")
val AUTH_TYPE = stringPreferencesKey("auth_type")
}

fun getAccessToken(): Flow<String?> {
Expand All @@ -21,6 +22,18 @@ class TokenManager @Inject constructor(
}
}

suspend fun setAuthType(type: String) {
dataStore.edit { prefs ->
prefs[AUTH_TYPE] = type
}
}

fun getAuthType(): Flow<String> {
return dataStore.data.map { prefs ->
prefs[ACCESS_TOKEN] ?: ""
}
}

suspend fun saveAccessToken(token: String) {
dataStore.edit { prefs ->
prefs[ACCESS_TOKEN] = token
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ object AuthMapper {
fun mapperToSNSLogin(snsLoginResponse: SNSLoginResponse): SNSLoginResult {
return SNSLoginResult(
accessToken = snsLoginResponse.accessToken,
refreshToken = snsLoginResponse.refreshToken
refreshToken = snsLoginResponse.refreshToken,
isRegistered = snsLoginResponse.isRegistered
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ import kotlinx.serialization.Serializable
data class SNSLoginResponse(
val accessToken: String,
val refreshToken: String,
val isRegistered: Boolean,
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package pokitmons.pokit.data.repository.auth

import kotlinx.coroutines.flow.Flow
import pokitmons.pokit.data.datasource.local.TokenManager
import pokitmons.pokit.data.datasource.remote.auth.AuthDataSource
import pokitmons.pokit.data.mapper.auth.AuthMapper
Expand Down Expand Up @@ -60,4 +61,12 @@ class AuthRepositoryImpl @Inject constructor(
override suspend fun setRefreshToken(token: String) {
tokenManager.saveRefreshToken(token)
}

override suspend fun setAuthType(type: String) {
tokenManager.setAuthType(type)
}

override suspend fun getAuthType(): Flow<String> {
return tokenManager.getAuthType()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ package pokitmons.pokit.domain.model.auth
data class SNSLoginResult(
val accessToken: String,
val refreshToken: String,
val isRegistered: Boolean,
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package pokitmons.pokit.domain.repository.auth

import kotlinx.coroutines.flow.Flow
import pokitmons.pokit.domain.commom.PokitResult
import pokitmons.pokit.domain.model.auth.DuplicateNicknameResult
import pokitmons.pokit.domain.model.auth.SNSLoginResult
Expand All @@ -11,4 +12,8 @@ interface AuthRepository {
suspend fun signUp(nickname: String, categories: List<String>): PokitResult<SignUpResult>
suspend fun setAccessToken(token: String)
suspend fun setRefreshToken(token: String)

// TODO 리팩토링
suspend fun setAuthType(type: String)
suspend fun getAuthType(): Flow<String>
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package pokitmons.pokit.domain.usecase.auth

import kotlinx.coroutines.flow.Flow
import pokitmons.pokit.domain.repository.auth.AuthRepository
import javax.inject.Inject

Expand All @@ -11,4 +12,12 @@ class TokenUseCase @Inject constructor(private val authRepository: AuthRepositor
suspend fun setRefreshToken(token: String) {
authRepository.setRefreshToken(token)
}

suspend fun setAuthType(type: String) {
authRepository.setAuthType(type)
}

suspend fun getAuthType(): Flow<String> {
return authRepository.getAuthType()
}
}
2 changes: 2 additions & 0 deletions feature/login/src/main/java/pokitmons/pokit/LoginState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import pokitmons.pokit.domain.commom.PokitError
sealed class LoginState {
data object Init : LoginState()
data object Login : LoginState()
data object Registered : LoginState()
data object AutoLogin : LoginState()
data class Failed(val error: PokitError) : LoginState()
}

Expand Down
44 changes: 38 additions & 6 deletions feature/login/src/main/java/pokitmons/pokit/LoginViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import pokitmons.pokit.domain.commom.PokitResult
Expand All @@ -31,6 +32,13 @@ class LoginViewModel @Inject constructor(
private val signUpUseCase: SignUpUseCase,
private val tokenUseCase: TokenUseCase,
) : ViewModel() {
init {
viewModelScope.launch {
if (tokenUseCase.getAuthType().first() == "구글") {
_loginState.emit(LoginState.AutoLogin)
}
}
}
private var duplicateNicknameJob: Job? = null

private val _loginState: MutableStateFlow<LoginState> = MutableStateFlow(LoginState.Init)
Expand All @@ -48,6 +56,8 @@ class LoginViewModel @Inject constructor(
private val _categories = mutableStateListOf<CategoryState>()
val categories: List<CategoryState> get() = _categories

private var authType = ""

fun inputText(inputNickname: String) {
_inputNicknameState.update { duplicateNicknameState ->
duplicateNicknameState.copy(nickname = inputNickname)
Expand All @@ -63,12 +73,27 @@ class LoginViewModel @Inject constructor(

when (loginResult) {
is PokitResult.Success -> {
tokenUseCase.apply {
setAccessToken(loginResult.result.accessToken)
setRefreshToken(loginResult.result.refreshToken)
authType = authPlatform
when (loginResult.result.isRegistered) {
true -> {
tokenUseCase.apply {
setAccessToken(loginResult.result.accessToken)
setRefreshToken(loginResult.result.refreshToken)
setAuthType(authType)
}
_loginState.emit(LoginState.Registered)
}

false -> {
tokenUseCase.apply {
setAccessToken(loginResult.result.accessToken)
setRefreshToken(loginResult.result.refreshToken)
}
_loginState.emit(LoginState.Login)
}
}
_loginState.emit(LoginState.Login)
}

is PokitResult.Error -> _loginState.emit(LoginState.Failed(loginResult.error))
}
}
Expand All @@ -84,8 +109,14 @@ class LoginViewModel @Inject constructor(
.map { categoryState -> categoryState.name }
)
) {
is PokitResult.Success -> { _signUpState.emit(SignUpState.SignUp) }
is PokitResult.Error -> { _signUpState.emit(SignUpState.Failed(signUpResult.error)) }
is PokitResult.Success -> {
tokenUseCase.setAuthType(authType)
_signUpState.emit(SignUpState.SignUp)
}

is PokitResult.Error -> {
_signUpState.emit(SignUpState.Failed(signUpResult.error))
}
}
}
}
Expand All @@ -100,6 +131,7 @@ class LoginViewModel @Inject constructor(
duplicateNicknameState.copy(isDuplicate = duplicateNicknameResult.result.isDuplicate)
}
}

is PokitResult.Error -> {}
}
}
Expand Down
26 changes: 8 additions & 18 deletions feature/login/src/main/java/pokitmons/pokit/login/LoginScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
Expand All @@ -32,24 +31,19 @@ import com.google.firebase.auth.AuthResult
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.OAuthProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import pokitmons.pokit.LoginState
import pokitmons.pokit.LoginViewModel
import pokitmons.pokit.core.ui.components.atom.button.attributes.PokitLoginButtonType
import pokitmons.pokit.core.ui.components.atom.loginbutton.PokitLoginButton
import pokitmons.pokit.core.ui.theme.PokitTheme
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext

@SuppressLint("CoroutineCreationDuringComposition")
@Composable
fun LoginScreen(
loginViewModel: LoginViewModel,
onNavigateToTermsOfServiceScreen: () -> Unit,
onNavigateToHomeScreen: () -> Unit,
) {
val loginState by loginViewModel.loginState.collectAsState()
val context: Context = LocalContext.current
Expand All @@ -61,10 +55,17 @@ fun LoginScreen(
loginViewModel.changeState()
onNavigateToTermsOfServiceScreen()
}
is LoginState.Registered -> {
loginViewModel.changeState()
onNavigateToHomeScreen()
}
is LoginState.Failed -> {
// TODO 로그인 실패 바텀시트 렌더링
Toast.makeText(context, (loginState as LoginState.Failed).error.toString(), Toast.LENGTH_SHORT).show()
}
is LoginState.AutoLogin -> {
onNavigateToHomeScreen()
}
}

// Column 자체가 가운데로 오게 하려면?
Expand Down Expand Up @@ -201,14 +202,3 @@ private fun handleAuthResult(
}
}
}

@SuppressLint("ComposableNaming")
@Composable
fun <T> Flow<T>.collectAsEffect(
context: CoroutineContext = EmptyCoroutineContext,
block: (T) -> Unit,
) {
LaunchedEffect(Unit) {
onEach(block).flowOn(context).launchIn(this)
}
}
Loading