migration to move achievements to session, prep for achievement and media management

This commit is contained in:
Joshua Burman
2025-01-02 19:50:29 -05:00
parent 48f716cdb0
commit 2206720810
19 changed files with 6771 additions and 186 deletions

View File

@ -0,0 +1,18 @@
import 'package:flutter/material.dart';
class AchievementEditor extends StatefulWidget {
const AchievementEditor({super.key, this.achievements, this.callback});
final List? achievements;
final Function? callback;
@override
State<AchievementEditor> createState() => _AchievementEditorState();
}
class _AchievementEditorState extends State<AchievementEditor> {
@override
Widget build(BuildContext context, ) {
return Text('this is a test');
}
}

View File

@ -20,8 +20,8 @@ Future showGenericDialog(dynamic object, BuildContext parentContext) {
});
}
Future showRemovalDialog(String title, String content, BuildContext context,
dynamic dao, dynamic object) {
Future showCrudDialog(String title, String content, BuildContext context,
dynamic daoCall, dynamic object) {
return showAdaptiveDialog(
context: context,
builder: (BuildContext context) => AlertDialog(
@ -35,10 +35,20 @@ Future showRemovalDialog(String title, String content, BuildContext context,
child: const Text('Cancel'),
),
TextButton(
onPressed: () => {dao.remove(object), Navigator.pop(context, 'OK')},
onPressed: () => {daoCall(object), Navigator.pop(context, 'OK')},
child: const Text('OK'),
),
],
),
);
}
Future showRemovalDialog(String title, String content, BuildContext context,
dynamic dao, dynamic object) {
return showCrudDialog(title, content, context, dao.remove, object);
}
Future showUpdateDialog(String title, String content, BuildContext context,
dynamic dao, dynamic object) {
return showCrudDialog(title, content, context, dao.replace, object);
}

View File

@ -10,31 +10,31 @@ import 'package:sendtrain/helpers/widget_helpers.dart';
import 'package:sendtrain/widgets/builders/dialogs.dart';
import 'package:video_player/video_player.dart';
class MediaCard extends StatefulWidget {
class MediaCard extends StatelessWidget {
const MediaCard({super.key, required this.media, this.callback});
final MediaItem media;
final Function? callback;
@override
State<MediaCard> createState() => _MediaCardState();
}
// @override
// State<MediaCard> createState() => _MediaCardState();
// }
class _MediaCardState extends State<MediaCard> {
// late VideoPlayerController _controller;
late MediaItem media;
late Function? callback;
// class _MediaCardState extends State<MediaCard> {
// // late VideoPlayerController _controller;
// late MediaItem media;
// late Function? callback;
@override
void initState() {
super.initState();
media = widget.media;
callback = widget.callback;
// @override
// void initState() {
// super.initState();
// media = widget.media;
// callback = widget.callback;
// _controller = VideoPlayerController.asset(dataSource)
// ..initialize().then((_) {
// setState(() {}); //when your thumbnail will show.
// });
}
// }
// @override
// void dispose() {

View File

@ -8,6 +8,7 @@ import 'package:sendtrain/daos/activities_dao.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/widget_helpers.dart';
import 'package:sendtrain/widgets/generic/elements/generic_progress_indicator.dart';
import 'package:sendtrain/widgets/sessions/session_editor.dart';
import 'package:sendtrain/widgets/sessions/session_view_achievements.dart';
@ -119,19 +120,10 @@ class _SessionViewState extends State<SessionView> {
icon: const Icon(Icons.edit_outlined),
label: Text('Edit'),
onPressed: () {
showModalBottomSheet<void>(
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.all(Radius.circular(10.0)),
),
context: context,
showDragHandle: true,
isScrollControlled: true,
useSafeArea: true,
builder: (BuildContext context) {
return SessionEditor(
session: session, callback: resetState);
});
showEditorSheet(
context,
SessionEditor(
session: session, callback: resetState));
},
),
]),

View File

