package cc.unitmesh.devins.ui.compose.agent.codereview import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import cc.unitmesh.devins.ui.compose.icons.AutoDevComposeIcons import cc.unitmesh.devins.ui.compose.sketch.SketchRenderer import cc.unitmesh.devins.ui.compose.theme.AutoDevColors /** * Displays AI analysis output with support for streaming content. * Uses `isActive` to determine if content is still being streamed (incomplete). */ @Composable fun AIAnalysisSection( analysisOutput: String, isActive: Boolean, modifier: Modifier = Modifier ) { var isExpanded by remember { mutableStateOf(true) } Card( modifier = modifier.fillMaxWidth(), colors = CardDefaults.cardColors( containerColor = if (isActive) { AutoDevColors.Indigo.c600.copy(alpha = 0.1f) } else { MaterialTheme.colorScheme.surfaceVariant } ), shape = RoundedCornerShape(6.dp) ) { Column(modifier = Modifier.fillMaxWidth()) { // Header Row( modifier = Modifier .fillMaxWidth() .clickable { isExpanded = !isExpanded } .padding(12.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp) ) { Icon( imageVector = if (isExpanded) AutoDevComposeIcons.ExpandMore else AutoDevComposeIcons.ChevronRight, contentDescription = if (isExpanded) "Collapse" else "Expand", tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(20.dp) ) Icon( imageVector = AutoDevComposeIcons.SmartToy, contentDescription = null, tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(18.dp) ) Text( text = "Issues analysis (AI)", style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurface ) if (isActive) { Surface( color = AutoDevColors.Indigo.c600, shape = RoundedCornerShape(4.dp) ) { Text( text = "ANALYZING", style = MaterialTheme.typography.labelSmall, color = Color.White, modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp) ) } } } } AnimatedVisibility( visible = isExpanded, enter = expandVertically() + fadeIn(), exit = shrinkVertically() + fadeOut() ) { Column( modifier = Modifier .fillMaxWidth() .padding(horizontal = 12.dp, vertical = 0.dp) .padding(bottom = 12.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { if (analysisOutput.isNotBlank()) { SketchRenderer.RenderResponse( content = analysisOutput, isComplete = !isActive, modifier = Modifier.fillMaxWidth() ) } } } } } }