diff --git a/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin b/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin index e2e2ae6..77a9abf 100644 Binary files a/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin and b/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin differ diff --git a/client-mobile/.gradle/8.5/executionHistory/executionHistory.lock b/client-mobile/.gradle/8.5/executionHistory/executionHistory.lock index 601ead8..4531dc2 100644 Binary files a/client-mobile/.gradle/8.5/executionHistory/executionHistory.lock and b/client-mobile/.gradle/8.5/executionHistory/executionHistory.lock differ diff --git a/client-mobile/.gradle/8.5/fileHashes/fileHashes.bin b/client-mobile/.gradle/8.5/fileHashes/fileHashes.bin index 609a386..9aedcf8 100644 Binary files a/client-mobile/.gradle/8.5/fileHashes/fileHashes.bin and b/client-mobile/.gradle/8.5/fileHashes/fileHashes.bin differ diff --git a/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock b/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock index 6c2382f..f34885a 100644 Binary files a/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock and b/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock differ diff --git a/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin b/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin index dcde928..1d6b0f5 100644 Binary files a/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin and b/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin differ diff --git a/client-mobile/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/client-mobile/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 5254bad..45925c5 100644 Binary files a/client-mobile/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/client-mobile/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/client-mobile/.gradle/buildOutputCleanup/outputFiles.bin b/client-mobile/.gradle/buildOutputCleanup/outputFiles.bin index e5ae1e2..d4a9a28 100644 Binary files a/client-mobile/.gradle/buildOutputCleanup/outputFiles.bin and b/client-mobile/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/client-mobile/chats/presentation/components/MessageBubble.kt b/client-mobile/chats/presentation/components/MessageBubble.kt index 6947db2..daf9988 100644 --- a/client-mobile/chats/presentation/components/MessageBubble.kt +++ b/client-mobile/chats/presentation/components/MessageBubble.kt @@ -3,6 +3,7 @@ package chats.presentation.components import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.CircleShape @@ -647,32 +648,64 @@ fun MessageContextMenu( onReactionSelected: (String) -> Unit, onAction: (String) -> Unit ) { - androidx.compose.material3.Surface( - modifier = Modifier - .width(220.dp) - .clip(RoundedCornerShape(12.dp)), - color = Color(0xFF1E1E1E), - shadowElevation = 8.dp - ) { - Column { - // Reactions - Row( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp), - horizontalArrangement = Arrangement.SpaceBetween - ) { - listOf("๐Ÿ‘", "โค๏ธ", "๐Ÿ˜‚", "๐Ÿ˜ฎ", "๐Ÿ˜ข", "๐Ÿ”ฅ").forEach { emoji -> - Text( - text = emoji, - fontSize = 24.sp, - modifier = Modifier - .clip(CircleShape) - .clickable { onReactionSelected(emoji) } - .padding(4.dp) + var isVisible by remember { mutableStateOf(false) } + + LaunchedEffect(Unit) { + isVisible = true + } + + androidx.compose.animation.AnimatedVisibility( + visible = isVisible, + enter = androidx.compose.animation.fadeIn(animationSpec = androidx.compose.animation.core.tween(200)) + + androidx.compose.animation.scaleIn( + initialScale = 0.5f, + animationSpec = androidx.compose.animation.core.spring( + dampingRatio = 0.6f, + stiffness = 400f + ), + transformOrigin = androidx.compose.ui.graphics.TransformOrigin( + if (isVisible) 0.5f else 0.5f, + 0f ) + ), + exit = androidx.compose.animation.fadeOut() + androidx.compose.animation.scaleOut() + ) { + androidx.compose.material3.Surface( + modifier = Modifier + .width(280.dp) // Even wider for all reactions + .clip(RoundedCornerShape(20.dp)), + color = Color(0xFF1E1E1E), + shadowElevation = 15.dp, + border = androidx.compose.foundation.BorderStroke(0.5.dp, Color.White.copy(alpha = 0.15f)) + ) { + Column { + // Extended Reactions scrollable bar + androidx.compose.foundation.lazy.LazyRow( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 4.dp, vertical = 10.dp), + horizontalArrangement = Arrangement.spacedBy(6.dp), + contentPadding = PaddingValues(horizontal = 12.dp) + ) { + val telegramReactions = listOf( + "๐Ÿ‘", "โค๏ธ", "๐Ÿ˜‚", "๐Ÿ”ฅ", "๐Ÿ’ฏ", "๐Ÿ‘", "๐Ÿคฉ", "๐Ÿค”", "๐Ÿคฏ", "๐Ÿ˜ฑ", "๐Ÿคฌ", + "๐Ÿ‘Ž", "๐Ÿ’ฉ", "๐Ÿคก", "๐Ÿฅณ", "๐Ÿ˜‡", "๐ŸŒš", "๐Ÿ™", "๐Ÿ‘Œ", "๐Ÿ•Š๏ธ", "๐Ÿณ", + "๐ŸŒญ", "๐Ÿฆ„", "๐ŸŒ", "๐Ÿ’Š", "๐Ÿ“", "๐Ÿพ", "๐Ÿ’‹", "๐Ÿ–•", "๐Ÿ‘€", "๐Ÿ‘ป", + "๐Ÿค", "๐Ÿคฃ", "โšก", "โœจ", "๐ŸŽˆ", "๐ŸŽ‰", "๐ŸงŠ", "๐Ÿ†’", "๐Ÿคจ", "๐Ÿ˜", + "๐Ÿคทโ€โ™‚๏ธ", "๐Ÿ’…", "๐Ÿ†", "๐Ÿ‘พ", "๐ŸŽฏ", "๐ŸŽฒ", "๐Ÿท", "๐Ÿคฎ", "๐Ÿฅฑ", "๐Ÿ˜ด", + "๐Ÿค", "๐Ÿฅด" + ) + items(telegramReactions) { emoji -> + Text( + text = emoji, + fontSize = 28.sp, + modifier = Modifier + .clip(CircleShape) + .clickable { onReactionSelected(emoji) } + .padding(4.dp) + ) + } } - } Divider(color = Color.White.copy(alpha = 0.1f)) @@ -694,6 +727,7 @@ fun MessageContextMenu( } } } +} @Composable fun ContextMenuItem(