import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sendtrain/classes/media.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; 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 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.activity.title} (${formattedTime(atm.totalTime)})"); } else { return Text(maxLines: 1, widget.activity.title); } }, ), subtitle: Text(maxLines: 2, widget.activity.description), ), ], )), ); } 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'); } } }