modified db for local images, added file list saving functionality

This commit is contained in:
Joshua Burman
2025-01-01 23:42:46 -05:00
parent e36d2a837a
commit e78788d67a
17 changed files with 4478 additions and 87 deletions

View File

@ -24,9 +24,9 @@ class SessionCardFull extends StatefulWidget {
}
class _SessionCardFullState extends State<SessionCardFull> {
late final List<MediaItem> mediaItems;
late final MediaItem? sessionImage;
late final Session session;
// late final List<MediaItem> mediaItems;
// late final MediaItem? sessionImage;
// late final Session session;
String sessionTitle(Session session) {
String title = session.title.toTitleCase();
@ -36,17 +36,22 @@ class _SessionCardFullState extends State<SessionCardFull> {
return title;
}
@override
initState() {
super.initState();
session = widget.session;
mediaItems = widget.mediaItems;
sessionImage = mediaItems
.firstWhereOrNull((mediaItem) => mediaItem.type == MediaType.location);
}
// @override
// initState() {
// super.initState();
// session = widget.session;
// mediaItems = widget.mediaItems;
// sessionImage = mediaItems
// .firstWhereOrNull((mediaItem) => mediaItem.type == MediaType.location);
// }
@override
Widget build(BuildContext context) {
final Session session = widget.session;
final List<MediaItem> mediaItems = widget.mediaItems;
final MediaItem? sessionImage = mediaItems
.firstWhereOrNull((mediaItem) => mediaItem.type == MediaType.location);
return Card(
color: (session.status == SessionStatus.started)
? Theme.of(context).colorScheme.primaryContainer

View File

@ -20,20 +20,25 @@ class SessionCardSmall extends StatefulWidget {
}
class _SessionCardSmallState extends State<SessionCardSmall> {
late final List<MediaItem> mediaItems;
late final MediaItem? sessionImage;
late final Session session;
// late final List<MediaItem> mediaItems;
// late final MediaItem? sessionImage;
// late final Session session;
@override
initState() {
super.initState();
session = widget.session;
mediaItems = widget.mediaItems;
sessionImage = mediaItems.firstWhereOrNull((mediaItem) => mediaItem.type == MediaType.location);
}
// @override
// initState() {
// super.initState();
// session = widget.session;
// mediaItems = widget.mediaItems;
// sessionImage = mediaItems.firstWhereOrNull((mediaItem) => mediaItem.type == MediaType.location);
// }
@override
Widget build(BuildContext context) {
final Session session = widget.session;
final List<MediaItem> mediaItems = widget.mediaItems;
final MediaItem? sessionImage = mediaItems
.firstWhereOrNull((mediaItem) => mediaItem.type == MediaType.location);
return Card(
color: (session.status == SessionStatus.started)
? Theme.of(context).colorScheme.primaryContainer

View File

@ -1,6 +1,9 @@
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:provider/provider.dart';
@ -28,6 +31,7 @@ class SessionEditor extends StatefulWidget {
class SessionPayload {
String? photoUri;
String? address;
List<PlatformFile>? files;
}
class _SessionEditorState extends State<SessionEditor> {
@ -95,32 +99,43 @@ class _SessionEditorState extends State<SessionEditor> {
.createOrUpdate(Function.apply(SessionsCompanion.new, [], payload));
}
Future createSessionMedia(context, sessionId) async {
Future deleteSessionMedia(int sessionId, MediaType mediaType) async {
List<MediaItem> deletedMedia =
await MediaItemsDao(db).fromSession(sessionId)
..where((mediaItem) => mediaItem.type == MediaType.location);
(await MediaItemsDao(db).fromSession(sessionId))
.where((mediaItem) => mediaItem.type == mediaType)
.toList();
await MediaItemsDao(db).removeAll(deletedMedia.map((m) => m.id));
if (sessionPayload.photoUri != null) {
MediaItemsCompanion mediaItem = MediaItemsCompanion(
title: Value('Location Image'),
description: Value(sessionPayload.address!),
reference: Value(sessionPayload.photoUri!),
type: Value(MediaType.location));
return await MediaItemsDao(db).createOrUpdate(mediaItem).then((id) async {
ObjectMediaItemsCompanion omi = ObjectMediaItemsCompanion(
objectId: Value(sessionId),
objectType: Value(ObjectType.sessions),
mediaId: Value(id),
);
await ObjectMediaItemsDao(db).createOrUpdate(omi);
});
for (int i = 0; i < deletedMedia.length; i++) {
await MediaItemsDao(db).remove(deletedMedia[i]);
}
}
Future createSessionMedia(
title,
sessionId,
description,
reference,
mediaType,
) async {
// if (sessionPayload.photoUri != null) {
MediaItemsCompanion mediaItem = MediaItemsCompanion(
title: Value(title),
description: Value(description),
reference: Value(reference.toString()),
type: Value(mediaType));
return await MediaItemsDao(db).createOrUpdate(mediaItem).then((id) async {
ObjectMediaItemsCompanion omi = ObjectMediaItemsCompanion(
objectId: Value(sessionId),
objectType: Value(ObjectType.sessions),
mediaId: Value(id),
);
await ObjectMediaItemsDao(db).createOrUpdate(omi);
});
// }
}
@override
Widget build(BuildContext context) {
sessionCreateController['date']!.text =
@ -164,33 +179,35 @@ class _SessionEditorState extends State<SessionEditor> {
}
});
}),
// Padding(
// padding: EdgeInsets.only(top: 10, bottom: 10),
// child: TextFormField(
// readOnly: true,
// decoration: InputDecoration(
// prefixIcon: Icon(Icons.image_rounded),
// filled: true,
// border: OutlineInputBorder(
// borderSide: BorderSide.none,
// borderRadius: BorderRadius.circular(12),
// ),
// labelText: 'Select Media (optional)',
// ),
// controller: sessionCreateController['media'],
// onTap: () async {
// FilePickerResult? result = await FilePicker.platform
// .pickFiles(allowMultiple: true);
// if (result != null) {
// List<File> files = result.paths
// .map((path) => File(path!))
// .toList();
// }
// })),
FormSearchInput(
sessionController: sessionCreateController['address']!,
optionalPayload: sessionPayload),
Padding(
padding: EdgeInsets.only(top: 10, bottom: 10),
child: TextFormField(
readOnly: true,
decoration: InputDecoration(
prefixIcon: Icon(Icons.image_rounded),
filled: true,
border: OutlineInputBorder(
borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(12),
),
labelText: 'Select Media (optional)',
),
controller: sessionCreateController['media'],
onTap: () async {
FilePickerResult? result = await FilePicker.platform
.pickFiles(
allowMultiple: true, type: FileType.media);
if (result != null) {
List<PlatformFile> files = result.files;
sessionCreateController['media']!.text =
files.map((file) => file.name).toString();
sessionPayload.files = files;
}
})),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Padding(
padding: EdgeInsets.only(top: 10),
@ -211,9 +228,33 @@ class _SessionEditorState extends State<SessionEditor> {
// if we've found a photo add it to media!
if (sessionPayload.photoUri != null) {
await deleteSessionMedia(
currentSessionId,
MediaType.location);
await createSessionMedia(
_formKey.currentContext,
currentSessionId);
'Location Image',
currentSessionId,
sessionPayload.address,
sessionPayload.photoUri,
MediaType.location);
}
// if we've selected files to save, save them
if (sessionPayload.files != null) {
for (int i = 0;
i < sessionPayload.files!.length;
i++) {
PlatformFile file =
sessionPayload.files![i];
Uint8List fileBytes =
await file.xFile.readAsBytes();
await createSessionMedia(
'Local Media',
currentSessionId,
file.name,
base64Encode(fileBytes),
MediaType.localImage);
}
}
// if session is null it's new so we show the dialog