/// Widget: Image Viewer Dialog /// /// Full-screen image viewer with swipe navigation. library; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:worker/features/showrooms/domain/entities/sample_project.dart'; /// Image Viewer Dialog /// /// Full-screen dialog for viewing images with: /// - PageView for swipe navigation /// - Image counter (1/5) /// - Close button /// - Gradient overlay for visibility class ImageViewerDialog extends StatefulWidget { const ImageViewerDialog({ super.key, required this.images, required this.initialIndex, }); final List images; final int initialIndex; @override State createState() => _ImageViewerDialogState(); } class _ImageViewerDialogState extends State { late PageController _pageController; late int _currentIndex; @override void initState() { super.initState(); _currentIndex = widget.initialIndex; _pageController = PageController(initialPage: widget.initialIndex); } @override void dispose() { _pageController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Dialog( backgroundColor: Colors.transparent, insetPadding: EdgeInsets.zero, child: Container( color: Colors.black, child: Stack( children: [ // Main PageView Center( child: PageView.builder( controller: _pageController, onPageChanged: (index) { setState(() { _currentIndex = index; }); }, itemCount: widget.images.length, itemBuilder: (context, index) { return Center( child: CachedNetworkImage( imageUrl: widget.images[index].fileUrl, fit: BoxFit.contain, placeholder: (context, url) => const Center( child: CircularProgressIndicator(color: Colors.white), ), errorWidget: (context, url, error) => const Icon( Icons.error, color: Colors.white, size: 48, ), ), ); }, ), ), // Top bar with counter and close button Positioned( top: 0, left: 0, right: 0, child: SafeArea( child: Container( padding: const EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.black.withValues(alpha: 0.7), Colors.transparent, ], ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( '${_currentIndex + 1} / ${widget.images.length}', style: const TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, ), ), IconButton( icon: const Icon(Icons.close, color: Colors.white), onPressed: () => Navigator.pop(context), ), ], ), ), ), ), ], ), ), ); } }