Skip to content

Commit 3833e46

Browse files
authored
make OAuthProvider immutable and remove signIn method (#95)
* make OAuthProvider immutable and remove signIn method * add cast for setCustomParameters on ios
1 parent 9fb0d0d commit 3833e46

File tree

7 files changed

+65
-89
lines changed

7 files changed

+65
-89
lines changed

firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/auth.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,25 @@ actual class FirebaseAuth internal constructor(val android: com.google.firebase.
2727
actual val currentUser: FirebaseUser?
2828
get() = android.currentUser?.let { FirebaseUser(it) }
2929

30-
actual val authStateChanged get() = callbackFlow<FirebaseUser?> {
31-
val listener = AuthStateListener { auth -> safeOffer(auth.currentUser?.let { FirebaseUser(it) }) }
30+
actual val authStateChanged: Flow<FirebaseUser?> get() = callbackFlow {
31+
val listener = object : AuthStateListener {
32+
override fun onAuthStateChanged(auth: com.google.firebase.auth.FirebaseAuth) {
33+
safeOffer(auth.currentUser?.let { FirebaseUser(it) })
34+
}
35+
}
3236
android.addAuthStateListener(listener)
3337
awaitClose { android.removeAuthStateListener(listener) }
3438
}
3539

36-
actual val idTokenChanged: Flow<FirebaseUser?>
37-
get() = callbackFlow {
38-
val listener = com.google.firebase.auth.FirebaseAuth.IdTokenListener { auth -> safeOffer(auth.currentUser?.let { FirebaseUser(it) }) }
39-
android.addIdTokenListener(listener)
40-
awaitClose { android.removeIdTokenListener(listener) }
40+
actual val idTokenChanged get(): Flow<FirebaseUser?> = callbackFlow {
41+
val listener = object : com.google.firebase.auth.FirebaseAuth.IdTokenListener {
42+
override fun onIdTokenChanged(auth: com.google.firebase.auth.FirebaseAuth) {
43+
safeOffer(auth.currentUser?.let { FirebaseUser(it) })
44+
}
4145
}
46+
android.addIdTokenListener(listener)
47+
awaitClose { android.removeIdTokenListener(listener) }
48+
}
4249

4350
actual var languageCode: String
4451
get() = android.languageCode ?: ""
@@ -78,7 +85,6 @@ actual class FirebaseAuth internal constructor(val android: com.google.firebase.
7885
val result = android.checkActionCode(code).await()
7986
@Suppress("UNCHECKED_CAST")
8087
return when(result.operation) {
81-
ERROR -> ActionCodeResult.Error
8288
SIGN_IN_WITH_EMAIL_LINK -> ActionCodeResult.SignInWithEmailLink
8389
VERIFY_EMAIL -> ActionCodeResult.VerifyEmail(result.info!!.email)
8490
PASSWORD_RESET -> ActionCodeResult.PasswordReset(result.info!!.email)
@@ -91,6 +97,7 @@ actual class FirebaseAuth internal constructor(val android: com.google.firebase.
9197
REVERT_SECOND_FACTOR_ADDITION -> (result.info as ActionCodeMultiFactorInfo).run {
9298
ActionCodeResult.RevertSecondFactorAddition(email, MultiFactorInfo(multiFactorInfo))
9399
}
100+
ERROR -> throw UnsupportedOperationException(result.operation.toString())
94101
else -> throw UnsupportedOperationException(result.operation.toString())
95102
} as T
96103
}

firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/credentials.kt

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,39 +42,38 @@ actual object GoogleAuthProvider {
4242
actual fun credential(idToken: String, accessToken: String): AuthCredential = AuthCredential(com.google.firebase.auth.GoogleAuthProvider.getCredential(idToken, accessToken))
4343
}
4444

45-
actual class OAuthProvider(val android: com.google.firebase.auth.OAuthProvider.Builder, private val auth: FirebaseAuth) {
46-
actual constructor(provider: String, auth: FirebaseAuth) : this(com.google.firebase.auth.OAuthProvider.newBuilder(provider, auth.android), auth)
45+
actual class OAuthProvider(val android: com.google.firebase.auth.OAuthProvider) {
46+
47+
actual constructor(
48+
provider: String,
49+
scopes: List<String>,
50+
customParameters: Map<String, String>,
51+
auth: FirebaseAuth
52+
) : this(
53+
com.google.firebase.auth.OAuthProvider
54+
.newBuilder(provider, auth.android)
55+
.setScopes(scopes)
56+
.addCustomParameters(customParameters)
57+
.build()
58+
)
4759

4860
actual companion object {
4961
actual fun credential(providerId: String, accessToken: String?, idToken: String?, rawNonce: String?): OAuthCredential {
5062
val builder = OAuthProvider.newCredentialBuilder(providerId)
51-
accessToken?.let { builder.accessToken = it }
52-
idToken?.let { builder.idToken = it }
63+
accessToken?.let { builder.setAccessToken(it) }
64+
idToken?.let { builder.setIdToken(it) }
5365
rawNonce?.let { builder.setIdTokenWithRawNonce(idToken!!, it) }
5466
return OAuthCredential(builder.build() as com.google.firebase.auth.OAuthCredential)
5567
}
5668
}
57-
58-
private var customParameters: Map<String, String> = emptyMap()
59-
60-
actual fun addScope(vararg scope: String) {
61-
android.scopes = android.scopes + scope.asList()
62-
}
63-
actual fun setCustomParameters(parameters: Map<String, String>) {
64-
customParameters = parameters
65-
}
66-
67-
actual suspend fun signIn(signInProvider: SignInProvider): AuthResult = AuthResult(auth.android.startActivityForSignInWithProvider(signInProvider, android.apply { addCustomParameters(customParameters) }.build()).await())
6869
}
6970

70-
actual typealias SignInProvider = Activity
71-
7271
actual class PhoneAuthProvider(val android: com.google.firebase.auth.PhoneAuthProvider) {
7372

74-
7573
actual constructor(auth: FirebaseAuth) : this(com.google.firebase.auth.PhoneAuthProvider.getInstance(auth.android))
7674

7775
actual fun credential(verificationId: String, smsCode: String): PhoneAuthCredential = PhoneAuthCredential(com.google.firebase.auth.PhoneAuthProvider.getCredential(verificationId, smsCode))
76+
7877
actual suspend fun verifyPhoneNumber(phoneNumber: String, verificationProvider: PhoneVerificationProvider): AuthCredential = coroutineScope {
7978
val response = CompletableDeferred<Result<AuthCredential>>()
8079
val callback = object :

firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/auth.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ expect class AuthResult {
4141
}
4242

4343
sealed class ActionCodeResult {
44-
object Error : ActionCodeResult()
4544
object SignInWithEmailLink : ActionCodeResult()
4645
class PasswordReset internal constructor(val email: String) : ActionCodeResult()
4746
class VerifyEmail internal constructor(val email: String) : ActionCodeResult()

firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/credentials.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,17 @@ expect object GoogleAuthProvider {
2929
fun credential(idToken: String, accessToken: String): AuthCredential
3030
}
3131

32-
expect class OAuthProvider constructor(provider: String, auth: FirebaseAuth = Firebase.auth) {
32+
expect class OAuthProvider constructor(
33+
provider: String,
34+
scopes: List<String> = emptyList(),
35+
customParameters: Map<String, String> = emptyMap(),
36+
auth: FirebaseAuth = Firebase.auth
37+
) {
3338
companion object {
3439
fun credential(providerId: String, accessToken: String? = null, idToken: String? = null, rawNonce: String? = null): OAuthCredential
3540
}
36-
37-
fun addScope(vararg scope: String)
38-
fun setCustomParameters(parameters: Map<String, String>)
39-
40-
suspend fun signIn(signInProvider: SignInProvider): AuthResult
4141
}
4242

43-
expect class SignInProvider
44-
4543
expect class PhoneAuthProvider constructor(auth: FirebaseAuth = Firebase.auth) {
4644
fun credential(verificationId: String, smsCode: String): PhoneAuthCredential
4745
suspend fun verifyPhoneNumber(phoneNumber: String, verificationProvider: PhoneVerificationProvider): AuthCredential

firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,13 @@ actual class FirebaseAuth internal constructor(val ios: FIRAuth) {
7979
val result: FIRActionCodeInfo = ios.awaitResult { checkActionCode(code, it) }
8080
@Suppress("UNCHECKED_CAST")
8181
return when(result.operation) {
82-
FIRActionCodeOperationUnknown -> Error
8382
FIRActionCodeOperationEmailLink -> SignInWithEmailLink
8483
FIRActionCodeOperationVerifyEmail -> VerifyEmail(result.email!!)
8584
FIRActionCodeOperationPasswordReset -> PasswordReset(result.email!!)
8685
FIRActionCodeOperationRecoverEmail -> RecoverEmail(result.email!!, result.previousEmail!!)
8786
FIRActionCodeOperationVerifyAndChangeEmail -> VerifyBeforeChangeEmail(result.email!!, result.previousEmail!!)
8887
FIRActionCodeOperationRevertSecondFactorAddition -> RevertSecondFactorAddition(result.email!!, null)
88+
FIRActionCodeOperationUnknown -> throw UnsupportedOperationException(result.operation.toString())
8989
else -> throw UnsupportedOperationException(result.operation.toString())
9090
} as T
9191
}

firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/credentials.kt

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,18 @@ actual object GoogleAuthProvider {
3434
actual fun credential(idToken: String, accessToken: String): AuthCredential = AuthCredential(FIRGoogleAuthProvider.credentialWithIDToken(idToken, accessToken))
3535
}
3636

37-
actual class OAuthProvider(val ios: FIROAuthProvider, private val auth: FirebaseAuth) {
38-
actual constructor(provider: String, auth: FirebaseAuth) : this(FIROAuthProvider.providerWithProviderID(provider, auth.ios), auth)
37+
actual class OAuthProvider(val ios: FIROAuthProvider) {
38+
39+
actual constructor(
40+
provider: String,
41+
scopes: List<String>,
42+
customParameters: Map<String, String>,
43+
auth: FirebaseAuth
44+
) : this(FIROAuthProvider.providerWithProviderID(provider, auth.ios)) {
45+
ios.setScopes(scopes)
46+
@Suppress("UNCHECKED_CAST")
47+
ios.setCustomParameters(customParameters as Map<Any?, *>)
48+
}
3949

4050
actual companion object {
4151
actual fun credential(providerId: String, accessToken: String?, idToken: String?, rawNonce: String?): OAuthCredential {
@@ -48,37 +58,14 @@ actual class OAuthProvider(val ios: FIROAuthProvider, private val auth: Firebase
4858
return OAuthCredential(credential)
4959
}
5060
}
51-
52-
actual fun addScope(vararg scope: String) {
53-
val scopes = ios.scopes?.mapNotNull { it as? String } ?: emptyList()
54-
ios.setScopes(scopes + scope.asList())
55-
}
56-
57-
actual fun setCustomParameters(parameters: Map<String, String>) {
58-
ios.setCustomParameters(emptyMap<Any?, Any?>() + parameters)
59-
}
60-
61-
private fun getCustomParameters(): Map<String, String> {
62-
val customParameters = ios.customParameters ?: emptyMap<Any?, Any?>()
63-
return customParameters.mapNotNull {
64-
val key = it.key
65-
val value = it.value
66-
if (key is String && value is String)
67-
key to value
68-
else
69-
null}.toMap()
70-
}
71-
72-
actual suspend fun signIn(signInProvider: SignInProvider): AuthResult = AuthResult(ios.awaitResult { auth.ios.signInWithProvider(ios, signInProvider.delegate, it) })
7361
}
7462

75-
actual class SignInProvider(val delegate: FIRAuthUIDelegateProtocol)
76-
7763
actual class PhoneAuthProvider(val ios: FIRPhoneAuthProvider) {
7864

7965
actual constructor(auth: FirebaseAuth) : this(FIRPhoneAuthProvider.providerWithAuth(auth.ios))
8066

8167
actual fun credential(verificationId: String, smsCode: String): PhoneAuthCredential = PhoneAuthCredential(ios.credentialWithVerificationID(verificationId, smsCode))
68+
8269
actual suspend fun verifyPhoneNumber(phoneNumber: String, verificationProvider: PhoneVerificationProvider): AuthCredential {
8370
val verificationId: String = ios.awaitResult { ios.verifyPhoneNumber(phoneNumber, verificationProvider.delegate, it) }
8471
val verificationCode = verificationProvider.getVerificationCode()

firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/credentials.kt

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,19 @@ actual object GoogleAuthProvider {
3333
AuthCredential(firebase.auth.GoogleAuthProvider.credential(idToken, accessToken))
3434
}
3535

36-
actual class OAuthProvider(val js: firebase.auth.OAuthProvider, private val auth: FirebaseAuth) {
37-
actual constructor(provider: String, auth: FirebaseAuth) : this(firebase.auth.OAuthProvider(provider), auth)
38-
36+
actual class OAuthProvider(val js: firebase.auth.OAuthProvider) {
37+
38+
actual constructor(
39+
provider: String,
40+
scopes: List<String>,
41+
customParameters: Map<String, String>,
42+
auth: FirebaseAuth
43+
) : this(firebase.auth.OAuthProvider(provider)) {
44+
rethrow {
45+
scopes.forEach { js.addScope(it) }
46+
js.setCustomParameters(customParameters)
47+
}
48+
}
3949
actual companion object {
4050
actual fun credential(providerId: String, accessToken: String?, idToken: String?, rawNonce: String?): OAuthCredential = rethrow {
4151
firebase.auth.OAuthProvider(providerId)
@@ -50,30 +60,6 @@ actual class OAuthProvider(val js: firebase.auth.OAuthProvider, private val auth
5060
.let { OAuthCredential(it) }
5161
}
5262
}
53-
54-
actual fun addScope(vararg scope: String) = rethrow { scope.forEach { js.addScope(it) } }
55-
actual fun setCustomParameters(parameters: Map<String, String>) = rethrow {
56-
js.setCustomParameters(parameters)
57-
}
58-
59-
actual suspend fun signIn(signInProvider: SignInProvider): AuthResult = rethrow {
60-
AuthResult(when (signInProvider.type) {
61-
SignInProvider.SignInType.Popup -> {
62-
auth.js.signInWithPopup(js).await()
63-
}
64-
SignInProvider.SignInType.Redirect -> {
65-
auth.js.signInWithRedirect(js).await()
66-
auth.js.getRedirectResult().await()
67-
}
68-
})
69-
}
70-
}
71-
72-
actual class SignInProvider(val type: SignInType) {
73-
enum class SignInType {
74-
Popup,
75-
Redirect
76-
}
7763
}
7864

7965
actual class PhoneAuthProvider(val js: firebase.auth.PhoneAuthProvider) {

0 commit comments

Comments
 (0)