modified db for local images, added file list saving functionality
This commit is contained in:
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user