From b8f0111d3b82a40f6900bde0351d96ccba05d0de Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Mon, 3 Nov 2025 21:22:30 +0700 Subject: [PATCH 1/6] Implement Native Google OAuth iOS in sample --- .../jan/supabase/common/ChatViewModel.kt | 4 +++ .../jan/supabase/common/di/supabaseModule.kt | 7 ++++ .../supabase/common/ui/screen/LoginScreen.kt | 36 +++++++++++++++++-- .../xcschemes/xcschememanagement.plist | 2 +- .../chat-demo-mpp/ios/chatdemoios/Info.plist | 15 ++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) diff --git a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ChatViewModel.kt b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ChatViewModel.kt index 0fb064e5e..be0e7f884 100644 --- a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ChatViewModel.kt +++ b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ChatViewModel.kt @@ -97,6 +97,10 @@ class ChatViewModel( } } + fun handleSignInWithGoogleResult() { + alert.value = "Successfully signed in with Google!" + } + fun logout() { coroutineScope.launch { kotlin.runCatching { diff --git a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt index 42060f8e8..a8d8a4014 100644 --- a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt +++ b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt @@ -3,6 +3,9 @@ package io.github.jan.supabase.common.di import io.github.jan.supabase.auth.Auth import io.github.jan.supabase.auth.AuthConfig import io.github.jan.supabase.auth.FlowType +import io.github.jan.supabase.compose.auth.ComposeAuth +import io.github.jan.supabase.compose.auth.appleNativeLogin +import io.github.jan.supabase.compose.auth.googleNativeLogin import io.github.jan.supabase.createSupabaseClient import io.github.jan.supabase.logging.LogLevel import io.github.jan.supabase.postgrest.Postgrest @@ -24,6 +27,10 @@ val supabaseModule = module { flowType = FlowType.PKCE } install(Realtime) + install(ComposeAuth) { + googleNativeLogin(serverClientId = "YOUR_WEB_CLIENT_ID") + appleNativeLogin() + } } } } \ No newline at end of file diff --git a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ui/screen/LoginScreen.kt b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ui/screen/LoginScreen.kt index 7ec089f16..76f260292 100644 --- a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ui/screen/LoginScreen.kt +++ b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/ui/screen/LoginScreen.kt @@ -39,7 +39,11 @@ import io.github.jan.supabase.common.ui.components.PasswordField import io.github.jan.supabase.common.ui.components.PasswordRecoveryDialog import io.github.jan.supabase.compose.auth.ui.ProviderButtonContent import io.github.jan.supabase.compose.auth.ui.annotations.AuthUiExperimental - +import io.github.jan.supabase.compose.auth.composeAuth +import io.github.jan.supabase.compose.auth.ui.ProviderIcon +import io.github.jan.supabase.compose.auth.composable.NativeSignInResult +import io.github.jan.supabase.compose.auth.composable.rememberSignInWithGoogle +import co.touchlab.kermit.Logger @OptIn(ExperimentalMaterial3Api::class, SupabaseExperimental::class, AuthUiExperimental::class) @Composable fun LoginScreen(viewModel: ChatViewModel) { @@ -48,7 +52,28 @@ fun LoginScreen(viewModel: ChatViewModel) { var email by remember { mutableStateOf("") } var otpDialogState by remember { mutableStateOf(OTPDialogState.Invisible) } var showPasswordRecoveryDialog by remember { mutableStateOf(false) } + val action = viewModel.supabaseClient.composeAuth.rememberSignInWithGoogle( + onResult = { result -> + when (result) { + is NativeSignInResult.Success -> { + viewModel.handleSignInWithGoogleResult() + Logger.d("LoginScreen - Success") + } + + is NativeSignInResult.ClosedByUser -> { + Logger.d("LoginScreen - ClosedByUser") + } + is NativeSignInResult.Error -> { + Logger.d("LoginScreen - Error") + } + + is NativeSignInResult.NetworkError -> { + Logger.d("LoginScreen - Network Error") + } + } + }, + ) Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, @@ -94,7 +119,14 @@ fun LoginScreen(viewModel: ChatViewModel) { ) { ProviderButtonContent(Google, text = if (signUp) "Sign Up with Google" else "Login with Google") } - + Button( + onClick = { + action.startFlow() + }, + ) { + ProviderIcon(Google, contentDescription = null) + Text("Native Sign In with Google") + } TextButton( onClick = { otpDialogState = OTPDialogState.Visible(email) } ) { diff --git a/sample/chat-demo-mpp/ios/chatdemoios.xcodeproj/xcuserdata/hieuvu.xcuserdatad/xcschemes/xcschememanagement.plist b/sample/chat-demo-mpp/ios/chatdemoios.xcodeproj/xcuserdata/hieuvu.xcuserdatad/xcschemes/xcschememanagement.plist index 9145cc551..bfd290b21 100644 --- a/sample/chat-demo-mpp/ios/chatdemoios.xcodeproj/xcuserdata/hieuvu.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/sample/chat-demo-mpp/ios/chatdemoios.xcodeproj/xcuserdata/hieuvu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ chatdemoios.xcscheme_^#shared#^_ orderHint - 2 + 0 SuppressBuildableAutocreation diff --git a/sample/chat-demo-mpp/ios/chatdemoios/Info.plist b/sample/chat-demo-mpp/ios/chatdemoios/Info.plist index 11845e1da..118efea59 100644 --- a/sample/chat-demo-mpp/ios/chatdemoios/Info.plist +++ b/sample/chat-demo-mpp/ios/chatdemoios/Info.plist @@ -2,7 +2,22 @@ + CFBundleIdentifier + io.github.jan.supabase.ios + GIDClientID + YOUR_IOS_CLIENT_ID CADisableMinimumFrameDurationOnPhone + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + YOUR_REVERSED_IOS_CLIENT_ID + + + From bbf36a895ddde62aa632e7997308f71970f2a699 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Mon, 3 Nov 2025 21:25:58 +0700 Subject: [PATCH 2/6] Remove uneeded --- .../kotlin/io/github/jan/supabase/common/di/supabaseModule.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt index a8d8a4014..4f621bdee 100644 --- a/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt +++ b/sample/chat-demo-mpp/common/src/commonMain/kotlin/io/github/jan/supabase/common/di/supabaseModule.kt @@ -29,7 +29,6 @@ val supabaseModule = module { install(Realtime) install(ComposeAuth) { googleNativeLogin(serverClientId = "YOUR_WEB_CLIENT_ID") - appleNativeLogin() } } } From b62f1b87c08e0592058e5de97144a4d36815294f Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 7 Nov 2025 16:55:21 +0700 Subject: [PATCH 3/6] Upgrade plugin version --- sample/chat-demo-mpp/common/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample/chat-demo-mpp/common/build.gradle.kts b/sample/chat-demo-mpp/common/build.gradle.kts index 8685dddf4..6c1aacc8e 100644 --- a/sample/chat-demo-mpp/common/build.gradle.kts +++ b/sample/chat-demo-mpp/common/build.gradle.kts @@ -14,7 +14,7 @@ plugins { group = "io.github.jan.supabase" version = "1.0-SNAPSHOT" -val pluginVersion = "3.2.0" +val pluginVersion = "3.2.7" kotlin { @OptIn(ExperimentalKotlinGradlePluginApi::class) From 3b05ef6ec6574525cb5c6d5d01dcb9f57ef18e97 Mon Sep 17 00:00:00 2001 From: Jan Tennert Date: Tue, 9 Dec 2025 17:21:50 +0100 Subject: [PATCH 4/6] Update plugin version to 3.3.0-beta-1 --- sample/chat-demo-mpp/common/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample/chat-demo-mpp/common/build.gradle.kts b/sample/chat-demo-mpp/common/build.gradle.kts index 6c1aacc8e..fec79dd1d 100644 --- a/sample/chat-demo-mpp/common/build.gradle.kts +++ b/sample/chat-demo-mpp/common/build.gradle.kts @@ -14,7 +14,7 @@ plugins { group = "io.github.jan.supabase" version = "1.0-SNAPSHOT" -val pluginVersion = "3.2.7" +val pluginVersion = "3.3.0-beta-1" kotlin { @OptIn(ExperimentalKotlinGradlePluginApi::class) @@ -91,4 +91,4 @@ kotlin { } } -configureLibraryAndroidTarget("io.github.jan.supabase.common", 26, JavaVersion.VERSION_11) \ No newline at end of file +configureLibraryAndroidTarget("io.github.jan.supabase.common", 26, JavaVersion.VERSION_11) From 98aaac25776ecfddd2c737b58e87c91ad17d54e5 Mon Sep 17 00:00:00 2001 From: Jan Tennert Date: Thu, 11 Dec 2025 14:43:34 +0100 Subject: [PATCH 5/6] Update compose & fix build error --- gradle/libs.versions.toml | 2 +- .../web/src/jsMain/kotlin/Main.kt | 4 ++-- .../web/src/jsMain/resources/index.html | 10 ++++------ .../web/src/jsMain/resources/styles.css | 18 ++++++------------ 4 files changed, 13 insertions(+), 21 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 905462ca0..83680000b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,7 +20,7 @@ detekt = "1.23.8" moshi = "1.15.2" jackson = "2.20.1" browser = "1.9.0" -compose = "1.8.2" +compose = "1.9.3" coil2 = "2.7.0" okio = "3.16.2" koin = "4.1.1" diff --git a/sample/chat-demo-mpp/web/src/jsMain/kotlin/Main.kt b/sample/chat-demo-mpp/web/src/jsMain/kotlin/Main.kt index 3d467e642..c71e7db8b 100644 --- a/sample/chat-demo-mpp/web/src/jsMain/kotlin/Main.kt +++ b/sample/chat-demo-mpp/web/src/jsMain/kotlin/Main.kt @@ -1,6 +1,6 @@ // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.window.CanvasBasedWindow +import androidx.compose.ui.window.ComposeViewport import io.github.jan.supabase.common.App import io.github.jan.supabase.common.ChatViewModel import io.github.jan.supabase.common.di.initKoin @@ -19,7 +19,7 @@ fun main() { initKoin() val root = RootComponent() onWasmReady { - CanvasBasedWindow(title = "Demo Chat App") { + ComposeViewport("ComposeTarget") { App(root.viewModel) } } diff --git a/sample/chat-demo-mpp/web/src/jsMain/resources/index.html b/sample/chat-demo-mpp/web/src/jsMain/resources/index.html index 278268e1d..c40764ccf 100644 --- a/sample/chat-demo-mpp/web/src/jsMain/resources/index.html +++ b/sample/chat-demo-mpp/web/src/jsMain/resources/index.html @@ -2,14 +2,12 @@ - Chat App + Chat Demo - -
- -
- + +
+ \ No newline at end of file diff --git a/sample/chat-demo-mpp/web/src/jsMain/resources/styles.css b/sample/chat-demo-mpp/web/src/jsMain/resources/styles.css index 9ec1c5ec3..2e60f2c69 100644 --- a/sample/chat-demo-mpp/web/src/jsMain/resources/styles.css +++ b/sample/chat-demo-mpp/web/src/jsMain/resources/styles.css @@ -1,15 +1,9 @@ -#root { +html, +#ComposeTarget, +body { width: 100%; - height: 100vh; -} - -#root > .compose-web-column > div { - position: relative; -} - -canvas { + height: 100%; + margin: 0; padding: 0; - margin: auto; - display: block; - width: 800px; + overflow: hidden; } \ No newline at end of file From 21bf306f4dac0210054901ba4315baa04fb93d2a Mon Sep 17 00:00:00 2001 From: Jan Tennert Date: Thu, 11 Dec 2025 15:04:23 +0100 Subject: [PATCH 6/6] fix mfa --- .../web/src/jsMain/kotlin/Main.kt | 4 ++-- .../web/src/jsMain/resources/index.html | 10 ++++------ .../web/src/jsMain/resources/styles.css | 18 ++++++------------ 3 files changed, 12 insertions(+), 20 deletions(-) diff --git a/sample/multi-factor-auth/web/src/jsMain/kotlin/Main.kt b/sample/multi-factor-auth/web/src/jsMain/kotlin/Main.kt index 744098409..9df773b1f 100644 --- a/sample/multi-factor-auth/web/src/jsMain/kotlin/Main.kt +++ b/sample/multi-factor-auth/web/src/jsMain/kotlin/Main.kt @@ -1,5 +1,5 @@ import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.window.CanvasBasedWindow +import androidx.compose.ui.window.ComposeViewport import io.github.jan.supabase.common.App import io.github.jan.supabase.common.AppViewModel import io.github.jan.supabase.common.di.initKoin @@ -18,7 +18,7 @@ fun main() { initKoin() val root = RootComponent() onWasmReady { - CanvasBasedWindow(title = "MFA App") { + ComposeViewport("ComposeTarget") { App(root.viewModel) } } diff --git a/sample/multi-factor-auth/web/src/jsMain/resources/index.html b/sample/multi-factor-auth/web/src/jsMain/resources/index.html index 278268e1d..6d69d9e44 100644 --- a/sample/multi-factor-auth/web/src/jsMain/resources/index.html +++ b/sample/multi-factor-auth/web/src/jsMain/resources/index.html @@ -2,14 +2,12 @@ - Chat App + MFA App - -
- -
- + +
+ \ No newline at end of file diff --git a/sample/multi-factor-auth/web/src/jsMain/resources/styles.css b/sample/multi-factor-auth/web/src/jsMain/resources/styles.css index 9ec1c5ec3..2e60f2c69 100644 --- a/sample/multi-factor-auth/web/src/jsMain/resources/styles.css +++ b/sample/multi-factor-auth/web/src/jsMain/resources/styles.css @@ -1,15 +1,9 @@ -#root { +html, +#ComposeTarget, +body { width: 100%; - height: 100vh; -} - -#root > .compose-web-column > div { - position: relative; -} - -canvas { + height: 100%; + margin: 0; padding: 0; - margin: auto; - display: block; - width: 800px; + overflow: hidden; } \ No newline at end of file