@ -1,82 +1,139 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sendtrain/daos/session_activities_dao.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/widget_helpers.dart';
import 'package:sendtrain/widgets/achievements/achievement_editor.dart';
import 'package:sendtrain/widgets/builders/dialogs.dart';
class SessionViewAchievements extends StatelessWidget {
const SessionViewAchievements({super.key, required this.session});
final Session session;
List<String> getAchievements(List<SessionActivity> sessionActivities) {
List<String> achievements = [];
// List<String> getAchievements(List<SessionActivity> sessionActivities) {
// List<String> achievements = [];
for (int i = 0; i < sessionActivities.length; i++) {
final SessionActivity sessionActivity = sessionActivities[i];
final List? saAchievments = sessionActivity.achievements?.split(',');
// for (int i = 0; i < sessionActivities.length; i++) {
// final SessionActivity sessionActivity = sessionActivities[i];
// final List? saAchievments = sessionActivity.achievements?.split(',');
if (saAchievments != null) {
saAchievments.forEach((achievement) => achievements.add(achievement));
}
}
// if (saAchievments != null) {
// saAchievments.forEach((achievement) => achievements.add(achievement));
// }
// }
return achievements;
// return achievements;
// }
void resetState() {
// setState(() {});
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<SessionActivity>>(
future: SessionActivitiesDao(Provider.of<AppDatabase>(context))
.fromSessionId(session.id),
builder: (context, snapshot) {
if (snapshot.hasData) {
final sessionActivities = snapshot.data!;
final achievements = getAchievements(sessionActivities);
Widget content;
if (session.achievements == null) {
content = Padding(
padding: const EdgeInsets.only(left: 10, right: 5),
child: ActionChip(
visualDensity: VisualDensity.compact,
avatar: const Icon(Icons.check_circle_outline),
label: Text(maxLines: 1, 'Add Achievements!'),
onPressed: () {
showEditorSheet(context, AchievementEditor(callback: resetState));
},
));
} else {
final achievements = json.decode(session.achievements!);
content = ListView.builder(
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
itemCount: achievements.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.only(right: 5),
child: ActionChip(
visualDensity: VisualDensity.compact,
avatar: const Icon(Icons.check_circle_outline),
label: Text(maxLines: 1, achievements[index].toString().toTitleCase()),
onPressed: () {
showUpdateDialog(
'Achievement Removal',
'Would you like to remove this achievement?',
context,
SessionsDao(
Provider.of<AppDatabase>(context, listen: false)),
session);
}));
},
);
}
Widget content;
if (achievements.isEmpty) {
content = Padding(
padding: const EdgeInsets.only(left: 10, right: 5),
child: ActionChip(
visualDensity: VisualDensity.compact,
avatar: const Icon(Icons.check_circle_outline),
label: Text(maxLines: 1, 'Add Achievements!'),
onPressed: () {},
));
} else {
content = ListView.builder(
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
itemCount: achievements.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.only(right: 5),
child: ActionChip(
visualDensity: VisualDensity.compact,
avatar: const Icon(Icons.check_circle_outline),
label: Text(
maxLines: 1, achievements[index].toTitleCase()),
onPressed: () {
// remove achievements
},
));
},
);
}
return Column(
children: [
Padding(
padding: const EdgeInsets.only(bottom: 10),
child: SizedBox(height: 40, child: content)),
],
);
// return StreamBuilder<List<SessionActivity>>(
// stream: SessionActivitiesDao(Provider.of<AppDatabase>(context))
// .fromSessionId(session.id).asStream(),
// builder: (context, snapshot) {
// if (snapshot.hasData) {
// final sessionActivities = snapshot.data!;
// final achievements = getAchievements(sessionActivities);
return Column(
children: [
Padding(
padding: const EdgeInsets.only(bottom: 10),
child: SizedBox(height: 40, child: content)),
],
);
} else {
return Padding(
padding: EdgeInsets.all(15),
child: CircularProgressIndicator());
}
});
// Widget content;
// if (achievements.isEmpty) {
// content = Padding(
// padding: const EdgeInsets.only(left: 10, right: 5),
// child: ActionChip(
// visualDensity: VisualDensity.compact,
// avatar: const Icon(Icons.check_circle_outline),
// label: Text(maxLines: 1, 'Add Achievements!'),
// onPressed: () {
// showEditorSheet(context, AchievementEditor(achievements: achievements, callback: resetState));
// },
// ));
// } else {
// content = ListView.builder(
// scrollDirection: Axis.horizontal,
// padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
// itemCount: achievements.length,
// itemBuilder: (BuildContext context, int index) {
// return Padding(
// padding: const EdgeInsets.only(right: 5),
// child: ActionChip(
// visualDensity: VisualDensity.compact,
// avatar: const Icon(Icons.check_circle_outline),
// label: Text(
// maxLines: 1, achievements[index].toTitleCase()),
// onPressed: () {
// // remove achievements
// },
// ));
// },
// );
// }
// return Column(
// children: [
// Padding(
// padding: const EdgeInsets.only(bottom: 10),
// child: SizedBox(height: 40, child: content)),
// ],
// );
// } else {
// return Padding(
// padding: EdgeInsets.all(15),
// child: CircularProgressIndicator());
// }
// });
}
}

View File

@ -14,15 +14,23 @@ class SessionViewMedia extends StatefulWidget {
}
class _SessionViewMediaState extends State<SessionViewMedia> {
// late final Session session;
void resetState() {
setState(() {});
}
// @override
// initState() async {
// super.initState();
// }
@override
Widget build(BuildContext context) {
return StreamBuilder<List<MediaItem>>(
stream: MediaItemsDao(Provider.of<AppDatabase>(context))
.fromSession(widget.session.id).asStream(),
return FutureBuilder<List<MediaItem>>(
future: MediaItemsDao(Provider.of<AppDatabase>(context))
.fromSession(widget.session.id),
builder: (context, snapshot) {
if (snapshot.hasData) {
final mediaItems = snapshot.data!;