db changes, seed changes, media view work for local images, and video prep, initial achievement work

This commit is contained in:
Joshua Burman
2025-01-02 13:29:13 -05:00
parent e78788d67a
commit 48f716cdb0
15 changed files with 2286 additions and 37 deletions

View File

@ -47,7 +47,11 @@ class _SessionCardSmallState extends State<SessionCardSmall> {
// overlayColor: MaterialStateColor(Colors.deepPurple as int),
splashColor: Colors.deepPurple,
borderRadius: const BorderRadius.all(Radius.elliptical(10, 10)),
onLongPress: () => showMediaDetailWidget(context, sessionImage!),
onLongPress: () {
if (sessionImage != null) {
showMediaDetailWidget(context, sessionImage);
}
},
onTap: () =>
showGenericDialog(SessionView(session: session), context),
child: Container(

View File

@ -1,11 +1,11 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:drift/drift.dart' hide Column;
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:mime/mime.dart';
import 'package:provider/provider.dart';
import 'package:sendtrain/daos/media_items_dao.dart';
import 'package:sendtrain/daos/object_media_items_dao.dart';
@ -193,13 +193,13 @@ class _SessionEditorState extends State<SessionEditor> {
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(12),
),
labelText: 'Select Media (optional)',
labelText: 'Media (optional)',
),
controller: sessionCreateController['media'],
onTap: () async {
FilePickerResult? result = await FilePicker.platform
.pickFiles(
allowMultiple: true, type: FileType.media);
allowMultiple: true, type: FileType.image);
if (result != null) {
List<PlatformFile> files = result.files;
@ -246,14 +246,21 @@ class _SessionEditorState extends State<SessionEditor> {
i++) {
PlatformFile file =
sessionPayload.files![i];
String? type = lookupMimeType(file.path!)!.split('/').first;
Uint8List fileBytes =
await file.xFile.readAsBytes();
MediaType mediaType = MediaType.localImage;
if (type == "video") {
mediaType = MediaType.localVideo;
}
await createSessionMedia(
'Local Media',
currentSessionId,
file.name,
base64Encode(fileBytes),
MediaType.localImage);
mediaType);
}
}

View File

@ -34,28 +34,42 @@ class SessionViewAchievements extends StatelessWidget {
final sessionActivities = snapshot.data!;
final achievements = getAchievements(sessionActivities);
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: 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: () {},
));
},
))),
child: SizedBox(height: 40, child: content)),
],
);
} else {

View File

@ -4,22 +4,31 @@ import 'package:sendtrain/daos/media_items_dao.dart';
import 'package:sendtrain/database/database.dart';
import 'package:sendtrain/widgets/media/media_card.dart';
class SessionViewMedia extends StatelessWidget {
class SessionViewMedia extends StatefulWidget {
const SessionViewMedia({super.key, required this.session});
final Session session;
@override
State<SessionViewMedia> createState() => _SessionViewMediaState();
}
class _SessionViewMediaState extends State<SessionViewMedia> {
void resetState() {
setState(() {});
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<MediaItem>>(
future: MediaItemsDao(Provider.of<AppDatabase>(context))
.fromSession(session.id),
return StreamBuilder<List<MediaItem>>(
stream: MediaItemsDao(Provider.of<AppDatabase>(context))
.fromSession(widget.session.id).asStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
final mediaItems = snapshot.data!;
List<Widget> mediaCards = List.generate(
mediaItems.length, (i) => MediaCard(media: mediaItems[i]));
mediaItems.length, (i) => MediaCard(media: mediaItems[i], callback: resetState));
return Column(
children: [