package com.socialapp.presentation.ui.screens import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.socialapp.presentation.ui.theme.AccentMagenta data class ChatMessage( val id: Int, val userId: Int, val userName: String, val userAvatar: String, val lastMessage: String, val timestamp: String, val unreadCount: Int, val isOnline: Boolean ) @Composable fun ChatScreen( onChatClick: (Int) -> Unit = {} ) { val searchQuery = remember { mutableStateOf("") } val chats = remember { mutableStateOf( listOf( ChatMessage(1, 1, "Sarah", "", "That looks amazing!", "2m ago", 3, true), ChatMessage(2, 2, "Mike", "", "See you tomorrow", "15m ago", 0, false), ChatMessage(3, 3, "Emma", "", "Thanks for the help!", "1h ago", 1, true), ChatMessage(4, 4, "John", "", "Haha so funny 😂", "2h ago", 0, false), ) ) } Column( modifier = Modifier .fillMaxSize() .background(MaterialTheme.colorScheme.background) ) { // Header Row( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Text( text = "Messages", fontSize = 24.sp, fontWeight = FontWeight.Bold ) Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { IconButton(onClick = { /* Camera */ }, modifier = Modifier.size(40.dp)) { Icon( imageVector = Icons.Default.Videocam, contentDescription = "Video", tint = MaterialTheme.colorScheme.onBackground ) } IconButton(onClick = { /* Add */ }, modifier = Modifier.size(40.dp)) { Icon( imageVector = Icons.Default.Add, contentDescription = "New Chat", tint = MaterialTheme.colorScheme.onBackground ) } } } // Search Bar Box( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 8.dp) .height(40.dp) .clip(RoundedCornerShape(20.dp)) .background(MaterialTheme.colorScheme.surface) .padding(horizontal = 12.dp), contentAlignment = Alignment.CenterStart ) { if (searchQuery.value.isEmpty()) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically ) { Icon( imageVector = Icons.Default.Search, contentDescription = "Search", tint = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f), modifier = Modifier.size(18.dp) ) Text( text = "Search conversations...", fontSize = 13.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f) ) } } } // Chat List LazyColumn(modifier = Modifier.fillMaxSize()) { items(chats.value) { chat -> ChatItem( chat = chat, onChatClick = { onChatClick(chat.id) } ) Divider(color = MaterialTheme.colorScheme.surface, thickness = 1.dp, modifier = Modifier.padding(horizontal = 16.dp)) } } } } @Composable private fun ChatItem( chat: ChatMessage, onChatClick: () -> Unit ) { Row( modifier = Modifier .fillMaxWidth() .clickable { onChatClick() } .padding(12.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(12.dp) ) { Box( modifier = Modifier .size(56.dp) .clip(CircleShape) .background(AccentMagenta.copy(alpha = 0.3f)), contentAlignment = Alignment.Center ) { Text( text = chat.userName.first().toString(), fontSize = 24.sp, fontWeight = FontWeight.Bold, color = AccentMagenta ) // Online indicator if (chat.isOnline) { Box( modifier = Modifier .size(12.dp) .clip(CircleShape) .background(androidx.compose.ui.graphics.Color.Green) .align(Alignment.BottomEnd) .offset(x = (-2).dp, y = (-2).dp) ) } } Column( modifier = Modifier.weight(1f), verticalArrangement = Arrangement.Center ) { Text( text = chat.userName, fontSize = 14.sp, fontWeight = FontWeight.SemiBold ) Text( text = chat.lastMessage, fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f), maxLines = 1 ) } Column( horizontalAlignment = Alignment.End, verticalArrangement = Arrangement.Center ) { Text( text = chat.timestamp, fontSize = 11.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f) ) if (chat.unreadCount > 0) { Box( modifier = Modifier .size(20.dp) .clip(CircleShape) .background(AccentMagenta), contentAlignment = Alignment.Center ) { Text( text = "${chat.unreadCount}", fontSize = 10.sp, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.background ) } } } } } @Composable fun ChatDetailScreen( chatId: Int, onBackClick: () -> Unit = {} ) { val messageInput = remember { mutableStateOf("") } val messages = remember { mutableStateOf( listOf( Pair("You", "Hey Sarah! How are you?"), Pair("Sarah", "I'm doing great! How about you?"), Pair("You", "That looks amazing!"), Pair("Sarah", "Thanks! Want to hang out?"), ) ) } Column( modifier = Modifier .fillMaxSize() .background(MaterialTheme.colorScheme.background) ) { // Header Row( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Row(verticalAlignment = Alignment.CenterVertically) { IconButton(onClick = onBackClick, modifier = Modifier.size(40.dp)) { Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "Back", tint = MaterialTheme.colorScheme.onBackground ) } Box( modifier = Modifier .size(40.dp) .clip(CircleShape) .background(AccentMagenta.copy(alpha = 0.3f)), contentAlignment = Alignment.Center ) { Text("S", fontSize = 18.sp, fontWeight = FontWeight.Bold, color = AccentMagenta) } Spacer(modifier = Modifier.width(12.dp)) Text("Sarah", fontSize = 16.sp, fontWeight = FontWeight.Bold) } Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { IconButton(onClick = { }, modifier = Modifier.size(40.dp)) { Icon(Icons.Default.Call, contentDescription = "Call") } IconButton(onClick = { }, modifier = Modifier.size(40.dp)) { Icon(Icons.Default.Videocam, contentDescription = "Video") } } } Divider(color = MaterialTheme.colorScheme.surface, thickness = 1.dp) // Messages LazyColumn( modifier = Modifier .weight(1f) .fillMaxWidth() .padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp) ) { items(messages.value) { (sender, message) -> Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = if (sender == "You") Arrangement.End else Arrangement.Start ) { Box( modifier = Modifier .clip(RoundedCornerShape(16.dp)) .background( if (sender == "You") AccentMagenta else MaterialTheme.colorScheme.surface ) .padding(12.dp), contentAlignment = Alignment.Center ) { Text( text = message, fontSize = 13.sp, color = if (sender == "You") MaterialTheme.colorScheme.background else MaterialTheme.colorScheme.onSurface ) } } } } // Input Row( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically ) { IconButton(onClick = { }, modifier = Modifier.size(40.dp)) { Icon( imageVector = Icons.Default.Add, contentDescription = "Add", tint = AccentMagenta ) } Box( modifier = Modifier .weight(1f) .height(40.dp) .clip(RoundedCornerShape(20.dp)) .background(MaterialTheme.colorScheme.surface) .padding(horizontal = 12.dp), contentAlignment = Alignment.CenterStart ) { if (messageInput.value.isEmpty()) { Text( text = "Message...", fontSize = 13.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f) ) } else { Text( text = messageInput.value, fontSize = 13.sp, color = MaterialTheme.colorScheme.onSurface ) } } IconButton(onClick = { }, modifier = Modifier.size(40.dp)) { Icon( imageVector = Icons.Default.Send, contentDescription = "Send", tint = AccentMagenta ) } } } }