From 1416cc81dbf28fa95f6c68e82708cd766e95676b Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Tue, 3 Oct 2023 14:36:04 +0600 Subject: [PATCH 1/7] [~] fix ios language --- iosApp/iosApp/Info.plist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist index e442925a..5a446f7b 100644 --- a/iosApp/iosApp/Info.plist +++ b/iosApp/iosApp/Info.plist @@ -26,5 +26,9 @@ UIViewControllerBasedStatusBarAppearance + CFBundleLocalizations + en + ru + -- GitLab From 84b5b746ff82d485ad6b1ffc0e6d346d9db5d665 Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Tue, 3 Oct 2023 20:38:50 +0600 Subject: [PATCH 2/7] [~] add signIn useCase --- .../office/elevator/data/database/DBSource.kt | 1 + .../repository/AuthorizationRepositoryImpl.kt | 4 ++ .../elevator/domain/di/DomainModuleDI.kt | 3 ++ .../elevator/domain/useCase/SignInUseCase.kt | 38 +++++++++++++++++++ .../store/AuthorizationGoogleStoreImpl.kt | 10 +---- .../elevator/ui/root/store/RootStoreImpl.kt | 24 +++++++----- .../effective/office/utils/KtorEtherClient.kt | 1 + 7 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSource.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSource.kt index 6a8597f4..579e70ff 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSource.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/database/DBSource.kt @@ -9,4 +9,5 @@ interface DBSource { suspend fun update(user: User) fun deleteUserData() + } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt index c2c8932f..ad353986 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt @@ -11,6 +11,7 @@ import band.effective.office.network.dto.UserDTO import band.effective.office.network.model.Either import band.effective.office.network.model.ErrorResponse import band.effective.office.utils.KtorEtherClient +import io.github.aakira.napier.Napier import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow @@ -24,6 +25,9 @@ class AuthorizationRepositoryImpl( email: String ): Flow> = flow { KtorEtherClient.token = idToken + Napier.d { + "Token: ${KtorEtherClient.token}" + } val apiResponse = api.getUserByEmail(email = email) val userResponse = apiResponse.map( errorMapper = {it}, diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt index 4c6c6943..ba90dce2 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt @@ -18,6 +18,7 @@ import band.effective.office.elevator.domain.repository.WorkspaceRepository import band.effective.office.elevator.domain.useCase.AboutEmployeeInteractor import band.effective.office.elevator.domain.useCase.ChangeBookingUseCase import band.effective.office.elevator.domain.useCase.CreateBookingUseCase +import band.effective.office.elevator.domain.useCase.SignInUseCase import band.effective.office.elevator.domain.useCase.UpdateUserInfoUseCase import band.effective.office.elevator.domain.useCase.WorkspacesUseCase import org.koin.dsl.module @@ -57,4 +58,6 @@ internal val domainModuleDI = module { ) } single { WorkspaceRepositoryImpl(api = get()) } + + single { SignInUseCase(get(), get()) } } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt new file mode 100644 index 00000000..51259be4 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt @@ -0,0 +1,38 @@ +package band.effective.office.elevator.domain.useCase + +import band.effective.office.elevator.data.ApiResponse +import band.effective.office.elevator.domain.GoogleSignIn +import band.effective.office.elevator.domain.repository.AuthorizationRepository +import band.effective.office.elevator.ui.root.store.RootStore +import band.effective.office.network.model.Either +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map + +class SignInUseCase( + private val signInClient: GoogleSignIn, + private val authorizationRepository: AuthorizationRepository +) { + suspend fun signIn(): Flow> = flow { + when (val user = signInClient.retrieveAuthorizedUser()) { + is ApiResponse.Error.HttpError -> TODO() + ApiResponse.Error.NetworkError -> TODO() + ApiResponse.Error.SerializationError -> TODO() + ApiResponse.Error.UnknownError -> { + emit(Either.Error(Unit)) + } + is ApiResponse.Success -> { + authorizationRepository + .authorizeUser(idToken = user.body.idToken!!, email = user.body.email) + .collect{ response -> + emit( + when (response) { + is Either.Error -> Either.Error(Unit) + is Either.Success -> Either.Success(Unit) + } + ) + } + } + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_google/store/AuthorizationGoogleStoreImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_google/store/AuthorizationGoogleStoreImpl.kt index dbf803e4..99a575bb 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_google/store/AuthorizationGoogleStoreImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_google/store/AuthorizationGoogleStoreImpl.kt @@ -33,19 +33,11 @@ internal class AuthorizationGoogleStoreFactory( object : AuthorizationGoogleStore, Store by storeFactory.create( name = "AuthorizationStore", initialState = State(), - bootstrapper = coroutineBootstrapper { - launch { dispatch(Action.CheckUserAlreadySigned) } - }, executorFactory = ::ExecutorImpl, ) {} - private sealed interface Action { - object CheckUserAlreadySigned : Action - } - - private inner class ExecutorImpl : - CoroutineExecutor() { + CoroutineExecutor() { override fun executeIntent(intent: Intent, getState: () -> State) { when (intent) { Intent.SignInButtonClicked -> startAuthorization() diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt index 4b91f492..01881a1a 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/root/store/RootStoreImpl.kt @@ -3,8 +3,10 @@ package band.effective.office.elevator.ui.root.store import band.effective.office.elevator.data.ApiResponse import band.effective.office.elevator.data.database.DBSource import band.effective.office.elevator.domain.GoogleSignIn +import band.effective.office.elevator.domain.useCase.SignInUseCase import band.effective.office.elevator.ui.root.store.RootStore.Label import band.effective.office.elevator.ui.root.store.RootStore.State +import band.effective.office.network.model.Either import com.arkivanov.mvikotlin.core.store.Store import com.arkivanov.mvikotlin.core.store.StoreFactory import com.arkivanov.mvikotlin.core.utils.ExperimentalMviKotlinApi @@ -18,7 +20,7 @@ internal class RootStoreImplFactory( private val storeFactory: StoreFactory ) : KoinComponent { - private val signInClient: GoogleSignIn by inject() + private val signInUseCase: SignInUseCase by inject() @OptIn(ExperimentalMviKotlinApi::class) fun create(): RootStore = @@ -44,15 +46,19 @@ internal class RootStoreImplFactory( private fun checkUserAlreadySigned() { scope.launch { - when (signInClient.retrieveAuthorizedUser()) { - is ApiResponse.Error.HttpError -> TODO() - ApiResponse.Error.NetworkError -> TODO() - ApiResponse.Error.SerializationError -> TODO() - ApiResponse.Error.UnknownError -> { - publish(Label.UserNotSigned) + signInUseCase + .signIn() + .collect { response -> + when (response) { + is Either.Error<*> -> { + publish(Label.UserNotSigned) + } + + is Either.Success<*> -> { + publish(Label.UserAlreadySigned) + } + } } - is ApiResponse.Success -> publish(Label.UserAlreadySigned) - } } } } diff --git a/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt b/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt index d16e716f..9d4c0e8a 100644 --- a/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt +++ b/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt @@ -24,6 +24,7 @@ object KtorEtherClient { var token = BuildConfig.apiKey /**default http client with KtorEtherClient*/ val httpClient by lazy { + println("used token = $token") createHttpEngine().config { install(KtorEitherPlugin) install(Auth) { -- GitLab From 7a68d342431efc25455b98a376de3a136ecb089c Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Thu, 5 Oct 2023 22:00:11 +0600 Subject: [PATCH 3/7] [~] save commit --- composeApp/build.gradle.kts | 6 +++--- .../elevator/domain/AppActivityLifecycleObserver.kt | 8 +++++--- .../band/effective/office/elevator/domain/SignInResult.kt | 4 +++- .../elevator/domain/useCase/AuthorizationUseCase.kt | 6 ++---- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 354ae3ba..ccdd6589 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -151,7 +151,7 @@ android { minSdk = 26 targetSdk = 33 - applicationId = "band.effective.office.elevator.android" + applicationId = "band.effective.office.elevator" versionCode = 1 versionName = "1.0.0" } @@ -210,12 +210,12 @@ buildConfig { buildConfigField( "String", - "webClient", "\"726357293621-s4lju93oibotmefghoh3b3ucckalh933.apps.googleusercontent.com\"" + "webClient", "\"503255112190-4flfuu86ihrpismfl70nuae6u6n5gk4p.apps.googleusercontent.com\"" ) buildConfigField( "String", "iosClient", - "\"726357293621-hegk0410bsb1a5hvl3ihpc4d2bfkmlgb.apps.googleusercontent.com\"" + "\"503255112190-4flfuu86ihrpismfl70nuae6u6n5gk4p.apps.googleusercontent.com\"" ) } diff --git a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt index c8152db5..67deba09 100644 --- a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt +++ b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt @@ -1,6 +1,5 @@ package band.effective.office.elevator.domain -import android.content.Context import android.content.Intent import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.ActivityResultRegistry @@ -19,8 +18,6 @@ import com.google.android.gms.auth.api.signin.GoogleSignInStatusCodes import com.google.android.gms.auth.api.signin.GoogleSignInStatusCodes.SIGN_IN_CANCELLED import com.google.android.gms.common.api.ApiException import com.google.android.gms.tasks.Task -import dev.icerock.moko.resources.desc.Resource -import dev.icerock.moko.resources.desc.StringDesc import io.github.aakira.napier.Napier @@ -86,4 +83,9 @@ class AppActivityLifecycleObserver( fun signOut() { signInClient.signOut() } + + fun retrieveAuthorizedUser(callback: SignInResultCallback) { + val task = signInClient.silentSignIn() + when + } } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/SignInResult.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/SignInResult.kt index 33dc952b..01205e3c 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/SignInResult.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/SignInResult.kt @@ -1,6 +1,8 @@ package band.effective.office.elevator.domain +import band.effective.office.elevator.domain.models.GoogleAccount + interface SignInResultCallback { - fun onSuccess() + fun onSuccess(googleAccount: GoogleAccount) fun onFailure(message: String) } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt index 74e19185..7a79ede4 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt @@ -3,15 +3,13 @@ package band.effective.office.elevator.domain.useCase import band.effective.office.elevator.data.ApiResponse import band.effective.office.elevator.domain.GoogleSignIn import band.effective.office.elevator.domain.SignInResultCallback +import band.effective.office.elevator.domain.models.GoogleAccount import band.effective.office.elevator.domain.models.User import band.effective.office.elevator.domain.repository.AuthorizationRepository -import band.effective.office.elevator.ui.authorization.authorization_google.store.AuthorizationGoogleStore import band.effective.office.network.model.Either -import band.effective.office.network.model.ErrorResponse import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -24,7 +22,7 @@ class AuthorizationUseCase( successCallBack: (User) -> Unit, failureCallBack: (String) -> Unit, ) = googleSignIn.signIn(object : SignInResultCallback { - override fun onSuccess() { + override fun onSuccess(googleAccount: GoogleAccount) { scope.launch { when (val result = googleSignIn.retrieveAuthorizedUser()) { is ApiResponse.Error.HttpError -> {} -- GitLab From 827303d1b94fa3d4a0d152b1fa64192108e88267 Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Thu, 5 Oct 2023 23:11:44 +0600 Subject: [PATCH 4/7] [~] refactor authorize code --- .../domain/AppActivityLifecycleObserver.kt | 27 ++++++++- .../elevator/domain/GoogleSignInImpl.kt | 24 ++++---- .../elevator/domain/models/GoogleAccount.kt | 1 + .../domain/useCase/AuthorizationUseCase.kt | 55 ++++++++----------- .../elevator/domain/useCase/SignInUseCase.kt | 2 - .../elevator/domain/GoogleSignInImpl.kt | 28 +++++++--- 6 files changed, 78 insertions(+), 59 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt index 67deba09..81bdd7f0 100644 --- a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt +++ b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/AppActivityLifecycleObserver.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.LifecycleOwner import band.effective.office.elevator.AppActivity import band.effective.office.elevator.MainRes import band.effective.office.elevator.OfficeElevatorConfig +import band.effective.office.elevator.domain.models.GoogleAccount import band.effective.office.elevator.utils.getStringResource import com.google.android.gms.auth.api.proxy.AuthApiStatusCodes import com.google.android.gms.auth.api.signin.GoogleSignIn @@ -56,7 +57,8 @@ class AppActivityLifecycleObserver( try { val account: GoogleSignInAccount = task.getResult(ApiException::class.java) Napier.d { "ID_TOKEN = ${account.idToken}" } - callback.onSuccess() + + callback.onSuccess(account.toGoogleAccount()) } catch (e: ApiException) { Napier.e( "signInResult:failed code=" + e.statusCode + " | description: ${ @@ -86,6 +88,27 @@ class AppActivityLifecycleObserver( fun retrieveAuthorizedUser(callback: SignInResultCallback) { val task = signInClient.silentSignIn() - when + if (task.isSuccessful) { + // There's immediate result available. + val signInAccount = task.result + callback.onSuccess(signInAccount.toGoogleAccount()) + } else { + task.addOnCompleteListener { task -> + try { + val signInAccount = task.getResult(ApiException::class.java) + callback.onSuccess(signInAccount.toGoogleAccount()) + } catch (apiException: ApiException) { + callback.onFailure(apiException.message.orEmpty()) + } + } + } } + + private fun GoogleSignInAccount.toGoogleAccount() = + GoogleAccount( + email = email!!, + name = displayName!!, + photoUrl = photoUrl.toString(), + idToken = idToken + ) } diff --git a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt index 275080a7..f375dc6c 100644 --- a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt +++ b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt @@ -17,20 +17,16 @@ class GoogleSignInImpl : GoogleSignIn { override suspend fun retrieveAuthorizedUser(): ApiResponse { return suspendCoroutine { continuation -> - val account: GoogleSignInAccount? = - GoogleAuthorization.getLastSignedInAccount(AndroidApp.INSTANCE) - continuation.resume( - if (account == null) { - ApiResponse.Error.UnknownError - } else { - ApiResponse.Success( - GoogleAccount( - email = account.email!!, - name = account.displayName!!, - photoUrl = account.photoUrl.toString(), - idToken = account.idToken - ) - ) + activity.appActivityLifecycleObserver.retrieveAuthorizedUser( + object: SignInResultCallback { + override fun onSuccess(googleAccount: GoogleAccount) { + continuation.resume(ApiResponse.Success(googleAccount)) + } + + override fun onFailure(message: String) { + continuation.resume(ApiResponse.Error.UnknownError) + } + } ) } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/GoogleAccount.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/GoogleAccount.kt index cb1e1870..8bfce475 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/GoogleAccount.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/GoogleAccount.kt @@ -6,3 +6,4 @@ data class GoogleAccount( val photoUrl: String?, val idToken: String? ) + diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt index 7a79ede4..ee4a1698 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/AuthorizationUseCase.kt @@ -1,12 +1,12 @@ package band.effective.office.elevator.domain.useCase -import band.effective.office.elevator.data.ApiResponse import band.effective.office.elevator.domain.GoogleSignIn import band.effective.office.elevator.domain.SignInResultCallback import band.effective.office.elevator.domain.models.GoogleAccount import band.effective.office.elevator.domain.models.User import band.effective.office.elevator.domain.repository.AuthorizationRepository import band.effective.office.network.model.Either +import io.github.aakira.napier.Napier import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO @@ -22,42 +22,33 @@ class AuthorizationUseCase( successCallBack: (User) -> Unit, failureCallBack: (String) -> Unit, ) = googleSignIn.signIn(object : SignInResultCallback { - override fun onSuccess(googleAccount: GoogleAccount) { - scope.launch { - when (val result = googleSignIn.retrieveAuthorizedUser()) { - is ApiResponse.Error.HttpError -> {} - ApiResponse.Error.NetworkError -> {} - ApiResponse.Error.SerializationError -> {} - ApiResponse.Error.UnknownError -> {} - is ApiResponse.Success -> { - withContext(Dispatchers.IO) { - result.body.idToken?.let { token -> - authorizationRepository - .authorizeUser(idToken = token, email = result.body.email) - .collect { response -> - when (response) { - is Either.Success -> { - withContext(Dispatchers.Main) { - println("autorize success") - successCallBack(response.data) - } - } - is Either.Error -> { - println("autorize error ${response.error.description}") - // TODO show error and data - } - } - } + override fun onSuccess(googleAccount: GoogleAccount) { + scope.launch(Dispatchers.IO) { + googleAccount.idToken?.let { token -> + authorizationRepository + .authorizeUser(idToken = token, email = googleAccount.email) + .collect { response -> + when (response) { + is Either.Success -> { + withContext(Dispatchers.Main) { + Napier.d { "autorize success" } + successCallBack(response.data) + } + } + is Either.Error -> { + Napier.d {"autorize error ${response.error.description}"} + // TODO show error and data } } } - } } } - override fun onFailure(message: String) { - failureCallBack(message) - } - }) + } + + override fun onFailure(message: String) { + failureCallBack(message) + } + }) fun logout() { googleSignIn.signOut() diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt index 51259be4..791352b5 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/useCase/SignInUseCase.kt @@ -3,11 +3,9 @@ package band.effective.office.elevator.domain.useCase import band.effective.office.elevator.data.ApiResponse import band.effective.office.elevator.domain.GoogleSignIn import band.effective.office.elevator.domain.repository.AuthorizationRepository -import band.effective.office.elevator.ui.root.store.RootStore import band.effective.office.network.model.Either import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.map class SignInUseCase( private val signInClient: GoogleSignIn, diff --git a/composeApp/src/iosMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt b/composeApp/src/iosMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt index 5f5cb6d1..9949317f 100644 --- a/composeApp/src/iosMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt +++ b/composeApp/src/iosMain/kotlin/band/effective/office/elevator/domain/GoogleSignInImpl.kt @@ -5,6 +5,7 @@ import band.effective.office.elevator.data.ApiResponse import band.effective.office.elevator.domain.models.GoogleAccount import band.effective.office.elevator.ui.uiViewController import cocoapods.GoogleSignIn.GIDConfiguration +import cocoapods.GoogleSignIn.GIDGoogleUser import cocoapods.GoogleSignIn.GIDSignIn import dev.icerock.moko.resources.desc.desc import kotlinx.coroutines.CoroutineScope @@ -31,16 +32,10 @@ class GoogleSignInImpl(gidClientId: String, serverClientId: String) : GoogleSign return suspendCoroutine { continuation -> GIDSignIn.sharedInstance.restorePreviousSignInWithCompletion { result, _ -> scope.launch { - result?.profile?.let { profileData -> - val dimension = round(100 * UIScreen.mainScreen.scale) + result?.profile?.let { continuation.resume( ApiResponse.Success( - GoogleAccount( - email = profileData.email, - name = profileData.name, - photoUrl = profileData.imageURLWithDimension(dimension = dimension.toULong())?.absoluteString, - idToken = result.idToken?.tokenString - ) + result.toGoogleAccount() ) ) } ?: continuation.resume(ApiResponse.Error.UnknownError) @@ -52,11 +47,26 @@ class GoogleSignInImpl(gidClientId: String, serverClientId: String) : GoogleSign override fun signIn(callback: SignInResultCallback) { GIDSignIn.sharedInstance.signInWithPresentingViewController(uiViewController) { result, error -> if (result == null) callback.onFailure(MainRes.strings.something_went_wrong.desc().localized()) - else callback.onSuccess() + else { + val account = result.user + account.profile?.let { + callback.onSuccess(account.toGoogleAccount()) + } ?: callback.onFailure("") + } } } override fun signOut() { GIDSignIn.sharedInstance.signOut() } + + private fun GIDGoogleUser.toGoogleAccount(): GoogleAccount{ + val dimension = round(100 * UIScreen.mainScreen.scale) + return GoogleAccount( + email = profile!!.email, + name = profile!!.name, + photoUrl = profile!!.imageURLWithDimension(dimension = dimension.toULong())?.absoluteString, + idToken = idToken?.tokenString + ) + } } -- GitLab From 366668bf4ad488a6bb678d6dc056cdf9f3c04bad Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Fri, 6 Oct 2023 00:07:48 +0600 Subject: [PATCH 5/7] [~] add ios id google --- composeApp/build.gradle.kts | 2 +- iosApp/iosApp/Info.plist | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index ccdd6589..b04e4043 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -215,7 +215,7 @@ buildConfig { buildConfigField( "String", "iosClient", - "\"503255112190-4flfuu86ihrpismfl70nuae6u6n5gk4p.apps.googleusercontent.com\"" + "\"503255112190-a3n1441gcnl7alamoqkvk9omtv5q97tl.apps.googleusercontent.com\"" ) } diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist index 5a446f7b..ac729daf 100644 --- a/iosApp/iosApp/Info.plist +++ b/iosApp/iosApp/Info.plist @@ -2,12 +2,19 @@ + CFBundleLocalizations + + en + ru + CFBundleURLTypes + CFBundleTypeRole + Editor CFBundleURLSchemes - com.googleusercontent.apps.726357293621-hegk0410bsb1a5hvl3ihpc4d2bfkmlgb + com.googleusercontent.apps.503255112190-a3n1441gcnl7alamoqkvk9omtv5q97tl @@ -26,9 +33,5 @@ UIViewControllerBasedStatusBarAppearance - CFBundleLocalizations - en - ru - -- GitLab From bd54f5946852d91f0b8477c0cc3033298f19b533 Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Wed, 11 Oct 2023 00:24:55 +0600 Subject: [PATCH 6/7] [~] fix employee query --- .../elevator/ui/employee/allEmployee/EmployeeScreen.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt index 2d9b0918..3c089858 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt @@ -88,6 +88,10 @@ fun EmployeeScreenContent( onTextFieldUpdate: (String) -> Unit, isLoading: Boolean ) { + //TODO(Artem Gruzdev) need to fix this. We should to use snapshotFlow or derivedStateOf for showing + // query result + // see there: https://medium.com/androiddevelopers/effective-state-management-for-textfield-in-compose-d6e5b070fbe5 + var query by remember { mutableStateOf(userMessageState) } Column { Column( @@ -104,7 +108,8 @@ fun EmployeeScreenContent( modifier = Modifier.padding(start = 20.dp, top = 55.dp, end = 15.dp, bottom = 25.dp) ) TextField( - value = userMessageState, onValueChange = { + value = query, onValueChange = { + query = it onTextFieldUpdate(it) }, modifier = Modifier .fillMaxWidth() -- GitLab From 5638acf8b610637c0fa213b5832e9f44d7e5b1b9 Mon Sep 17 00:00:00 2001 From: Artem Gruzdev Date: Wed, 11 Oct 2023 02:08:46 +0600 Subject: [PATCH 7/7] [~] fix authorize --- .../data/repository/AuthorizationRepositoryImpl.kt | 2 +- .../band/effective/office/utils/KtorEtherClient.kt | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt index ad353986..1d25e4fd 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/repository/AuthorizationRepositoryImpl.kt @@ -24,7 +24,7 @@ class AuthorizationRepositoryImpl( idToken: String, email: String ): Flow> = flow { - KtorEtherClient.token = idToken + KtorEtherClient.token.add(idToken) Napier.d { "Token: ${KtorEtherClient.token}" } diff --git a/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt b/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt index 9d4c0e8a..2593a9dc 100644 --- a/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt +++ b/contract/src/commonMain/kotlin/band/effective/office/utils/KtorEtherClient.kt @@ -21,16 +21,21 @@ import io.ktor.serialization.kotlinx.json.json object KtorEtherClient { /**token for authorization*/ - var token = BuildConfig.apiKey + var token = mutableListOf(BuildConfig.apiKey) /**default http client with KtorEtherClient*/ val httpClient by lazy { - println("used token = $token") + createHttpEngine().config { install(KtorEitherPlugin) install(Auth) { bearer { loadTokens { - BearerTokens(token, "") + println("used token = ${token.last()}") + BearerTokens(token.last(), "") + } + refreshTokens { + println("calling refresh") + BearerTokens(token.last(), "") } } } -- GitLab