/// Widget: File Preview Item /// /// Displays a file preview with icon, name, size, and remove button. library; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:worker/core/theme/colors.dart'; /// File Preview Item Widget /// /// Shows uploaded file with: /// - File type icon (PDF, image, etc.) /// - File name /// - File size /// - Remove button class FilePreviewItem extends StatelessWidget { const FilePreviewItem({ super.key, required this.file, required this.onRemove, }); final PlatformFile file; final VoidCallback onRemove; IconData _getFileIcon() { final extension = file.extension?.toLowerCase(); if (extension == 'pdf') return Icons.picture_as_pdf; if (extension == 'jpg' || extension == 'jpeg' || extension == 'png') { return Icons.image; } return Icons.insert_drive_file; } String _formatFileSize(int bytes) { if (bytes < 1024) return '$bytes B'; if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)} KB'; return '${(bytes / (1024 * 1024)).toStringAsFixed(1)} MB'; } @override Widget build(BuildContext context) { final colorScheme = Theme.of(context).colorScheme; return Container( margin: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: colorScheme.surfaceContainerHighest, borderRadius: BorderRadius.circular(8), ), child: Row( children: [ Container( width: 40, height: 40, decoration: BoxDecoration( color: colorScheme.primary, borderRadius: BorderRadius.circular(6), ), child: Icon(_getFileIcon(), color: colorScheme.surface, size: 20), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( file.name, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: colorScheme.onSurface, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 4), Text( _formatFileSize(file.size), style: TextStyle( fontSize: 12, color: colorScheme.onSurfaceVariant, ), ), ], ), ), IconButton( icon: const Icon(Icons.close, size: 20), color: AppColors.danger, onPressed: onRemove, padding: EdgeInsets.zero, constraints: const BoxConstraints(minWidth: 24, minHeight: 24), ), ], ), ); } }