feat: Update FileAttachment component for improved UI and error handling
This commit is contained in:
@@ -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
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user