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