package soy.iko.opencode.ui.chat import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import soy.iko.opencode.R /** * A fullscreen-ish dialog showing the raw markdown source of a message's TextParts, so a user * can inspect malformed tables/rendering or copy the exact source. The text is monospace, * scrollable, and wrapped in a [SelectionContainer] so a portion can be selected and copied. * Dismissed via the Close button, back, or an outside tap. */ @Composable fun ViewSourceDialog( source: String, onDismiss: () -> Unit, ) { Dialog( onDismissRequest = onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false), ) { Surface( shape = MaterialTheme.shapes.large, color = MaterialTheme.colorScheme.surface, tonalElevation = 6.dp, modifier = Modifier.fillMaxHeight(0.9f).fillMaxWidth(), ) { Column( modifier = Modifier.fillMaxWidth().padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, ) { Text( stringResource(R.string.message_source), style = MaterialTheme.typography.titleMedium, ) TextButton(onClick = onDismiss) { Text(stringResource(R.string.close)) } } SelectionContainer { Text( text = source, style = MaterialTheme.typography.bodySmall.copy(fontFamily = FontFamily.Monospace), modifier = Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()), ) } } } } }