ComposeWebView.kt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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.DesktopScope.Companion.withDesktopScope
  24. // todo improve
  25. @Suppress("LocalVariableName", "FunctionName", "unused")
  26. @Composable
  27. fun ComposeWebView(
  28. modifier: Modifier = Modifier,
  29. url: String = "https://www.youtube.com/watch?v=BwY6LD7KAQk",
  30. contentPadding: PaddingValues = PaddingValues(top = 16.dp, start = 2.dp, end = 2.dp, bottom = 2.dp),
  31. dragEnabled: Boolean = false,
  32. backgroundColor: Color = Color.Transparent,
  33. dragBackgroundColor: Color = Color.White.copy(alpha = 0.3f),
  34. loadingLineColor: Color = Color.DarkBlue,
  35. jsBridge: IJsMessageHandler? = null,
  36. disablePopupWindows: Boolean = true,
  37. ) = withDesktopScope {
  38. DraggableView(
  39. modifier = modifier,
  40. contentPadding = contentPadding,
  41. dragEnabled = dragEnabled,
  42. backgroundColor = backgroundColor,
  43. dragBackgroundColor = dragBackgroundColor
  44. ) {
  45. val webViewState = remember(url) {
  46. if (url.startsWith("http")) WebViewState(WebContent.Url(url))
  47. else WebViewState(WebContent.Url("file://$url"))
  48. }
  49. val loadingState = remember(webViewState) { webViewState.loadingState }
  50. val _jsBridge: WebViewJsBridge = rememberWebViewJsBridge()
  51. if (api.kcefHelper.restartRequired.value) {
  52. Text(text = "Restart required.")
  53. } else {
  54. if (api.kcefHelper.initialized.value) {
  55. WebView(
  56. modifier = modifier,
  57. state = webViewState
  58. )
  59. if (loadingState is LoadingState.Loading) {
  60. LinearProgressIndicator(
  61. progress = loadingState.progress,
  62. color = loadingLineColor,
  63. modifier = Modifier.fillMaxWidth().align(Alignment.BottomStart)
  64. )
  65. }
  66. } else {
  67. Box(
  68. modifier = Modifier.matchParentSize()
  69. .padding(8.dp)
  70. ) {
  71. CircularProgressIndicator(
  72. modifier = Modifier.fillMaxSize(),
  73. color = Color.White,
  74. strokeWidth = 10.dp,
  75. backgroundColor = Color.Transparent
  76. )
  77. Text(
  78. modifier = Modifier.align(Alignment.Center),
  79. text = "${api.kcefHelper.downloading.value}%"
  80. )
  81. }
  82. }
  83. }
  84. LaunchedEffect(Unit) {
  85. api.kcefHelper.init()
  86. if (jsBridge != null) _jsBridge.register(jsBridge)
  87. webViewState.webSettings.apply {
  88. isJavaScriptEnabled = true
  89. with(desktopWebSettings) {
  90. // offScreenRendering = true
  91. transparent = true
  92. this.disablePopupWindows = disablePopupWindows
  93. }
  94. }
  95. }
  96. }
  97. }
  98. @Preview
  99. @Composable
  100. fun ComposeWebViewPreview() = ComposeWebView()