Soumen pal
06/04/2026, 5:31 PMSoumen pal
06/04/2026, 5:31 PMimport 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 = { }
)
}