migration to move achievements to session, prep for achievement and media management
This commit is contained in:
18
lib/widgets/achievements/achievement_editor.dart
Normal file
18
lib/widgets/achievements/achievement_editor.dart
Normal 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');
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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));
|
||||
},
|
||||
),
|
||||
]),
|
||||
|
@ -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());
|
||||
// }
|
||||
// });
|
||||
}
|
||||
}
|
||||
|
@ -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!;
|
||||
|
Reference in New Issue
Block a user