ComposeWebView.kt 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package eu.mjdev.desktop.components.web
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.foundation.layout.*
  4. import androidx.compose.material.CircularProgressIndicator
  5. import androidx.compose.material.LinearProgressIndicator
  6. import androidx.compose.material.Text
  7. import androidx.compose.runtime.Composable
  8. import androidx.compose.runtime.LaunchedEffect
  9. import androidx.compose.runtime.remember
  10. import androidx.compose.ui.Alignment
  11. import androidx.compose.ui.Modifier
  12. import androidx.compose.ui.graphics.Color
  13. import androidx.compose.ui.unit.dp
  14. import com.multiplatform.webview.jsbridge.IJsMessageHandler
  15. import com.multiplatform.webview.jsbridge.WebViewJsBridge
  16. import com.multiplatform.webview.jsbridge.rememberWebViewJsBridge
  17. import com.multiplatform.webview.web.LoadingState
  18. import com.multiplatform.webview.web.WebContent
  19. import com.multiplatform.webview.web.WebView
  20. import com.multiplatform.webview.web.WebViewState
  21. import eu.mjdev.desktop.components.draggable.DraggableView
  22. import eu.mjdev.desktop.extensions.Compose.DarkBlue
  23. import eu.mjdev.desktop.provider.DesktopProvider
  24. import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
  25. // todo improve
  26. @Suppress("LocalVariableName", "FunctionName", "unused")
  27. @Preview
  28. @Composable
  29. fun ComposeWebView(
  30. modifier: Modifier = Modifier,
  31. url: String = "https://www.youtube.com/watch?v=BwY6LD7KAQk",
  32. contentPadding: PaddingValues = PaddingValues(top = 16.dp, start = 2.dp, end = 2.dp, bottom = 2.dp),
  33. dragEnabled: Boolean = false,
  34. backgroundColor: Color = Color.Transparent,
  35. dragBackgroundColor: Color = Color.White.copy(alpha = 0.3f),
  36. loadingLineColor: Color = Color.DarkBlue,
  37. jsBridge: IJsMessageHandler? = null,
  38. disablePopupWindows: Boolean = true,
  39. api: DesktopProvider = LocalDesktop.current
  40. ) = DraggableView(
  41. modifier = modifier,
  42. contentPadding = contentPadding,
  43. dragEnabled = dragEnabled,
  44. backgroundColor = backgroundColor,
  45. dragBackgroundColor = dragBackgroundColor
  46. ) {
  47. val webViewState = remember(url) {
  48. if (url.startsWith("http")) WebViewState(WebContent.Url(url))
  49. else WebViewState(WebContent.Url("file://$url"))
  50. }
  51. val loadingState = remember(webViewState) { webViewState.loadingState }
  52. val _jsBridge: WebViewJsBridge = rememberWebViewJsBridge()
  53. if (api.kcefHelper.restartRequired.value) {
  54. Text(text = "Restart required.")
  55. } else {
  56. if (api.kcefHelper.initialized.value) {
  57. WebView(
  58. modifier = modifier,
  59. state = webViewState
  60. )
  61. if (loadingState is LoadingState.Loading) {
  62. LinearProgressIndicator(
  63. progress = loadingState.progress,
  64. color = loadingLineColor,
  65. modifier = Modifier.fillMaxWidth().align(Alignment.BottomStart)
  66. )
  67. }
  68. } else {
  69. Box(
  70. modifier = Modifier.matchParentSize()
  71. .padding(8.dp)
  72. ) {
  73. CircularProgressIndicator(
  74. modifier = Modifier.fillMaxSize(),
  75. color = Color.White,
  76. strokeWidth = 10.dp,
  77. backgroundColor = Color.Transparent
  78. )
  79. Text(
  80. modifier = Modifier.align(Alignment.Center),
  81. text = "${api.kcefHelper.downloading.value}%"
  82. )
  83. }
  84. }
  85. }
  86. LaunchedEffect(Unit) {
  87. api.kcefHelper.init()
  88. if (jsBridge != null) _jsBridge.register(jsBridge)
  89. webViewState.webSettings.apply {
  90. isJavaScriptEnabled = true
  91. with(desktopWebSettings) {
  92. // offScreenRendering = true
  93. transparent = true
  94. this.disablePopupWindows = disablePopupWindows
  95. }
  96. }
  97. }
  98. }