further refactoring, conversion to stream
This commit is contained in:
@ -1,12 +1,11 @@
|
||||
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';
|
||||
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_card_full.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_card_small.dart';
|
||||
|
||||
class SessionCard extends StatefulWidget {
|
||||
final int type;
|
||||
@ -24,11 +23,6 @@ class _SessionCardState extends State<SessionCard> {
|
||||
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<List<MediaItem>>(
|
||||
future: MediaItemsDao(Provider.of<AppDatabase>(context))
|
||||
@ -38,126 +32,13 @@ class _SessionCardState extends State<SessionCard> {
|
||||
List<MediaItem> 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: <Widget>[
|
||||
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<AppDatabase>(
|
||||
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),
|
||||
),
|
||||
],
|
||||
)),
|
||||
);
|
||||
return SessionCardFull(session: session, mediaItems: mediaItems);
|
||||
} 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: <Widget>[
|
||||
ListTile(
|
||||
title: Text(
|
||||
maxLines: 3,
|
||||
session.title.toTitleCase(),
|
||||
textAlign: TextAlign.center),
|
||||
subtitle: Text(
|
||||
maxLines: 1,
|
||||
dateFormat
|
||||
.format(session.date as DateTime),
|
||||
textAlign: TextAlign.center),
|
||||
),
|
||||
])))));
|
||||
return SessionCardSmall(session: session, mediaItems: mediaItems);
|
||||
}
|
||||
} else {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
child: SizedBox(
|
||||
height: 50.0,
|
||||
width: 50.0,
|
||||
child: CircularProgressIndicator(),
|
||||
));
|
||||
return GenericProgressIndicator();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
ImageProvider findMediaByType(List<MediaItem> media, String type) {
|
||||
Iterable<MediaItem>? 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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
72
lib/widgets/sessions/session_card_full.dart
Normal file
72
lib/widgets/sessions/session_card_full.dart
Normal file
@ -0,0 +1,72 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sendtrain/daos/sessions_dao.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||
import 'package:sendtrain/helpers/date_helpers.dart';
|
||||
import 'package:sendtrain/helpers/media_helpers.dart';
|
||||
import 'package:sendtrain/widgets/builders/dialogs.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/card_content.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/card_image.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_view.dart';
|
||||
|
||||
class SessionCardFull extends StatefulWidget {
|
||||
const SessionCardFull(
|
||||
{super.key, required this.session, required this.mediaItems});
|
||||
|
||||
final Session session;
|
||||
final List<MediaItem> mediaItems;
|
||||
|
||||
@override
|
||||
State<SessionCardFull> createState() => _SessionCardFullState();
|
||||
}
|
||||
|
||||
class _SessionCardFullState extends State<SessionCardFull> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final Session session = widget.session;
|
||||
final List<MediaItem> mediaItems = widget.mediaItems;
|
||||
|
||||
return Card(
|
||||
color: (session.status == SessionStatus.started)
|
||||
? Theme.of(context).colorScheme.primaryContainer
|
||||
: Theme.of(context).colorScheme.surfaceContainerLow,
|
||||
margin: const EdgeInsets.fromLTRB(15, 15, 15, 0),
|
||||
clipBehavior: Clip.hardEdge,
|
||||
child: InkWell(
|
||||
splashColor: Colors.deepPurple,
|
||||
onTap: () =>
|
||||
showGenericDialog(SessionView(session: session), context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
ListTile(
|
||||
contentPadding: EdgeInsets.only(left: 8),
|
||||
leading: CardImage(image: findMediaByType(mediaItems, 'image')),
|
||||
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<AppDatabase>(context,
|
||||
listen: false)),
|
||||
session)
|
||||
.then((result) {
|
||||
setState(() {});
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
CardContent(content: session.content)
|
||||
],
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
62
lib/widgets/sessions/session_card_small.dart
Normal file
62
lib/widgets/sessions/session_card_small.dart
Normal file
@ -0,0 +1,62 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||
import 'package:sendtrain/helpers/date_helpers.dart';
|
||||
import 'package:sendtrain/helpers/media_helpers.dart';
|
||||
import 'package:sendtrain/widgets/builders/dialogs.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_view.dart';
|
||||
|
||||
class SessionCardSmall extends StatefulWidget {
|
||||
const SessionCardSmall(
|
||||
{super.key, required this.session, required this.mediaItems});
|
||||
|
||||
final Session session;
|
||||
final List<MediaItem> mediaItems;
|
||||
|
||||
@override
|
||||
State<SessionCardSmall> createState() => _SessionCardSmallState();
|
||||
}
|
||||
|
||||
class _SessionCardSmallState extends State<SessionCardSmall> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final Session session = widget.session;
|
||||
final List<MediaItem> mediaItems = widget.mediaItems;
|
||||
|
||||
return Card(
|
||||
color: (session.status == SessionStatus.started)
|
||||
? Theme.of(context).colorScheme.primaryContainer
|
||||
: Theme.of(context).colorScheme.surfaceContainerLow,
|
||||
child: InkWell(
|
||||
// overlayColor: MaterialStateColor(Colors.deepPurple as int),
|
||||
splashColor: Colors.deepPurple,
|
||||
borderRadius: const BorderRadius.all(Radius.elliptical(10, 10)),
|
||||
onTap: () => showGenericDialog(SessionView(session: 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: <Widget>[
|
||||
ListTile(
|
||||
title: Text(
|
||||
maxLines: 3,
|
||||
session.title.toTitleCase(),
|
||||
textAlign: TextAlign.center),
|
||||
subtitle: Text(
|
||||
maxLines: 1,
|
||||
dateFormat.format(session.date as DateTime),
|
||||
textAlign: TextAlign.center),
|
||||
),
|
||||
])))));
|
||||
}
|
||||
}
|
@ -9,6 +9,7 @@ import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/widgets/builders/dialogs.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/form_search_input.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/form_text_input.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_view.dart';
|
||||
|
||||
class SessionCreator extends StatefulWidget {
|
||||
const SessionCreator({super.key, this.data, this.session});
|
||||
@ -123,8 +124,8 @@ class _SessionCreatorState extends State<SessionCreator> {
|
||||
createSession(_formKey.currentContext)
|
||||
.then((id) => {
|
||||
SessionsDao(db).find(id).then(
|
||||
(session) => showSessionDialog(
|
||||
session,
|
||||
(session) => showGenericDialog(
|
||||
SessionView(session: session),
|
||||
_formKey
|
||||
.currentContext!)),
|
||||
Navigator.pop(
|
||||
|
@ -7,6 +7,7 @@ import 'package:provider/provider.dart';
|
||||
import 'package:sendtrain/daos/activities_dao.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/extensions/string_extensions.dart';
|
||||
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_view_achievements.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_view_activities.dart';
|
||||
import 'package:sendtrain/widgets/sessions/session_view_media.dart';
|
||||
@ -28,12 +29,13 @@ class _SessionViewState extends State<SessionView> {
|
||||
initializeDateFormatting('en');
|
||||
final DateFormat dateFormat = DateFormat('yyyy-MM-dd');
|
||||
|
||||
return FutureBuilder<List<Activity>>(
|
||||
future: ActivitiesDao(Provider.of<AppDatabase>(context))
|
||||
.sessionActivities(session.id),
|
||||
return StreamBuilder<List<Activity>>(
|
||||
stream: ActivitiesDao(Provider.of<AppDatabase>(context))
|
||||
.watchSessionActivities(session.id),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
final activities = snapshot.data!;
|
||||
|
||||
return Scaffold(
|
||||
floatingActionButtonLocation: ExpandableFab.location,
|
||||
floatingActionButton: ExpandableFab(
|
||||
@ -100,13 +102,7 @@ class _SessionViewState extends State<SessionView> {
|
||||
],
|
||||
));
|
||||
} else {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
child: SizedBox(
|
||||
height: 50.0,
|
||||
width: 50.0,
|
||||
child: CircularProgressIndicator(),
|
||||
));
|
||||
return GenericProgressIndicator();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -2,21 +2,27 @@ import 'package:flutter/material.dart';
|
||||
import 'package:sendtrain/database/database.dart';
|
||||
import 'package:sendtrain/widgets/activities/activity_card.dart';
|
||||
|
||||
class SessionViewActivities extends StatelessWidget {
|
||||
class SessionViewActivities extends StatefulWidget {
|
||||
const SessionViewActivities({super.key, required this.activities });
|
||||
|
||||
final List<Activity> activities;
|
||||
|
||||
@override
|
||||
State<SessionViewActivities> createState() => _SessionViewActivitiesState();
|
||||
}
|
||||
|
||||
class _SessionViewActivitiesState extends State<SessionViewActivities> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Expanded(
|
||||
child: ListView.builder(
|
||||
// shrinkWrap: true,
|
||||
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
|
||||
itemCount: activities.length,
|
||||
itemCount: widget.activities.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return ActivityCard(
|
||||
activity: activities[index]);
|
||||
activity: widget.activities[index]);
|
||||
},
|
||||
));
|
||||
}
|
||||
|
Reference in New Issue
Block a user