NovySoft/novyNaplo

View on GitHub
lib/ui/screens/login/new_login_page.dart

Summary

Maintainability
Test Coverage
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:novynaplo/API/requestHandler.dart';
import 'package:novynaplo/data/database/databaseHelper.dart';
import 'package:novynaplo/data/models/student.dart';
import 'package:novynaplo/data/models/tokenResponse.dart';
import 'package:novynaplo/helpers/notification/notificationHelper.dart';
import 'package:novynaplo/helpers/toasts/errorToast.dart';
import 'package:novynaplo/helpers/ui/getRandomColors.dart';
import 'package:novynaplo/i18n/translationProvider.dart';
import 'package:novynaplo/ui/screens/login/kreta_oauth_webview.dart';
import 'package:novynaplo/global.dart' as globals;
import 'package:novynaplo/ui/screens/marks_tab.dart' as marksTab;

class NewLoginPage extends StatefulWidget {
  static String tag = 'login-page-new';
  const NewLoginPage({Key key}) : super(key: key);

  @override
  State<NewLoginPage> createState() => _NewLoginPageState();
}

class _NewLoginPageState extends State<NewLoginPage> {
  bool isFirstUser = false;

  @override
  void initState() {
    DatabaseHelper.getAllUsers()
        .then((value) => isFirstUser = (value.length <= 0));
    super.initState();
  }

  Future<void> handleLogin(String code) async {
    print(code);
    final result = await RequestHandler.newLogin(code).timeout(
      Duration(seconds: 15),
      onTimeout: () {
        return TokenResponse(status: "TIMEOUT");
      },
    );
    print(result.status);
    if (result.status == "OK") {
      Student finalUserObject = await RequestHandler.getStudentInfo(
        result.userinfo,
        embedDetails: true,
      );
      finalUserObject.current = isFirstUser;

      List<int> allColors = myListOfRandomColors
          .map(
            (e) => e.value,
          )
          .toList();
      for (Student user in (globals.allUsers ?? [])) {
        allColors.remove(user.color.value);
      }
      if (allColors.length == 0) {
        allColors = myListOfRandomColors
            .map(
              (e) => e.value,
            )
            .toList();
      }
      finalUserObject.color =
          Color(allColors[Random().nextInt(allColors.length)]);
      await DatabaseHelper.insertUser(finalUserObject);
      await globals.prefs.setBool("isNew", false);
      await globals.prefs.setBool("isOnboradingDone", true);

      //TODO change this when multiuser support is added
      globals.allUsers = await DatabaseHelper.getAllUsers();
      // Get highest userid -> newest user
      globals.currentUser = globals.allUsers.reduce((value, element) =>
          (value.userId > element.userId) ? value : element);
      globals.isOnboradingDone = true;
      NotificationHelper.flutterLocalNotificationsPlugin
          .resolvePlatformSpecificImplementation<
              AndroidFlutterLocalNotificationsPlugin>()
          .requestPermission();

      Navigator.pushReplacementNamed(context, marksTab.MarksTab.tag);
    } else if (result.status == "TIMEOUT") {
      ErrorToast.showErrorToast(
        getTranslatedString("timeoutErr"),
      );
    } else {
      //'Handled error'
      ErrorToast.showErrorToastLong(
        context,
        result.status,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    final logo = Hero(
      tag: 'hero',
      child: CircleAvatar(
          backgroundColor: Colors.grey,
          radius: 75.0,
          child: Image.asset('assets/home.png')),
    );

    return Scaffold(
      body: Center(
        child: ListView(
          physics: NeverScrollableScrollPhysics(),
          shrinkWrap: true,
          children: <Widget>[
            logo,
            SizedBox(height: 40.0),
            SizedBox(
              height: 500,
              width: MediaQuery.of(context).size.width,
              child: KretaOuathWebView(handleLogin),
            ),
          ],
        ),
      ),
    );
  }
}