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(
|
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
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user