import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:lucide_icons/lucide_icons.dart'; import '../../../../core/theme/design_tokens.dart'; const homeAttachmentStripKey = ValueKey('home_attachment_strip'); class HomeAttachmentStrip extends StatelessWidget { const HomeAttachmentStrip({ super.key, required this.images, required this.onRemove, }); final List images; final ValueChanged onRemove; @override Widget build(BuildContext context) { if (images.isEmpty) { return const SizedBox.shrink(); } final colorScheme = Theme.of(context).colorScheme; return Container( key: homeAttachmentStripKey, padding: const EdgeInsets.all(AppSpacing.sm), decoration: BoxDecoration( color: colorScheme.surfaceContainerLow, borderRadius: BorderRadius.circular(AppRadius.xl), border: Border.all(color: colorScheme.outlineVariant), ), child: Wrap( spacing: AppSpacing.sm, runSpacing: AppSpacing.sm, children: images.asMap().entries.map((entry) { return _AttachmentPreviewTile( image: entry.value, onRemove: () => onRemove(entry.key), ); }).toList(), ), ); } } class _AttachmentPreviewTile extends StatelessWidget { const _AttachmentPreviewTile({required this.image, required this.onRemove}); final XFile image; final VoidCallback onRemove; @override Widget build(BuildContext context) { const previewExtent = AppSpacing.xxl * 3 + AppSpacing.sm; final colorScheme = Theme.of(context).colorScheme; return Stack( children: [ ClipRRect( borderRadius: BorderRadius.circular(AppRadius.md), child: Image.file( File(image.path), width: previewExtent, height: previewExtent, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) { return Container( width: previewExtent, height: previewExtent, color: colorScheme.surface, alignment: Alignment.center, child: Icon( LucideIcons.image, size: AppSpacing.xl, color: colorScheme.onSurfaceVariant, ), ); }, ), ), Positioned( top: AppSpacing.xs, right: AppSpacing.xs, child: GestureDetector( onTap: onRemove, child: Container( width: AppSpacing.lg + AppSpacing.sm, height: AppSpacing.lg + AppSpacing.sm, decoration: BoxDecoration( color: colorScheme.error, shape: BoxShape.circle, ), child: Icon( LucideIcons.x, size: AppSpacing.md, color: colorScheme.onError, ), ), ), ), ], ); } }