Skip to content

Commit

Permalink
feat: compose-sdk wrap HCaptchaWebView into remember
Browse files Browse the repository at this point in the history
  • Loading branch information
CAMOBAP committed Feb 14, 2025
1 parent 3e8c35d commit 3f4f7e7
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 62 deletions.
74 changes: 16 additions & 58 deletions compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaCompose.kt
Original file line number Diff line number Diff line change
@@ -1,74 +1,43 @@
package com.hcaptcha.sdk

import android.app.Activity
import android.os.Handler
import android.os.Looper
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties

@Composable
public fun HCaptchaCompose(config: HCaptchaConfig, onResult: (HCaptchaResponse) -> Unit) {
val handler = Handler(Looper.getMainLooper())
var helper: HCaptchaWebViewHelper? = null
val verifier = object : IHCaptchaVerifier {
override fun onLoaded() {
onResult(HCaptchaResponse.Event(HCaptchaEvent.Loaded))
if (config.hideDialog) {
helper?.let {
it.resetAndExecute()
} ?: run {
HCaptchaLog.w("HCaptchaWebViewHelper wasn't created, report but to developer")
onResult(HCaptchaResponse.Failure(HCaptchaError.INTERNAL_ERROR))
}
}
}

override fun onOpen() {
onResult(HCaptchaResponse.Event(HCaptchaEvent.Opened))
}

override fun onSuccess(result: String) {
onResult(HCaptchaResponse.Success(result))
}

override fun onFailure(exception: HCaptchaException) {
onResult(HCaptchaResponse.Failure(exception.hCaptchaError))
}
HCaptchaLog.sDiagnosticsLogEnabled = config.diagnosticLog

override fun startVerification(activity: Activity) {
error("startVerification should never be reached")
}
val context = LocalContext.current
val handler = Handler(Looper.getMainLooper())
val internalConfig = HCaptchaInternalConfig(com.hcaptcha.sdk.HCaptchaHtml())

override fun reset() {
error("reset should never be reached")
val helper = remember { mutableStateOf<HCaptchaWebViewHelper?>(null) }
val verifier = remember { HCaptchaComposeVerifier(config, onResult, helper) }
val preloadedWebView = remember {
HCaptchaWebView(context).apply {
helper.value = HCaptchaWebViewHelper(
handler, context, config, internalConfig, verifier, this
)
}
}
val internalConfig = HCaptchaInternalConfig(com.hcaptcha.sdk.HCaptchaHtml())
HCaptchaLog.sDiagnosticsLogEnabled = config.diagnosticLog

HCaptchaLog.d("HCaptchaCompose($config)")

if (config.hideDialog) {
AndroidView(
modifier = Modifier.size(0.dp),
factory = { context ->
HCaptchaWebView(context).apply {
helper = HCaptchaWebViewHelper(
handler,
context,
config,
internalConfig,
verifier,
this
)
}
}
factory = { preloadedWebView }
)
} else {
Dialog(
Expand All @@ -77,18 +46,7 @@ public fun HCaptchaCompose(config: HCaptchaConfig, onResult: (HCaptchaResponse)
) {
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { context ->
HCaptchaWebView(context).apply {
helper = HCaptchaWebViewHelper(
handler,
context,
config,
internalConfig,
verifier,
this
)
}
}
factory = { preloadedWebView }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,41 @@
package com.hcaptcha.example.compose
package com.hcaptcha.sdk

class HCaptchaComposeVerifier {
import android.app.Activity
import androidx.compose.runtime.State

internal class HCaptchaComposeVerifier(
private val config: HCaptchaConfig,
private val onResult: (HCaptchaResponse) -> Unit,
private val helperState: State<HCaptchaWebViewHelper?>
) : IHCaptchaVerifier {

override fun onLoaded() {
onResult(HCaptchaResponse.Event(HCaptchaEvent.Loaded))
if (config.hideDialog) {
helperState.value?.resetAndExecute() ?: run {
HCaptchaLog.w("HCaptchaWebViewHelper wasn't created, report but to developer")
onResult(HCaptchaResponse.Failure(HCaptchaError.INTERNAL_ERROR))
}
}
}

override fun onOpen() {
onResult(HCaptchaResponse.Event(HCaptchaEvent.Opened))
}

override fun onSuccess(result: String) {
onResult(HCaptchaResponse.Success(result))
}

override fun onFailure(exception: HCaptchaException) {
onResult(HCaptchaResponse.Failure(exception.hCaptchaError))
}

override fun startVerification(activity: Activity) {
error("startVerification should never be reached")
}

override fun reset() {
error("reset should never be reached")
}
}
2 changes: 1 addition & 1 deletion example-compose-app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ android {
namespace 'com.hcaptcha.example.compose'

defaultConfig {
minSdkVersion 23
minSdkVersion 21
targetSdkVersion intProp("exampleTargetSdkVersion", 35)
versionCode 1
versionName "0.0.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.hcaptcha.sdk.HCaptchaCompose
import com.hcaptcha.sdk.HCaptchaConfig
import com.hcaptcha.sdk.HCaptchaEvent
import com.hcaptcha.sdk.HCaptchaResponse
import com.hcaptcha.sdk.HCaptchaSize

class ComposeActivity : ComponentActivity() {

Expand All @@ -33,7 +34,9 @@ class ComposeActivity : ComponentActivity() {
var text by remember { mutableStateOf("") }

Column(
modifier = Modifier.fillMaxSize().padding(16.dp),
modifier = Modifier.fillMaxSize()
.padding(WindowInsets.systemBars.asPaddingValues())
.padding(16.dp),
verticalArrangement = Arrangement.Bottom
) {
TextField(
Expand Down Expand Up @@ -91,6 +94,7 @@ class ComposeActivity : ComponentActivity() {
HCaptchaCompose(HCaptchaConfig
.builder()
.siteKey("10000000-ffff-ffff-ffff-000000000001")
.size(if (hideDialog) HCaptchaSize.INVISIBLE else HCaptchaSize.NORMAL)
.hideDialog(hideDialog)
.diagnosticLog(true)
.build()) { result ->
Expand Down

0 comments on commit 3f4f7e7

Please sign in to comment.