feat: Update FileAttachment component for improved UI and error handling

This commit is contained in:
k1ngsterr1
2026-01-25 17:32:31 +05:00
parent 7d535df9cf
commit 3ece5fe84d

View File

@@ -506,107 +506,107 @@ fun FileAttachment(
} }
} }
// Telegram-style файл // Telegram-style файл - как в desktop: без внутреннего фона, просто иконка + текст
Row( Row(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.clip(RoundedCornerShape(8.dp))
.background(
if (isOutgoing) {
Color.White.copy(alpha = 0.15f)
} else {
if (isDarkTheme) Color(0xFF2A2A2A) else Color(0xFFF0F0F0)
}
)
.clickable(enabled = downloadStatus == DownloadStatus.NOT_DOWNLOADED || downloadStatus == DownloadStatus.ERROR) { .clickable(enabled = downloadStatus == DownloadStatus.NOT_DOWNLOADED || downloadStatus == DownloadStatus.ERROR) {
download() download()
} }
.padding(10.dp), .padding(vertical = 4.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
// File icon с индикатором прогресса // File icon с индикатором прогресса - круглая иконка как в desktop
Box( Box(
modifier = Modifier.size(44.dp), modifier = Modifier.size(40.dp),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
// Фон иконки // Круглый фон иконки
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.clip(CircleShape) .clip(CircleShape)
.background( .background(
if (isOutgoing) Color.White.copy(0.2f) if (downloadStatus == DownloadStatus.ERROR) Color(0xFFE53935)
else PrimaryBlue.copy(alpha = 0.15f) else PrimaryBlue
), ),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
when (downloadStatus) { when (downloadStatus) {
DownloadStatus.DOWNLOADING, DownloadStatus.DECRYPTING -> { DownloadStatus.DOWNLOADING, DownloadStatus.DECRYPTING -> {
CircularProgressIndicator( CircularProgressIndicator(
modifier = Modifier.size(28.dp), modifier = Modifier.size(24.dp),
color = if (isOutgoing) Color.White else PrimaryBlue, color = Color.White,
strokeWidth = 2.5.dp strokeWidth = 2.dp
) )
} }
DownloadStatus.NOT_DOWNLOADED -> { DownloadStatus.NOT_DOWNLOADED -> {
Icon( Icon(
Icons.Default.ArrowDownward, Icons.Default.ArrowDownward,
contentDescription = "Download", contentDescription = "Download",
tint = if (isOutgoing) Color.White else PrimaryBlue, tint = Color.White,
modifier = Modifier.size(22.dp) modifier = Modifier.size(20.dp)
) )
} }
DownloadStatus.DOWNLOADED -> { DownloadStatus.DOWNLOADED -> {
Icon( Icon(
Icons.Default.InsertDriveFile, Icons.Default.InsertDriveFile,
contentDescription = null, contentDescription = null,
tint = if (isOutgoing) Color.White else PrimaryBlue, tint = Color.White,
modifier = Modifier.size(22.dp) modifier = Modifier.size(20.dp)
) )
} }
DownloadStatus.ERROR -> { DownloadStatus.ERROR -> {
Icon( Icon(
Icons.Default.ErrorOutline, Icons.Default.Close,
contentDescription = "Error", contentDescription = "Error",
tint = Color(0xFFE53935), tint = Color.White,
modifier = Modifier.size(22.dp) modifier = Modifier.size(20.dp)
) )
} }
else -> { else -> {
Icon( Icon(
Icons.Default.InsertDriveFile, Icons.Default.InsertDriveFile,
contentDescription = null, contentDescription = null,
tint = if (isOutgoing) Color.White else PrimaryBlue, tint = Color.White,
modifier = Modifier.size(22.dp) modifier = Modifier.size(20.dp)
) )
} }
} }
} }
} }
Spacer(modifier = Modifier.width(12.dp)) Spacer(modifier = Modifier.width(10.dp))
// File info // File info
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text( Text(
text = fileName, text = fileName,
fontSize = 14.sp, fontSize = 14.sp,
fontWeight = FontWeight.Medium, fontWeight = FontWeight.Normal,
color = if (isOutgoing) Color.White else (if (isDarkTheme) Color.White else Color.Black), color = if (isOutgoing) Color.White else (if (isDarkTheme) Color.White else Color.Black),
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
) )
Spacer(modifier = Modifier.height(2.dp)) Spacer(modifier = Modifier.height(2.dp))
// Размер файла и тип
val fileExtension = fileName.substringAfterLast('.', "").uppercase()
Text( Text(
text = when (downloadStatus) { text = when (downloadStatus) {
DownloadStatus.DOWNLOADING -> "Downloading..." DownloadStatus.DOWNLOADING -> "Downloading..."
DownloadStatus.DECRYPTING -> "Decrypting..." DownloadStatus.DECRYPTING -> "Decrypting..."
DownloadStatus.ERROR -> "Download failed" DownloadStatus.ERROR -> "File expired"
else -> formatFileSize(fileSize) else -> "${formatFileSize(fileSize)} $fileExtension"
}, },
fontSize = 12.sp, fontSize = 12.sp,
color = if (isOutgoing) Color.White.copy(alpha = 0.7f) color = if (downloadStatus == DownloadStatus.ERROR) {
else (if (isDarkTheme) Color.White.copy(alpha = 0.5f) else Color.Gray) Color(0xFFE53935)
} else if (isOutgoing) {
Color.White.copy(alpha = 0.7f)
} else {
PrimaryBlue
}
) )
} }
} }