package cc.unitmesh.viewer.web
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import cc.unitmesh.viewer.ViewerHost
import cc.unitmesh.viewer.ViewerRequest
import com.multiplatform.webview.web.WebView
import com.multiplatform.webview.web.rememberWebViewNavigator
import com.multiplatform.webview.web.rememberWebViewState
import com.multiplatform.webview.web.rememberWebViewStateWithHTMLData
/**
* Android implementation: Load viewer HTML from resources
*/
actual fun getViewerHtml(): String {
return try {
val resource = object {}.javaClass.classLoader?.getResource("viewer.html")
if (resource != null) {
val html = resource.readText()
html
} else {
getFallbackHtml()
}
} catch (e: Exception) {
e.printStackTrace()
getFallbackHtml()
}
}
private fun getFallbackHtml(): String {
return """
AutoDev Viewer (Fallback)
AutoDev Viewer
Failed to load viewer.html from resources
""".trimIndent()
}
/**
* Create a WebViewerHost instance
*/
@Composable
actual fun createWebViewerHost(): ViewerHost {
val webViewNavigator = rememberWebViewNavigator()
return remember { WebViewerHost(webViewNavigator) }
}
/**
* Composable WebView for displaying content
*
* @param initialRequest Optional initial request to display when ready
* @param modifier The modifier for layout
* @param onHostCreated Callback when the viewer host is created
*/
@Composable
actual fun ViewerWebView(
initialRequest: ViewerRequest?,
modifier: Modifier,
onHostCreated: (ViewerHost) -> Unit
) {
val webViewState = rememberWebViewStateWithHTMLData(
data = getViewerHtml()
)
val webViewNavigator = rememberWebViewNavigator()
val viewerHost = remember {
WebViewerHost(webViewNavigator).also {
onHostCreated(it)
}
}
LaunchedEffect(webViewState.isLoading) {
if (!webViewState.isLoading && webViewState.loadingState is com.multiplatform.webview.web.LoadingState.Finished) {
viewerHost.markReady()
initialRequest?.let { request ->
viewerHost.showContent(request)
} ?: println("[ViewerWebView] No initial request to show")
}
}
WebView(
state = webViewState,
navigator = webViewNavigator,
modifier = modifier.fillMaxSize(),
captureBackPresses = false
)
}