NovySoft/novyNaplo

View on GitHub
lib/ui/screens/homework_tab.dart

Summary

Maintainability
Test Coverage
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/foundation.dart' show defaultTargetPlatform;
import 'package:flutter/material.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:novynaplo/data/models/homework.dart';
import 'package:novynaplo/data/models/extensions.dart';
import 'package:novynaplo/helpers/misc/capitalize.dart';
import 'package:novynaplo/helpers/misc/parseIntToWeekdayString.dart';
import 'package:novynaplo/helpers/ui/cardColor/homeworkCard.dart';
import 'package:novynaplo/ui/screens/homework_detail_tab.dart';
import 'package:novynaplo/global.dart' as globals;
import 'package:novynaplo/i18n/translationProvider.dart';
import 'package:novynaplo/ui/widgets/AnimatedHomeworkCard.dart';
import 'package:novynaplo/ui/widgets/Drawer.dart';
import 'package:novynaplo/helpers/ui/textColor/drawerText.dart';

//TODO: should also make a checkbox to save homework as done
List<Homework> globalHomework = [];

class HomeworkTab extends StatefulWidget {
  static String tag = 'homework';
  static String title = capitalize(getTranslatedString("hw"));

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

class _HomeworkTabState extends State<HomeworkTab> {
  List<Homework> currentHomework = [];
  List<Homework> toBeDoneHomework = [];
  List<Homework> alreadyDoneHomework = [];
  bool _listOpen = false;
  bool _animationDone = true;
  final GlobalKey<AnimatedListState> _animatedListkey =
      GlobalKey<AnimatedListState>(debugLabel: "homeworkAnimList");
  final _scrollController =
      new ScrollController(debugLabel: "homeworkScrollList");
  final _dataKey = new GlobalKey(debugLabel: "homeworkDropdownLabel");
  double _closedOfset = 0;

