import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sendtrain/daos/activities_dao.dart'; import 'package:sendtrain/daos/media_items_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activities/activity_view.dart'; class ActivityCard extends StatefulWidget { final Activity activity; const ActivityCard({super.key, required this.activity}); @override State createState() => ActivityCardState(); } class ActivityCardState extends State { String formattedTime(int timeInSecond) { int sec = timeInSecond % 60; int min = (timeInSecond / 60).floor(); String minute = min.toString().length <= 1 ? "0$min" : "$min"; String second = sec.toString().length <= 1 ? "0$sec" : "$sec"; return "$minute:$second"; } @override Widget build(BuildContext context) { final ActivityTimerModel atm = Provider.of(context, listen: false); return FutureBuilder>( future: MediaItemsDao(Provider.of(context)) .fromActivity(widget.activity), builder: (context, snapshot) { if (snapshot.hasData) { List mediaItems = snapshot.data!; return Card( color: atm.activity?.id == widget.activity.id ? Theme.of(context).colorScheme.primaryContainer : Theme.of(context).colorScheme.surfaceContainerLow, clipBehavior: Clip.hardEdge, child: InkWell( onTap: () => showGeneralDialog( barrierColor: Colors.black.withOpacity(0.5), transitionDuration: const Duration(milliseconds: 220), transitionBuilder: (BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { Animation custom = Tween( begin: const Offset(0.0, 1.0), end: const Offset(0.0, 0.0)) .animate(animation); return SlideTransition( position: custom, child: Dialog.fullscreen( child: ActivityView(activity: widget.activity))); }, barrierDismissible: true, barrierLabel: '', context: context, pageBuilder: (context, animation1, animation2) { return Container(); }), child: Column( mainAxisSize: MainAxisSize.min, children: [ ListTile( // visualDensity: VisualDensity(horizontal: VisualDensity.maximumDensity), leading: Padding( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), child: Container( // padding: EdgeInsets.only(top: 5, bottom: 5), width: 60, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.fill, image: findMediaByType(mediaItems, 'image')), // color: Colors.blue, borderRadius: const BorderRadius.all( Radius.elliptical(8, 8)), ), )), title: Consumer( builder: (context, atm, child) { if (atm.activity?.id == widget.activity.id) { return Text( maxLines: 1, "${widget.activity.title.toTitleCase()} (${formattedTime(atm.totalTime)})"); } else { return Text( maxLines: 1, widget.activity.title.toTitleCase()); } }, ), subtitle: Text(maxLines: 2, widget.activity.description), contentPadding: EdgeInsets.only(left: 13), trailing: Flex( direction: Axis.vertical, mainAxisSize: MainAxisSize.max, children: [ IconButton( padding: EdgeInsets.all(0), alignment: Alignment.topCenter, visualDensity: VisualDensity.compact, icon: Icon(Icons.close_rounded), onPressed: () { showAdaptiveDialog( context: context, builder: (BuildContext context) => AlertDialog( title: const Text('Activity Removal'), content: const Text( 'Would you like to permanently remove this activity from the current session?'), actions: [ TextButton( onPressed: () => Navigator.pop( context, 'Cancel'), child: const Text('Cancel'), ), TextButton( onPressed: () => { ActivitiesDao( Provider.of( context, listen: false)) .remove(widget.activity) .then((result) { setState(() {}); }), Navigator.pop(context, 'OK') }, child: const Text('OK'), ), ], ), ); }, ) ]) // trailing: FittedBox( // alignment: Alignment.topCenter, // fit: BoxFit.fitHeight, // child: IconButton( // padding: EdgeInsets.all(0), // alignment: Alignment.topCenter, // // visualDensity: VisualDensity.compact, // icon: Icon(Icons.close_rounded), // onPressed: () { // showAdaptiveDialog( // context: context, // builder: (BuildContext context) => // AlertDialog( // title: const Text('Activity Removal'), // content: const Text( // 'Would you like to permanently remove this activity from the current session?'), // actions: [ // TextButton( // onPressed: () => // Navigator.pop(context, 'Cancel'), // child: const Text('Cancel'), // ), // TextButton( // onPressed: () => // Navigator.pop(context, 'OK'), // child: const Text('OK'), // ), // ], // ), // ); // }, // )) ), ], )), ); } else { return Container( alignment: Alignment.center, child: SizedBox( height: 50.0, width: 50.0, child: CircularProgressIndicator(), )); } }); } ImageProvider findMediaByType(List media, String type) { Iterable? found = media.where((m) => m.type == MediaType.image); if (found.isNotEmpty) { return NetworkImage(found.first.reference); } else { // Element is not found return const AssetImage('assets/images/placeholder.jpg'); } } }