import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sendtrain/classes/media.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_view.dart'; class ActivityCard extends StatefulWidget { final ActivityModel activity; final Activity data; const ActivityCard({super.key, required this.activity, required this.data}); @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 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( leading: Padding( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), child: Container( width: 60, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.cover, image: findMediaByType( widget.activity.actions[0].media, 'image')), // color: Colors.blue, borderRadius: const BorderRadius.all(Radius.elliptical(10, 10)), ), )), title: Consumer( builder: (context, atm, child) { if (atm.activity?.id == widget.activity.id) { return Text( maxLines: 1, "${widget.data.title} (${formattedTime(atm.totalTime)})"); } else { return Text(maxLines: 1, widget.data.title); } }, ), subtitle: Text(maxLines: 2, widget.data.description), trailing: IconButton( 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'), ), ], ), ); }, )), ], )), ); } ImageProvider findMediaByType(List? media, String type) { var found = media?.where((m) => m.type == 'image'); if (found != null) { return NetworkImage(found.first.reference); } else { // Element is not found return const AssetImage('assets/images/placeholder.jpg'); } } }