location image search and population for new session

This commit is contained in:
Joshua Burman
2024-12-30 01:54:51 -05:00
parent afe633e697
commit 5f628d6b48
11 changed files with 337 additions and 168 deletions

View File

@ -24,9 +24,9 @@ class _SessionCardState extends State<SessionCard> {
initializeDateFormatting('en');
return FutureBuilder<List<MediaItem>>(
future: MediaItemsDao(Provider.of<AppDatabase>(context))
.fromSession(session),
return StreamBuilder<List<MediaItem>>(
stream: MediaItemsDao(Provider.of<AppDatabase>(context))
.watchSessionMediaItems(session.id),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<MediaItem> mediaItems = snapshot.data!;

View File

@ -1,9 +1,12 @@
import 'dart:async';
import 'dart:math';
import 'package:drift/drift.dart' hide Column;
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:sendtrain/daos/media_items_dao.dart';
import 'package:sendtrain/daos/object_media_items_dao.dart';
import 'package:sendtrain/daos/sessions_dao.dart';
import 'package:sendtrain/database/database.dart';
import 'package:sendtrain/widgets/builders/dialogs.dart';
@ -21,6 +24,12 @@ class SessionCreator extends StatefulWidget {
State<SessionCreator> createState() => _SessionCreatorState();
}
// used to pass the result of the found image back to current context...
class SessionPayload {
String? photoUri;
String? address;
}
class _SessionCreatorState extends State<SessionCreator> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -33,14 +42,48 @@ class _SessionCreatorState extends State<SessionCreator> {
'media': TextEditingController(),
};
Future createSession(context) {
return SessionsDao(Provider.of<AppDatabase>(context, listen: false))
.createOrUpdate(SessionsCompanion(
title: Value(sessionCreateController['name']!.text),
content: Value(sessionCreateController['content']!.text),
status: Value(SessionStatus.pending),
date: Value(DateTime.parse(sessionCreateController['date']!.text)),
address: Value(sessionCreateController['address']!.text)));
final SessionPayload sessionPayload = SessionPayload();
Future createSession(context) async {
Map<Symbol, Value> payload = {
Symbol('title'): Value<String>(sessionCreateController['name']!.text),
Symbol('content'):
Value<String>(sessionCreateController['content']!.text),
Symbol('status'): Value<SessionStatus>(SessionStatus.pending),
Symbol('date'): Value<DateTime>(
DateTime.parse(sessionCreateController['date']!.text)),
};
// optional params
if (sessionCreateController['address']!.text.isNotEmpty) {
payload[Symbol('address')] =
Value<String>(sessionCreateController['address']!.text);
}
return await SessionsDao(Provider.of<AppDatabase>(context, listen: false))
.createOrUpdate(Function.apply(SessionsCompanion.new, [], payload));
}
Future createSessionMedia(context, sessionId) async {
if (sessionPayload.photoUri != null) {
MediaItemsCompanion mediaItem = MediaItemsCompanion(
title: Value('Location Image'),
description: Value(sessionPayload.address!),
reference: Value(sessionPayload.photoUri!),
type: Value(MediaType.image));
return await MediaItemsDao(
Provider.of<AppDatabase>(context, listen: false))
.createOrUpdate(mediaItem).then((id) async {
ObjectMediaItemsCompanion omi = ObjectMediaItemsCompanion(
objectId: Value(sessionId),
objectType: Value(ObjectType.sessions),
mediaId: Value(id),
);
await ObjectMediaItemsDao(Provider.of<AppDatabase>(context, listen: false)).createOrUpdate(omi);
});
}
}
@override
@ -113,19 +156,23 @@ class _SessionCreatorState extends State<SessionCreator> {
// }
// })),
FormSearchInput(
sessionController: sessionCreateController['address']!),
sessionController: sessionCreateController['address']!,
optionalPayload: sessionPayload),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Padding(
padding: EdgeInsets.only(top: 10),
child: FilledButton(
onPressed: () => {
onPressed: () async => {
if (_formKey.currentState!.validate())
{
createSession(_formKey.currentContext)
.then((id) => {
await createSession(_formKey.currentContext)
.then((id) async => {
await createSessionMedia(
_formKey.currentContext, id),
SessionsDao(db).find(id).then(
(session) => showGenericDialog(
SessionView(session: session),
SessionView(
session: session),
_formKey
.currentContext!)),
Navigator.pop(