package solutions.tretter.githugandroid import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box 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.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog data class GitMessageEditorState( val invocation: GitEditorInvocation, val content: String, ) @Composable fun GitMessageEditorDialog( state: GitMessageEditorState, onContentChange: (String) -> Unit, onClose: () -> Unit, onSave: () -> Unit, ) { val horizontalScroll = rememberScrollState() val verticalScroll = rememberScrollState() Dialog(onDismissRequest = onClose) { Surface( modifier = Modifier .fillMaxWidth() .fillMaxHeight(0.72f), color = PanelPrimary, shape = RoundedCornerShape(8.dp), ) { Column( modifier = Modifier.padding(12.dp), verticalArrangement = Arrangement.spacedBy(10.dp), ) { Text( text = state.invocation.title, color = TextPrimary, fontWeight = FontWeight.Bold, fontSize = 20.sp, ) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), ) { EditorButton(label = "Close", onClick = onClose) EditorButton(label = "Save", enabled = state.content.isNotBlank(), onClick = onSave) } Text( text = state.invocation.command, color = TextSecondary, fontFamily = FontFamily.Monospace, fontSize = 13.sp, ) Box( modifier = Modifier .fillMaxWidth() .weight(1f) .heightIn(min = 220.dp) .background(TerminalBackground, RoundedCornerShape(6.dp)) .padding(10.dp) .horizontalScroll(horizontalScroll) .verticalScroll(verticalScroll), ) { BasicTextField( value = state.content, onValueChange = onContentChange, modifier = Modifier.sizeIn(minWidth = 1000.dp, minHeight = 700.dp), textStyle = TextStyle( color = TextPrimary, fontFamily = FontFamily.Monospace, fontSize = 14.sp, ), cursorBrush = SolidColor(Accent), keyboardOptions = KeyboardOptions( autoCorrect = false, keyboardType = KeyboardType.Ascii, ), ) } } } } } @Composable private fun EditorButton( label: String, enabled: Boolean = true, onClick: () -> Unit, ) { Button( onClick = onClick, enabled = enabled, colors = ButtonDefaults.buttonColors( containerColor = Accent, contentColor = AppBackground, disabledContainerColor = PanelTertiary, disabledContentColor = TextMuted, ), ) { Text(label) } }