From 4dd9a736f5e5378a755a6cf590b8fc71e67ea769 Mon Sep 17 00:00:00 2001 From: Andrew Sidorchuk Date: Sat, 29 Nov 2025 16:00:43 -0500 Subject: [PATCH 1/2] chore: register button module for Kotlin with Expo --- expo-module.config.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/expo-module.config.json b/expo-module.config.json index 74ab563..938767c 100644 --- a/expo-module.config.json +++ b/expo-module.config.json @@ -12,6 +12,9 @@ ] }, "android": { - "modules": ["com.youversion.reactnativesdk.RNYouVersionPlatformModule"] + "modules": [ + "com.youversion.reactnativesdk.RNYouVersionPlatformModule", + "com.youversion.reactnativesdk.RNSignInWithYouVersionButtonModule" + ] } } From 07132b5f6c39702ca8373b86b8cb7b10f54c0d7f Mon Sep 17 00:00:00 2001 From: Andrew Sidorchuk Date: Sat, 29 Nov 2025 16:00:59 -0500 Subject: [PATCH 2/2] feat: implement sign in button for Kotlin --- .../RNSignInWithYouVersionButtonModule.kt | 15 ++++ .../views/YVPSignInWithYouVersionButton.kt | 76 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 android/src/main/java/com/youversion/reactnativesdk/RNSignInWithYouVersionButtonModule.kt create mode 100644 android/src/main/java/com/youversion/reactnativesdk/views/YVPSignInWithYouVersionButton.kt diff --git a/android/src/main/java/com/youversion/reactnativesdk/RNSignInWithYouVersionButtonModule.kt b/android/src/main/java/com/youversion/reactnativesdk/RNSignInWithYouVersionButtonModule.kt new file mode 100644 index 0000000..9a5730b --- /dev/null +++ b/android/src/main/java/com/youversion/reactnativesdk/RNSignInWithYouVersionButtonModule.kt @@ -0,0 +1,15 @@ +package com.youversion.reactnativesdk + +import com.youversion.reactnativesdk.views.YVPSignInWithYouVersionButton +import expo.modules.kotlin.modules.Module +import expo.modules.kotlin.modules.ModuleDefinition + +class RNSignInWithYouVersionButtonModule : Module() { + override fun definition() = ModuleDefinition { + Name("SignInWithYouVersionButton") + + View(YVPSignInWithYouVersionButton::class) { + Events("onTap") + } + } +} \ No newline at end of file diff --git a/android/src/main/java/com/youversion/reactnativesdk/views/YVPSignInWithYouVersionButton.kt b/android/src/main/java/com/youversion/reactnativesdk/views/YVPSignInWithYouVersionButton.kt new file mode 100644 index 0000000..ad130b5 --- /dev/null +++ b/android/src/main/java/com/youversion/reactnativesdk/views/YVPSignInWithYouVersionButton.kt @@ -0,0 +1,76 @@ +package com.youversion.reactnativesdk.views + +import android.content.Context +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape +import com.youversion.platform.ui.views.SignInWithYouVersionButton +import com.youversion.platform.ui.views.SignInWithYouVersionButtonDefaults +import com.youversion.platform.ui.views.SignInWithYouVersionButtonMode +import expo.modules.kotlin.AppContext +import expo.modules.kotlin.viewevent.EventDispatcher +import expo.modules.kotlin.views.AutoSizingComposable +import expo.modules.kotlin.views.ComposeProps +import expo.modules.kotlin.views.Direction +import expo.modules.kotlin.views.ExpoComposeView +import java.util.EnumSet + +data class SignInWithYouVersionButtonProps( + val mode: MutableState = mutableStateOf("full"), + val shape: MutableState = mutableStateOf("capsule"), + val isStroked: MutableState = mutableStateOf(true), + val colorScheme: MutableState = mutableStateOf(null) +) : ComposeProps + +class YVPSignInWithYouVersionButton(context: Context, appContext: AppContext) : + ExpoComposeView(context, appContext, withHostingView = true) { + override val props = SignInWithYouVersionButtonProps() + private val onTap by EventDispatcher() + + @Composable + override fun Content(modifier: Modifier) { + AutoSizingComposable(shadowNodeProxy, axis = EnumSet.of(Direction.HORIZONTAL, Direction.VERTICAL)) { + SignInWithYouVersionButton( + onClick = { onTap(mapOf()) }, + mode = mode(), + stroked = stroked(), + shape = shape(), + dark = isDark() + ) + } + } + + fun mode(): SignInWithYouVersionButtonMode { + return when (props.mode.value) { + "full" -> SignInWithYouVersionButtonMode.FULL + "compact" -> SignInWithYouVersionButtonMode.COMPACT + "iconOnly" -> SignInWithYouVersionButtonMode.ICON_ONLY + else -> SignInWithYouVersionButtonMode.FULL + } + } + + fun stroked(): Boolean { + return props.isStroked.value ?: true + } + + @Composable + fun shape(): Shape { + return when (props.shape.value) { + "capsule" -> SignInWithYouVersionButtonDefaults.capsuleShape + "rectangle" -> SignInWithYouVersionButtonDefaults.rectangleShape + else -> SignInWithYouVersionButtonDefaults.capsuleShape + } + } + + @Composable + fun isDark(): Boolean { + return when (props.colorScheme.value) { + "dark" -> true + "light" -> false + else -> isSystemInDarkTheme() + } + } +} \ No newline at end of file