import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:kuwot/core/data/local/translation_target_config.dart'; import 'package:kuwot/core/router/app_router.gr.dart'; import 'package:kuwot/features/quote/data/data_sources/remote/kuwot_api_remote_data_source.dart'; import 'package:kuwot/features/quote/presentation/bloc/background_images_bloc.dart'; import 'package:kuwot/features/quote/presentation/bloc/quote_bloc.dart'; import 'package:kuwot/features/quote/presentation/widgets/background_image_widget.dart'; import 'package:kuwot/features/quote/presentation/widgets/quote_widget.dart'; import 'package:kuwot/features/quote/presentation/widgets/translate_target_dialog.dart'; import 'package:screenshot/screenshot.dart'; import 'package:share_plus/share_plus.dart'; @RoutePage() class QuotePage extends StatefulWidget { const QuotePage({super.key}); @override State createState() => _QuotePageState(); } class _QuotePageState extends State { final _screenshotController = ScreenshotController(); int _backgroundIndex = 0; bool _isSharingQuote = false; late QuoteBloc _dailyQuoteBloc; late BackgroundImagesBloc _backgroundImagesBloc; @override void initState() { super.initState(); _dailyQuoteBloc = context.read(); _backgroundImagesBloc = context.read(); // get daily quote & background photos _dailyQuoteBloc.add(const GetQuoteEvent()); _backgroundImagesBloc.add(const GetBackgroundImagesEvent()); } @override Widget build(BuildContext context) { final header = Padding( padding: const EdgeInsets.fromLTRB(24, 8, 16, 8), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ Text('Kuwot', style: GoogleFonts.sriracha(fontSize: 30)), const SizedBox(width: 2), SvgPicture.asset( 'assets/svgs/chat-quote.svg', height: 24, colorFilter: ColorFilter.mode( Theme.of(context).colorScheme.onSurface, BlendMode.srcIn, ), ), ], ), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ IconButton( onPressed: () { context.router.push(const DonationRoute()); }, icon: const FaIcon(FontAwesomeIcons.mugHot), ), IconButton( onPressed: () { context.router.push(const AppSettingsRoute()); }, icon: const FaIcon(FontAwesomeIcons.sliders), ), ], ), ], ), ); final body = SafeArea( child: Stack( fit: StackFit.expand, children: [ Align(alignment: Alignment.topLeft, child: header), Padding( padding: const EdgeInsets.fromLTRB(24, 70, 24, 24), child: _buildQuote(), ), ], ), ); return Scaffold(body: body); } Widget _buildQuote() { final screenshotEnabledQuote = Screenshot( controller: _screenshotController, child: Stack( fit: StackFit.expand, children: [ BackgroundPhotoWidget( backgroundIndex: _backgroundIndex, hideImageInfoButton: _isSharingQuote, ), const Align(alignment: Alignment.center, child: QuoteWidget()), ], ), ); final actionButtons = [ Expanded( child: _buildQuoteActionButton( onPressed: () { _dailyQuoteBloc.add(const GetQuoteEvent()); }, icon: const FaIcon(FontAwesomeIcons.quoteRight), ), ), Expanded( child: _buildQuoteActionButton( onPressed: _cycleBackground, icon: const FaIcon(FontAwesomeIcons.image), ), ), Expanded( child: _buildQuoteActionButton( onPressed: () async { final result = await showAdaptiveDialog( context: context, barrierDismissible: true, builder: (context) => const TranslateTargetDialog(), ); if (result != null) { _dailyQuoteBloc.add(GetTranslatedQuoteEvent(result)); } }, icon: const FaIcon(FontAwesomeIcons.language), ), ), Expanded( child: _buildQuoteActionButton( onPressed: _shareQuote, icon: const FaIcon(FontAwesomeIcons.shareNodes), ), ), ]; return Card( clipBehavior: Clip.antiAlias, margin: const EdgeInsets.all(0), elevation: 12, child: Column( children: [ Expanded(child: screenshotEnabledQuote), Row(children: actionButtons), ], ), ); } Widget _buildQuoteActionButton({ required VoidCallback onPressed, required Widget icon, }) { return InkWell( onTap: onPressed, child: Container( height: 50, alignment: Alignment.center, padding: const EdgeInsets.all(8), child: icon, ), ); } void _cycleBackground() { setState(() { _backgroundIndex = ++_backgroundIndex % imagesPerPage; }); } Future _shareQuote() async { setState(() => _isSharingQuote = true); final image = await _screenshotController.capture(); setState(() => _isSharingQuote = false); if (image == null) return; final shareParams = ShareParams( files: [ XFile.fromData( image, mimeType: 'image/png', name: 'kuwot_${DateTime.now().millisecondsSinceEpoch}.png', ), ], ); await SharePlus.instance.share(shareParams); } }