Skip to content
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
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ android {
applicationId = "co.kr.tnt"
minSdk = 27
targetSdk = 35
versionCode = 2
versionCode = 3
versionName = "0.0.1"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
Expand Down
14 changes: 13 additions & 1 deletion core/login/src/main/java/co/kr/tnt/login/kakao/KakaoLoginSdk.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import co.kr.tnt.login.LoginException.AuthException
import co.kr.tnt.login.LoginException.CancelException
import co.kr.tnt.login.LoginSdk
import com.kakao.sdk.auth.model.OAuthToken
import com.kakao.sdk.common.model.AuthError
import com.kakao.sdk.common.model.ClientError
import com.kakao.sdk.common.model.ClientErrorCause
import com.kakao.sdk.user.UserApiClient
Expand Down Expand Up @@ -42,7 +43,18 @@ class KakaoLoginSdk @Inject constructor() : LoginSdk {

if (userApiClient.isKakaoTalkLoginAvailable(context)) {
// 카카오톡 로그인
userApiClient.loginWithKakaoTalk(context, callback = callback)
userApiClient.loginWithKakaoTalk(
context,
callback = callback@{ oAuthToken, throwable ->
// 카카오톡이 설치되어 있으나 로그인되어 있지 않은 경우 대응
if (throwable is AuthError && throwable.statusCode == 302) {
userApiClient.loginWithKakaoAccount(context, callback = callback)
return@callback
}

callback(oAuthToken, throwable)
},
)
} else {
// 카카오톡 웹 로그인
userApiClient.loginWithKakaoAccount(context, callback = callback)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,23 @@ sealed interface Route {
val authId: String,
val authType: String,
val email: String,
val messagingToken: String,
) : Route

@Serializable
data class TrainerSignUp(
val authId: String,
val authType: String,
val email: String,
val messagingToken: String,
) : Route

@Serializable
data class TraineeSignUp(
val authId: String,
val authType: String,
val email: String,
val messagingToken: String,
) : Route

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,18 @@ internal class SignUpRepositoryImpl @Inject constructor(
socialId: String,
socialType: String,
email: String,
messagingToken: String,
): SignUpResult {
val profileImagePart = profileImage?.let {
val requestFile = it.asRequestBody("image/*".toMediaTypeOrNull())
MultipartBody.Part.createFormData("profileImage", it.name, requestFile)
}

// TODO FCM token
val signUpRequest = user.toSignUpRequest(
socialId = socialId,
socialType = socialType,
email = email,
fcmToken = "EMPTY",
fcmToken = messagingToken,
)
val requestBody = signUpRequest.toRequestBody()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ interface SignUpRepository {
socialId: String,
socialType: String,
email: String,
messagingToken: String,
): SignUpResult
}
5 changes: 4 additions & 1 deletion feature/login/src/main/java/co/kr/tnt/login/LoginContract.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ internal class LoginContract {
data class ShowToast(val message: String) : LoginSideEffect
data class NavigateToWebView(val url: String) : LoginSideEffect
data class NavigateToHome(val userType: UserType) : LoginSideEffect
data class NavigateToSignup(val loginResult: LoginResult) : LoginSideEffect
data class NavigateToSignup(
val loginResult: LoginResult,
val messagingToken: String,
) : LoginSideEffect
}
}
6 changes: 4 additions & 2 deletions feature/login/src/main/java/co/kr/tnt/login/LoginScreen.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package co.kr.tnt.login

import android.util.Log
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
Expand Down Expand Up @@ -65,7 +66,7 @@ internal fun LoginRoute(
viewModel: LoginViewModel = hiltViewModel(),
navigateToWebView: (url: String) -> Unit,
navigateToHome: (UserType) -> Unit,
navigateToSignup: (LoginResult) -> Unit,
navigateToSignup: (loginResult: LoginResult, messagingToken: String) -> Unit,
) {
val context = LocalContext.current
val snackbar = LocalSnackbar.current
Expand All @@ -91,6 +92,7 @@ internal fun LoginRoute(
)
}
.onFailure { throwable ->
Log.e("TnT Login error", throwable.toString())
viewModel.setEvent(LoginUiEvent.OnAuthFail(throwable))
}
}
Expand Down Expand Up @@ -137,7 +139,7 @@ internal fun LoginRoute(

is LoginSideEffect.NavigateToSignup -> {
showBottomSheet = false
navigateToSignup(effect.loginResult)
navigateToSignup(effect.loginResult, effect.messagingToken)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ internal class LoginViewModel @Inject constructor(

private fun navigateToSignup() {
loginResult?.let { loginResult ->
sendEffect(LoginSideEffect.NavigateToSignup(loginResult))
sendEffect(LoginSideEffect.NavigateToSignup(loginResult, messagingToken))
[email protected] = null
} ?: run {
sendEffect(LoginSideEffect.ShowToast("로그인에 실패하였습니다. 다시 시도해주세요."))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ fun NavController.navigateToLogin(
fun NavGraphBuilder.loginScreen(
navigateToWebView: (url: String) -> Unit,
navigateToHome: (UserType) -> Unit,
navigateToSignup: (LoginResult) -> Unit,
navigateToSignup: (loginResult: LoginResult, messagingToken: String) -> Unit,
) {
composable<Route.Login> {
LoginRoute(
Expand Down
3 changes: 2 additions & 1 deletion feature/main/src/main/java/co/kr/tnt/main/ui/TnTNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,12 @@ fun TnTNavHost(
UserType.TRAINEE -> navController.navigateToTraineeMain(clearBackStack = true)
}
},
navigateToSignup = { loginResult ->
navigateToSignup = { loginResult, messagingToken ->
navController.navigateToRoleSelection(
authId = loginResult.authId,
authType = loginResult.authType.name,
email = loginResult.email,
messagingToken = messagingToken,
)
},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,27 @@ fun NavController.navigateToRoleSelection(
authId: String,
authType: String,
email: String,
messagingToken: String,
navOptions: NavOptionsBuilder.() -> Unit = {},
) = navigate(
route = Route.RoleSelection(
authId = authId,
authType = authType,
email = email,
messagingToken = messagingToken,
),
builder = navOptions,
)

fun NavGraphBuilder.roleSelectionScreen(
navigateToTraineeSignUp: (authId: String, authType: String, email: String) -> Unit,
navigateToTrainerSignUp: (authId: String, authType: String, email: String) -> Unit,
navigateToTraineeSignUp: (authId: String, authType: String, email: String, messagingToken: String) -> Unit,
navigateToTrainerSignUp: (authId: String, authType: String, email: String, messagingToken: String) -> Unit,
) {
composable<Route.RoleSelection> { navBackstackEntry ->
navBackstackEntry.toRoute<Route.RoleSelection>().apply {
RoleSelectionRoute(
navigateToTraineeSignUp = { navigateToTraineeSignUp(authId, authType, email) },
navigateToTrainerSignUp = { navigateToTrainerSignUp(authId, authType, email) },
navigateToTraineeSignUp = { navigateToTraineeSignUp(authId, authType, email, messagingToken) },
navigateToTrainerSignUp = { navigateToTrainerSignUp(authId, authType, email, messagingToken) },
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ internal class TraineeSignUpContract {
val id: String,
val email: String,
val authType: String,
val messagingToken: String,
) : TraineeSignUpUiEvent
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ internal fun TraineeSignUpRoute(
authId: String,
authType: String,
email: String,
messagingToken: String,
navigateToPrevious: () -> Unit,
navigateToConnect: () -> Unit,
viewModel: TraineeSignUpViewModel = hiltViewModel(),
Expand Down Expand Up @@ -46,6 +47,7 @@ internal fun TraineeSignUpRoute(
id = authId,
email = email,
authType = authType,
messagingToken = messagingToken,
),
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ internal class TraineeSignUpViewModel @Inject constructor(
id = event.id,
email = event.email,
authType = event.authType,
messagingToken = event.messagingToken,
)
}
}
Expand All @@ -53,6 +54,7 @@ internal class TraineeSignUpViewModel @Inject constructor(
id: String,
email: String,
authType: String,
messagingToken: String,
) {
viewModelScope.launch {
updateState { copy(isLoading = true) }
Expand Down Expand Up @@ -83,6 +85,7 @@ internal class TraineeSignUpViewModel @Inject constructor(
socialId = id,
socialType = authType,
email = email,
messagingToken = messagingToken,
)
}.onSuccess {
sendEffect(TraineeSignUpEffect.NavigateToConnect)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ fun NavController.navigateToTraineeSignUp(
authId: String,
authType: String,
email: String,
messagingToken: String,
navOptions: NavOptionsBuilder.() -> Unit = {},
) = navigate(
route = Route.TraineeSignUp(
authId = authId,
authType = authType,
email = email,
messagingToken = messagingToken,
),
builder = navOptions,
)
Expand All @@ -32,6 +34,7 @@ fun NavGraphBuilder.traineeSignUpScreen(
authId = authId,
authType = authType,
email = email,
messagingToken = messagingToken,
navigateToPrevious = navigateToPrevious,
navigateToConnect = navigateToConnect,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ internal class TrainerSignUpContract {
val id: String,
val email: String,
val authType: String,
val messagingToken: String,
) : TrainerSignUpUiEvent
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ internal fun TrainerSignUpRoute(
authId: String,
authType: String,
email: String,
messagingToken: String,
navigateToPrevious: () -> Unit,
navigateToInvite: (ScreenMode) -> Unit,
viewModel: TrainerSignUpViewModel = hiltViewModel(),
Expand All @@ -39,6 +40,7 @@ internal fun TrainerSignUpRoute(
id = authId,
email = email,
authType = authType,
messagingToken = messagingToken,
),
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ internal class TrainerSignUpViewModel @Inject constructor(
id = event.id,
email = event.email,
authType = event.authType,
messagingToken = event.messagingToken,
)
}
}
Expand All @@ -49,6 +50,7 @@ internal class TrainerSignUpViewModel @Inject constructor(
id: String,
email: String,
authType: String,
messagingToken: String,
) {
viewModelScope.launch(Dispatchers.IO) {
updateState { copy(isLoading = true) }
Expand All @@ -73,6 +75,7 @@ internal class TrainerSignUpViewModel @Inject constructor(
socialId = id,
socialType = authType,
email = email,
messagingToken = messagingToken,
)
}.onSuccess {
sendEffect(TrainerSignUpEffect.NavigateToConnect)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ fun NavController.navigateToTrainerSignUp(
authId: String,
authType: String,
email: String,
messagingToken: String,
navOptions: NavOptionsBuilder.() -> Unit = {},
) = navigate(
route = Route.TrainerSignUp(
authId = authId,
authType = authType,
email = email,
messagingToken = messagingToken,
),
builder = navOptions,
)
Expand All @@ -33,6 +35,7 @@ fun NavGraphBuilder.trainerSignUpScreen(
authId = authId,
authType = authType,
email = email,
messagingToken = messagingToken,
navigateToPrevious = navigateToPrevious,
navigateToInvite = navigateToInvite,
)
Expand Down