SendTrain/lib/widgets/sessions/session_creator.dart

190 lines
7.9 KiB
Dart

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';
import 'package:sendtrain/widgets/generic/elements/form_search_input.dart';
import 'package:sendtrain/widgets/generic/elements/form_text_input.dart';
import 'package:sendtrain/widgets/sessions/session_view.dart';
class SessionCreator extends StatefulWidget {
const SessionCreator({super.key, this.data, this.session});
final Session? session;
final Map<String, dynamic>? data;
@override
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>();
final Map<String, TextEditingController> sessionCreateController = {
'name': TextEditingController(),
'content': TextEditingController(),
'status': TextEditingController(),
'date': TextEditingController(),
'address': TextEditingController(),
'media': TextEditingController(),
};
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
Widget build(BuildContext context) {
sessionCreateController['date']!.text =
DateFormat('yyyy-MM-dd').format(DateTime.now());
AppDatabase db = Provider.of<AppDatabase>(context, listen: false);
return Padding(
padding: EdgeInsets.fromLTRB(15, 0, 15, 15),
child: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 10, bottom: 10),
child: Text('Create Session',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleLarge)),
FormTextInput(
controller: sessionCreateController['name']!,
title: 'Title'),
FormTextInput(
controller: sessionCreateController['content']!,
title: 'Description',
icon: Icon(Icons.description_rounded),
maxLines: 10),
FormTextInput(
controller: sessionCreateController['date']!,
title: 'Date',
icon: Icon(Icons.date_range_rounded),
onTap: () {
showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime.now(),
lastDate: DateTime.now().add(Duration(days: 365)))
.then((date) {
if (date != null) {
sessionCreateController['date']?.text =
DateFormat('yyyy-MM-dd').format(date);
}
});
}),
// 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),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Padding(
padding: EdgeInsets.only(top: 10),
child: FilledButton(
onPressed: () async => {
if (_formKey.currentState!.validate())
{
await createSession(_formKey.currentContext)
.then((id) async => {
await createSessionMedia(
_formKey.currentContext, id),
SessionsDao(db).find(id).then(
(session) => showGenericDialog(
SessionView(
session: session),
_formKey
.currentContext!)),
Navigator.pop(
_formKey.currentContext!,
'Submit')
})
}
},
child: Text('Submit')))
]),
],
)));
}
}