  @override
  void initState() {
    currentHomework = List.from(globalHomework);
    //Hide if it isn't needed
    currentHomework.removeWhere((element) {
      DateTime afterDue = element.dueDate;
      if (globals.howLongKeepDataForHw != -1) {
        afterDue =
            afterDue.add(Duration(days: globals.howLongKeepDataForHw.toInt()));
        return (afterDue.compareTo(DateTime.now()) < 0);
      } else {
        return false;
      }
    });
    //Parse into seperate lists
    int lastNotDone = currentHomework.lastIndexWhere((element) {
      return element.dueDate.isAfter(DateTime.now());
    });
    toBeDoneHomework = currentHomework.sublist(0, lastNotDone + 1);
    alreadyDoneHomework = currentHomework.sublist(lastNotDone + 1);
    alreadyDoneHomework.sort((a, b) => a.dueDate.compareTo(b.dueDate));
    FirebaseCrashlytics.instance.log("Shown Homeworks");
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(HomeworkTab.title),
        backgroundColor:
            globals.appBarColoredByUser ? globals.currentUser.color : null,
        foregroundColor: getDrawerForeground(),
      ),
      drawerScrimColor:
          globals.darker ? Colors.black.withOpacity(0) : Colors.black54,
      drawer: CustomDrawer(HomeworkTab.tag),
      body: _body(),
    );
  }

  void _handleListOpen() async {
    if (!_animationDone) return;
    ScrollableState scrollableState = Scrollable.of(_dataKey.currentContext);
    ScrollPosition position = scrollableState.position;
    //FIXME: Add small icon, if there is nothing done
    if (_listOpen) {
      _scrollController.animateTo(
        _closedOfset,
        duration: Duration(milliseconds: 500),
        curve: Curves.ease,
      );
      for (int i = alreadyDoneHomework.length - 1; i >= 0; i--) {
        _animatedListkey.currentState.removeItem(i, (context, animation) {
          return ScaleTransition(
            scale: CurvedAnimation(
              parent: animation,
              curve: Curves.ease,
            ),
            child: buildHomeworkCard(
              dueOver: true,
              homework: alreadyDoneHomework[i],
              index: i,
            ),
          );
        });
      }
    } else {
      _closedOfset = position.pixels;
      for (var i = 0; i < alreadyDoneHomework.length; i++) {
        _animatedListkey.currentState.insertItem(i);
      }
    }
    setState(() {
      _listOpen = !_listOpen;
      _animationDone = true;
    });
  }

  Widget _body() {
    if (currentHomework.length == 0) {
      return noHomework();
    } else {
      Widget homeworkToDo;
      if (toBeDoneHomework.length == 0) {
        homeworkToDo = SizedBox(
          height: MediaQuery.of(context).size.height / 4,
          child: allDone(),
        );
      } else {
        homeworkToDo = ListView.builder(
          shrinkWrap: true,
          physics: NeverScrollableScrollPhysics(),
          itemCount: toBeDoneHomework.length,
          itemBuilder: (context, index) {
            return buildHomeworkCard(
              dueOver: false,
              homework: toBeDoneHomework[index],
              index: index,
            );
          },
        );
      }

      return SingleChildScrollView(
        controller: _scrollController,
        child: Column(
          mainAxisSize: MainAxisSize.max,
          crossAxisAlignment: defaultTargetPlatform == TargetPlatform.iOS
              ? CrossAxisAlignment.center
              : CrossAxisAlignment.start,
          children: [
            homeworkToDo,
            alreadyDoneHomework.length == 0
                ? SizedBox()
                : Container(
                    key: _dataKey,
                    child: GestureDetector(
                      onTap: () {
                        _handleListOpen();
                      },
                      child: Padding(
                        padding: EdgeInsets.only(left: 15.0),
                        child: Wrap(
                          crossAxisAlignment: WrapCrossAlignment.center,
                          children: [
                            Text(
                              "${getTranslatedString('doneHw')}:",
                              textAlign:
                                  defaultTargetPlatform == TargetPlatform.iOS
                                      ? TextAlign.center
                                      : TextAlign.left,
                              style: TextStyle(
                                fontWeight: FontWeight.bold,
                                fontSize: 21,
                              ),
                            ),
                            AnimatedCrossFade(
                              duration: const Duration(milliseconds: 150),
                              firstChild: const Icon(
                                Icons.keyboard_arrow_up,
                                size: 30,
                              ),
                              secondChild: const Icon(
                                Icons.keyboard_arrow_down,
                                size: 30,
                              ),
                              crossFadeState: _listOpen
                                  ? CrossFadeState.showFirst
                                  : CrossFadeState.showSecond,
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),
            alreadyDoneHomework.length == 0
                ? Center(child: allDone(isDone: false))
                : AnimatedList(
                    shrinkWrap: true,
                    physics: NeverScrollableScrollPhysics(),
                    key: _animatedListkey,
                    itemBuilder: (context, index, animation) {
                      return ScaleTransition(
                        scale: CurvedAnimation(
                          parent: animation,
                          curve: Curves.ease,
                        ),
                        child: buildHomeworkCard(
                          dueOver: true,
                          homework: alreadyDoneHomework[index],
                          index: index,
                        ),
                      );
                    },
                  )
          ],
        ),
      );
    }
  }

  Widget buildHomeworkCard({
    @required Homework homework,
    @required int index,
    @required bool dueOver,
  }) {
    String subTitle = "${getTranslatedString("due")}: " +
        homework.dueDate.toDayOnlyString() +
        " " +
        parseIntToWeekdayString(homework.dueDate.weekday);
    Color color = getHomeworkCardColor(
      hw: homework,
      index: index,
    );
    return SafeArea(
      child: AnimatedHomeworkCard(
        homework: homework,
        dueOver: dueOver,
        title: homework.subject.name,
        subTitle: subTitle,
        color: color,
        heroAnimation: AlwaysStoppedAnimation(0),
        onPressed: HomeworkDetailTab(
          color: color,
          hwInfo: homework,
        ),
      ),
    );
  }

  Widget noHomework() {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Icon(
            MdiIcons.emoticonHappyOutline,
            size: 50,
          ),
          Text(
            getTranslatedString("noHw"),
            textAlign: TextAlign.center,
          )
        ],
      ),
    );
  }

  Widget allDone({bool isDone = true}) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          SizedBox(
            height: 100,
            width: 100,
            child: Stack(
              alignment: AlignmentDirectional.center,
              children: [
                Icon(
                  MdiIcons.bagPersonalOutline,
                  size: 50,
                ),
                new Positioned(
                  left: 50,
                  top: 65,
                  child: new Icon(
                    isDone ? Icons.check : Icons.cancel_outlined,
                    size: 36.0,
                  ),
                ),
              ],
            ),
          ),
          SizedBox(
            height: 5,
          ),
          Text(
            isDone
                ? getTranslatedString("allDone")
                : getTranslatedString("noDone"),
            textAlign: TextAlign.center,
          ),
        ],
      ),
    );
  }
}