import 'dart:math'; import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/views/home/main/main_page_state.dart'; import 'package:didvan/views/widgets/animated_visibility.dart'; import 'package:didvan/views/widgets/didvan/slider.dart'; import 'package:didvan/views/widgets/ink_wrapper.dart'; import 'package:didvan/views/widgets/skeleton_image.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher_string.dart'; class MainPageBanner extends StatelessWidget { final bool isFirst; const MainPageBanner({super.key, required this.isFirst}); @override Widget build(BuildContext context) { final state = context.read(); return DidvanSlider( itemBuilder: (context, index, realIndex) { final item = state.content.banners[isFirst ? 0 : 1][index]; return Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: GestureDetector( onTap: () => item.link == null || item.link!.isEmpty ? _openInteractiveViewer(context, item.image) : launchUrlString(item.link!, mode: LaunchMode.inAppWebView), child: SkeletonImage( imageUrl: item.image, ), ), ); }, itemCount: state.content.banners[isFirst ? 0 : 1].length, viewportFraction: 1, enableIndicator: true, ); } void _openInteractiveViewer(BuildContext context, String image) { showDialog( context: context, builder: (context) => Stack( children: [ Positioned.fill( child: InteractiveViewer( child: Center( child: SkeletonImage( width: min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height), imageUrl: image, ), ), ), ), const Positioned( right: 24, top: 24, child: _BackButton(), ), ], ), ); } } class _BackButton extends StatefulWidget { const _BackButton({Key? key}) : super(key: key); @override __BackButtonState createState() => __BackButtonState(); } class __BackButtonState extends State<_BackButton> { @override Widget build(BuildContext context) { return AnimatedVisibility( duration: DesignConfig.lowAnimationDuration, isVisible: true, child: InkWrapper( borderRadius: DesignConfig.lowBorderRadius, onPressed: Navigator.of(context).pop, child: Container( decoration: BoxDecoration( color: Theme.of(context).colorScheme.splash, border: Border.all(color: Theme.of(context).colorScheme.border), borderRadius: DesignConfig.lowBorderRadius, ), child: const Icon( DidvanIcons.back_regular, size: 32, ), ), ), ); } }