Skip to content
Snippets Groups Projects
configuration.dart 8.13 KiB
Newer Older
Maximilian Betz's avatar
Maximilian Betz committed
import 'dart:convert';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
Maximilian Betz's avatar
Maximilian Betz committed
import 'package:flutter/services.dart';
import 'sensorconnector.dart';
class Configuration extends StatefulWidget {
Maximilian Betz's avatar
Maximilian Betz committed
  const Configuration({Key? key}) : super(key: key);

  @override
  State<Configuration> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<Configuration> {
  late Future<Collection> futureCollection;
  late Future<List<Collection>> futureCollections;
  late Future<List<EventType>> futureEventTypes;
  late Future<List<Device>> futureDevices;
  late Future<String> futureAuthToken;

  SensorConnector connector = SensorConnector();
  final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();

  @override
  void initState() {
    super.initState();

    //Start fetching all possible sensor data as soon as possible:
    futureCollections = connector.fetchCollections();
    futureEventTypes = connector.fetchEventTypes();
    if (configuration.currentCollection.id != -1) {
      futureDevices = connector.fetchCollectionDevices(configuration.currentCollection.id);
    }
    futureAuthToken = connector.getAuthToken(configuration.loginInformation.mail, configuration.loginInformation.password);
  late Future<String> eventTypes;

  @override
  Widget build(BuildContext context) {

    final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
    final EventStoreInstance events = EventStoreInstance();
    return Scaffold(
      appBar: AppBar(
Maximilian Betz's avatar
Maximilian Betz committed
        title: const Text('Configuration'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
Maximilian Betz's avatar
Maximilian Betz committed
            const Text(
                'You must be online to do something here!',
                style: TextStyle(fontSize: 14)
Maximilian Betz's avatar
Maximilian Betz committed
            ),
            const SizedBox(height: 50),
            TextFormField(
              keyboardType: TextInputType.emailAddress,
              autofocus: false,
              initialValue: configuration.loginInformation.mail,
              decoration: const InputDecoration(
                labelText: 'Sensor E-Mail',
                hintText: 'User for writing events',
              ),
              onChanged: (value) {
                configuration.loginInformation.mail = value;
              },
              onFieldSubmitted: (value) {
                futureAuthToken = connector.getAuthToken(configuration.loginInformation.mail, configuration.loginInformation.password);
              },
            ),
            TextFormField(
              autofocus: false,
              initialValue: configuration.loginInformation.password,
              decoration: const InputDecoration(
                labelText: 'Sensor Password',
                hintText: 'Password for writing events',
              ),
              onChanged: (value){
                configuration.loginInformation.password = value;
              },
              onFieldSubmitted: (value) {
                futureAuthToken = connector.getAuthToken(configuration.loginInformation.mail, configuration.loginInformation.password);
              },
            ),
            const SizedBox(height: 50),
            FutureBuilder<List<Collection>>(
                future: futureCollections,
                builder: (context, snapshot){
                  if (snapshot.hasData)
                  {
                    configuration.collections = [];
Maximilian Betz's avatar
Maximilian Betz committed
                    snapshot.data?.forEach((element) {
                      configuration.collections.add(element);
Maximilian Betz's avatar
Maximilian Betz committed
                    });
Maximilian Betz's avatar
Maximilian Betz committed
                    /*Initialize active collection with first received
                    collection if not initialized yet*/
                    if(configuration.currentCollection.id == -1){
                      configuration.currentCollection = configuration.collections[0];
                      futureDevices = connector.fetchCollectionDevices(configuration.currentCollection.id);
                        value: configuration.currentCollection.collectionName,
                        decoration: const InputDecoration(
                          labelText: 'Chose Collection',
                        configuration.collections.map((Collection collection) {
                          return DropdownMenuItem(
                            value: collection.collectionName,
                            child: Text(collection.collectionName),
                          );
                        }).toList(),
                        onChanged: (value) {
                          configuration.currentCollection = configuration.getCollectionFromName(value.toString());
                          //Fetch new selected collection devices
                          futureDevices = connector.fetchCollectionDevices(configuration.currentCollection.id);
Maximilian Betz's avatar
Maximilian Betz committed
                    return const CircularProgressIndicator();
            ),
          ],
        ),
      ),
      bottomNavigationBar: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
          FloatingActionButton.extended(
            heroTag: null,
            tooltip: 'Reset all data',
            icon: const Icon(Icons.cancel),
            label: const Text('Reset all'),
            onPressed: () {
              //events.reset();  //TODO: remove before release!
              configuration.reset();  //TODO: remove before release this is not a real use case!
          FloatingActionButton.extended(
            tooltip: 'Select Collection and download corresponding devices',
            icon: const Icon(Icons.save),
            label: const Text('Store'),
Maximilian Betz's avatar
Maximilian Betz committed
              futureAuthToken.then((value){ //NOTE: Counterintuitive async callback function
                  debugPrint("Login credentials correct! Auth Token: " + value);

                futureDevices.then((value) {
                    debugPrint("Device List complete");
                    configuration.devices = value;

                  futureEventTypes.then((value) {
                      debugPrint("Event Types List complete");
                      configuration.eventTypes = value;

                    debugPrint("EventType Json: " + jsonEncode(
                        configuration.eventTypes[0]));
                    debugPrint("Device Json: " + jsonEncode(
                        configuration.devices[0]));
                    debugPrint("Current Collection Json: " + jsonEncode(
                        configuration.currentCollection));
                    debugPrint("Sensor Login Json: " + jsonEncode(
                        configuration.loginInformation));

                    try {
                      //Update id and urn for the add event widget with some initial data
                      events.currentEvent.id = configuration.devices[0]
                          .id; //TODO: fix if devices are an empty list.
                      events.currentEvent.urn = configuration.devices[0].urn;
                      events.currentEvent.description = '';
                      events.currentEvent.label = '';
                      events.currentEvent.type = configuration.eventTypes[0]
                          .name;

                      var date = DateTime.now().toUtc();
                      var isoDate = date.toIso8601String();
                      events.currentEvent.startDate = isoDate;
                      events.currentEvent.endDate = isoDate;
                      configuration.initialized = true;

                      HapticFeedback.vibrate();
                      //TODO: display success user feedback
                    } catch (e) {
                      throw Exception('Something went wrong try again');
                    }
                  });
Maximilian Betz's avatar
Maximilian Betz committed
              //TODO: display failed as user feedback somehow