import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:provider/provider.dart'; import 'package:sendtrain/daos/media_items_dao.dart'; import 'package:sendtrain/daos/sessions_dao.dart'; import 'package:sendtrain/database/database.dart' hide ActivityAction; import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/widgets/builders/dialogs.dart'; class SessionCard extends StatefulWidget { final int type; final Session session; const SessionCard({super.key, this.type = 0, required this.session}); @override State createState() => _SessionCardState(); } class _SessionCardState extends State { @override Widget build(BuildContext context) { final int type = widget.type; final Session session = widget.session; initializeDateFormatting('en'); final DateFormat dateFormat = DateFormat('yyyy-MM-dd'); Color color = (session.status == SessionStatus.started) ? Theme.of(context).colorScheme.primaryContainer : Theme.of(context).colorScheme.surfaceContainerLow; return FutureBuilder>( future: MediaItemsDao(Provider.of(context)) .fromSession(session), builder: (context, snapshot) { if (snapshot.hasData) { List mediaItems = snapshot.data!; if (type == 0) { return Card( color: color, margin: const EdgeInsets.fromLTRB(15, 15, 15, 0), clipBehavior: Clip.hardEdge, child: InkWell( splashColor: Colors.deepPurple, onTap: () => showSessionDialog(session, context), child: Column( mainAxisSize: MainAxisSize.min, children: [ ListTile( contentPadding: EdgeInsets.only(left: 15), leading: Padding( padding: const EdgeInsets.fromLTRB(0, 8, 0, 0), child: Container( width: 60, decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.cover, image: findMediaByType(mediaItems, 'image')), // color: Colors.blue, borderRadius: BorderRadius.all( Radius.elliptical(10, 10)), ), )), title: Text(maxLines: 1, session.title.toTitleCase()), subtitle: Text( maxLines: 1, dateFormat.format(session.date as DateTime)), trailing: IconButton( padding: EdgeInsets.all(0), alignment: Alignment.topCenter, icon: Icon(Icons.close_rounded), onPressed: () { showRemovalDialog( 'Session Removal', 'Would you like to permanently remove this session?', context, SessionsDao(Provider.of( context, listen: false)), session) .then((result) { setState(() {}); }); }, ), ), ListTile( contentPadding: const EdgeInsets.fromLTRB(15, 0, 15, 15), title: Text( maxLines: 2, overflow: TextOverflow.ellipsis, style: const TextStyle(fontWeight: FontWeight.w300), session.content), ), ], )), ); } else { return Card( color: color, child: InkWell( // overlayColor: MaterialStateColor(Colors.deepPurple as int), splashColor: Colors.deepPurple, borderRadius: const BorderRadius.all(Radius.elliptical(10, 10)), onTap: () => showSessionDialog(session, context), child: Container( decoration: BoxDecoration( // color: const Color.fromARGB(47, 0, 0, 0), borderRadius: BorderRadius.circular(10), image: DecorationImage( colorFilter: ColorFilter.mode( Color.fromARGB(220, 41, 39, 39), BlendMode.hardLight), image: findMediaByType(mediaItems, 'image'), fit: BoxFit.cover), ), child: Align( alignment: Alignment.center, child: Column( mainAxisSize: MainAxisSize.min, children: [ ListTile( title: Text( maxLines: 3, session.title.toTitleCase(), textAlign: TextAlign.center), subtitle: Text( maxLines: 1, dateFormat .format(session.date as DateTime), textAlign: TextAlign.center), ), ]))))); } } 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'); } } }