Skip to content
Snippets Groups Projects
viewevents.dart 8.57 KiB
import 'dart:io';
import 'package:flutter/material.dart';
import 'datamodel.dart';
import 'sensorconnector.dart';
import 'databaseconnector.dart';

class ViewEvents extends StatefulWidget {
  const ViewEvents({Key? key}) : super(key: key);

  @override
  _ViewEvents createState() => _ViewEvents();
}

class _ViewEvents extends State<ViewEvents> {
  // Get singleton to access locally stored events:
  final EventStoreInstance _events = EventStoreInstance();
  String _syncStatus = '';
  var database = DatabaseInstance();
  List<Event> localEvents = [];


  Future<void> fetchEventsFromDb() async{
    localEvents = await database.getEvents();
    int pendingEventCnt = await database.getPendingEventCnt();

    _syncStatus = pendingEventCnt.toString() + ' event(s) pending';
    setState(() {});  //Got events from database, so update UI
  }

  @override
  void initState() {
    _syncStatus = '';
    super.initState();
    fetchEventsFromDb();
  }

  Future<void> syncEvents() async {
    final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
    SensorConnector connection = SensorConnector();

    List<Event> events = await database.getPendingEvents();
    int syncCounter = events.length;
    debugPrint('Pending Events');
    for (var event in events){
      debugPrint(event.toString());
    }

    if(syncCounter > 0) {
      try {
        String? token = await connection.getAuthToken(
            configuration.loginInformation.mail,
            configuration.loginInformation.password);
        var index = 0;
        for (var event in events) {
          debugPrint('Idx: ' + index.toString() + ' ' +
              event.toSensorJson().toString());
          index++;
          if (await connection.putEvent(event, token) == true) {
            //Event has been posted to Sensor.
            syncCounter--;
            debugPrint(
                'put success, remaining events: ' + syncCounter.toString());
            event.status = 'EXPORTED'; //Update event to export only once
            database.updateEvent(event); //Update Event as exported in SQL Database
            fetchEventsFromDb(); //update view list   //TODO: this is bad for the sync performance!
            setState(() {});
          } else {
            throw Exception('Sync for ' + event.urn + 'failed');
          }
        }