Hello, I want looking into integrating the native ...
# multiplatform
s
Hello, I want looking into integrating the native apple pay button, and it seems like the first render is slow due to the bridge. yeah I can create a custom button but that different, here is the code sample
Copy code
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.UIKitView
import kotlinx.cinterop.BetaInteropApi
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.ObjCAction
import platform.Foundation.NSSelectorFromString
import platform.PassKit.PKPaymentButton
import platform.PassKit.PKPaymentButtonStyleBlack
import platform.PassKit.PKPaymentButtonTypeBuy
import platform.UIKit.UIControlEventTouchUpInside
import platform.darwin.NSObject



@OptIn(BetaInteropApi::class)
private class ApplePayButtonTarget(
    var onTap: () -> Unit
) : NSObject() {
    @ObjCAction
    fun didTap() {
        onTap()
    }
}


@OptIn(ExperimentalForeignApi::class)
@Composable
fun ApplePayButton(
    modifier: Modifier = Modifier,
    onClick: () -> Unit
) {
    val latestOnClick by rememberUpdatedState(onClick)
    val target = remember {
        ApplePayButtonTarget(onTap = {})
    }.apply {
        onTap = { latestOnClick() }
    }

    UIKitView(
        modifier = modifier
            .fillMaxWidth()
            .height(56.dp),
        factory = {
            PKPaymentButton(
                paymentButtonType = PKPaymentButtonTypeBuy,
                paymentButtonStyle = PKPaymentButtonStyleBlack
            ).apply {
                addTarget(
                    target = target,
                    action = NSSelectorFromString("didTap"),
                    forControlEvents = UIControlEventTouchUpInside
                )
            }
        },
        update = { }
    )
}