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? data; @override State 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 { final GlobalKey _formKey = GlobalKey(); final Map sessionCreateController = { 'name': TextEditingController(), 'content': TextEditingController(), 'status': TextEditingController(), 'date': TextEditingController(), 'address': TextEditingController(), 'media': TextEditingController(), }; final SessionPayload sessionPayload = SessionPayload(); Future createSession(context) async { Map payload = { Symbol('title'): Value(sessionCreateController['name']!.text), Symbol('content'): Value(sessionCreateController['content']!.text), Symbol('status'): Value(SessionStatus.pending), Symbol('date'): Value( DateTime.parse(sessionCreateController['date']!.text)), }; // optional params if (sessionCreateController['address']!.text.isNotEmpty) { payload[Symbol('address')] = Value(sessionCreateController['address']!.text); } return await SessionsDao(Provider.of(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(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(context, listen: false)).createOrUpdate(omi); }); } } @override Widget build(BuildContext context) { sessionCreateController['date']!.text = DateFormat('yyyy-MM-dd').format(DateTime.now()); AppDatabase db = Provider.of(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: [ 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 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'))) ]), ], ))); } }