1+ package com.getcode.view.main.getKin
2+
3+ import android.graphics.Bitmap
4+ import android.net.Uri
5+ import android.webkit.WebView
6+ import androidx.compose.foundation.layout.BoxScope
7+ import androidx.compose.foundation.layout.fillMaxSize
8+ import androidx.compose.foundation.layout.imePadding
9+ import androidx.compose.runtime.Composable
10+ import androidx.compose.runtime.LaunchedEffect
11+ import androidx.compose.runtime.getValue
12+ import androidx.compose.runtime.mutableStateOf
13+ import androidx.compose.runtime.remember
14+ import androidx.compose.runtime.setValue
15+ import androidx.compose.ui.Alignment
16+ import androidx.compose.ui.Modifier
17+ import androidx.compose.ui.graphics.Color
18+ import com.getcode.manager.TopBarManager
19+ import com.getcode.navigation.core.LocalCodeNavigator
20+ import com.getcode.navigation.screens.KadoWebScreen.BuyKinWebInterface
21+ import com.getcode.ui.components.CodeCircularProgressIndicator
22+ import com.getcode.ui.utils.toAGColor
23+ import com.kevinnzou.web.AccompanistWebViewClient
24+ import com.kevinnzou.web.LoadingState
25+ import com.kevinnzou.web.WebView
26+ import com.kevinnzou.web.WebViewNavigator
27+ import com.kevinnzou.web.WebViewState
28+
29+ @Composable
30+ fun BoxScope.KadoWebScreen (
31+ viewModel : KadoWebViewModel ,
32+ state : WebViewState ,
33+ webNavigator : WebViewNavigator ,
34+ ) {
35+ val navigator = LocalCodeNavigator .current
36+
37+ val loadingState = state.loadingState
38+ if (loadingState is LoadingState .Loading ) {
39+ CodeCircularProgressIndicator (modifier = Modifier .align(Alignment .Center ))
40+ }
41+
42+ var orderId by remember { mutableStateOf(" " ) }
43+
44+ val client = remember {
45+ object : AccompanistWebViewClient () {
46+ override fun onPageStarted (view : WebView , url : String? , favicon : Bitmap ? ) {
47+ super .onPageStarted(view, url, favicon)
48+ println (" url=$url " )
49+ if (url?.startsWith(" https://app.kado.money/ramp/order/" ) == true ) {
50+ // order created, extract order id
51+ orderId = Uri .parse(url).lastPathSegment.orEmpty()
52+ }
53+ }
54+ }
55+ }
56+
57+ LaunchedEffect (orderId) {
58+ if (orderId.isNotEmpty()) {
59+ // order created, start to check status
60+ viewModel.checkOrderStatus(orderId)
61+ .onSuccess {
62+ TopBarManager .showMessage(
63+ " Success! Funds Available Soon" ,
64+ " Your funds should be available in your Code Wallet in 5 to 10 minutes." ,
65+ type = TopBarManager .TopBarMessageType .SUCCESS
66+ )
67+ navigator.hide()
68+ }.onFailure {
69+ TopBarManager .showMessage(
70+ " Something went wrong" ,
71+ " Your payment method was not charged. Please try again later."
72+ )
73+ navigator.hide()
74+ }
75+ }
76+ }
77+ WebView (
78+ modifier = Modifier
79+ .fillMaxSize()
80+ .imePadding(),
81+ captureBackPresses = false ,
82+ navigator = webNavigator,
83+ state = state,
84+ client = client,
85+ onCreated = { nativeWebView ->
86+ nativeWebView.addJavascriptInterface(BuyKinWebInterface (), " Android" )
87+ nativeWebView.clipToOutline = true
88+ nativeWebView.setBackgroundColor(Color .Transparent .toAGColor())
89+ nativeWebView.settings.apply {
90+ javaScriptEnabled = true
91+ domStorageEnabled = true
92+ }
93+ }
94+ )
95+ }
0 commit comments