NovySoft/novyNaplo

View on GitHub
lib/ui/widgets/Drawer.dart

Summary

Maintainability
Test Coverage
import 'package:animations/animations.dart';
import 'package:dynamic_theme/dynamic_theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:novynaplo/data/database/databaseHelper.dart';
import 'package:novynaplo/data/models/student.dart';
import 'package:novynaplo/helpers/misc/capitalize.dart';
import 'package:novynaplo/i18n/translationProvider.dart';
import 'package:novynaplo/ui/screens/calculator/calculator_tab.dart';
import 'package:novynaplo/ui/screens/events_tab.dart';
import 'package:novynaplo/ui/screens/exams_tab.dart';
import 'package:novynaplo/ui/screens/homework_tab.dart';
import 'package:novynaplo/ui/screens/loading_screen.dart';
import 'package:novynaplo/ui/screens/marks_tab.dart';
import 'package:novynaplo/ui/screens/notices_tab.dart';
import 'package:novynaplo/ui/screens/reports_tab.dart';
import 'package:novynaplo/ui/screens/settings/settings_tab.dart';
import 'package:novynaplo/ui/screens/settings/user/userManager_settings.dart'
    show UserManager, isReloadRequired;
import 'package:novynaplo/ui/screens/statistics_tab.dart';
import 'package:novynaplo/ui/screens/timetable_tab.dart';
import 'package:novynaplo/config.dart' as config;
import 'package:novynaplo/global.dart' as globals;

String userDropdownValue = "";

class DropDownMaps {
  String name;
  Color color;
  DropDownMaps(this.name, this.color);
}

class CustomDrawer extends StatefulWidget {
  const CustomDrawer(
    this.screen,
  );
  final String screen;

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

class _CustomDrawerState extends State<CustomDrawer> {
  List<DropDownMaps> dropdownItems = [];
  bool isEdited = false;

  void updateUserList(bool outsideCall) {
    isEdited = outsideCall;
    List<Student> tempList = List.from(globals.allUsers);
    userDropdownValue =
        globals.currentUser.nickname ?? globals.currentUser.name;
    tempList.sort(
      (a, b) => a.institution.userPosition.compareTo(
        b.institution.userPosition,
      ),
    );
    dropdownItems = tempList
        .map((user) => new DropDownMaps(user.nickname ?? user.name, user.color))
        .toList();
    if (outsideCall) {
      setState(() {
        isEdited = isEdited;
        dropdownItems = dropdownItems;
        userDropdownValue = userDropdownValue;
      });
    }
  }

  @override
  void initState() {
    updateUserList(false);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Drawer(
      elevation: globals.darker ? 0 : 16,
      child: Container(
        color: globals.darker
            ? Colors.black
            : DynamicTheme.of(context).themeMode == ThemeMode.light
                ? Colors.white
                : Color.fromARGB(100, 48, 48, 48),
        child: CustomScrollView(
          slivers: <Widget>[
            SliverAppBar(
              stretch: true,
              title: new Container(),
              leading: new Container(),
              backgroundColor: globals.darker ? Color(0xFF212121) : Colors.grey,
              expandedHeight: 120.0,
              flexibleSpace: FlexibleSpaceBar(
                background: Image.asset(
                  config.menuLogo,
                  fit: BoxFit.contain,
                ),
              ),
            ),
            SliverList(
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  switch (index) {
                    case 0:
                      return Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: [
                          SizedBox(
                            height: 10,
                          ),
                          Row(
                            children: [
                              SizedBox(
                                width: 10,
                              ),
                              Expanded(
                                child: DropdownButton<String>(
                                  isExpanded: true,
                                  value: userDropdownValue,
                                  icon: const Icon(Icons.arrow_downward),
                                  underline: Container(
                                      height: 0, color: Colors.transparent),
                                  iconSize: 17,
                                  style: TextStyle(
                                    fontSize: 15,
                                    color: Theme.of(context).iconTheme.color,
                                  ),
                                  onChanged: (String newValue) async {
                                    if (newValue == "manageUsers" ||
                                        newValue == userDropdownValue) return;
                                    setState(() {
                                      userDropdownValue = newValue;
                                    });
                                    await DatabaseHelper.setCurrentUser(
                                      globals.allUsers
                                          .firstWhere(
                                            (element) =>
                                                element.nickname == newValue ||
                                                element.name == newValue,
                                          )
                                          .userId,
                                    );
                                    globals.isDataLoaded = false;
                                    globals.isNavigatorLoaded = false;
                                    globals.continueSession = widget.screen;
                                    await Navigator.pushReplacement(
                                      context,
                                      MaterialPageRoute(
                                        builder: (context) => LoadingPage(
                                          isFirstLoad: false,
                                        ),
                                      ),
                                    );
                                  },
                                  items: dropdownItems
                                          .map<DropdownMenuItem<String>>(
                                              (DropDownMaps input) {
                                        return DropdownMenuItem<String>(
                                          value: input.name,
                                          child: Text(
                                            input.name,
                                            style: TextStyle(
                                              color: (globals
                                                          .appBarColoredByUser ||
                                                      globals
                                                          .appBarTextColoredByUser)
                                                  ? input.color
                                                  : null,
                                            ),
                                          ),
                                        );
                                      }).toList() +
                                      [
                                        DropdownMenuItem<String>(
                                          value: "manageUsers",
                                          child: OpenContainer(
                                            onClosed: (_) {
                                              if (isEdited) {
                                                Navigator.of(context).pop();
                                                isEdited = false;
                                              }
                                              if (isReloadRequired) {
                                                Navigator.pushReplacement(
                                                  context,
                                                  MaterialPageRoute(
                                                    builder: (context) =>
                                                        LoadingPage(
                                                      isFirstLoad: false,
                                                    ),
                                                  ),
                                                );
                                              }
                                            },
                                            closedColor:
                                                Theme.of(context).canvasColor,
                                            openColor:
                                                Theme.of(context).canvasColor,
                                            closedElevation: 0,
                                            openElevation: 0,
                                            transitionDuration: Duration(
                                              milliseconds: 450,
                                            ),
                                            closedBuilder: (
                                              BuildContext context,
                                              VoidCallback openContainer,
                                            ) =>
                                                Row(
                                              children: [
                                                Icon(Feather.users),
                                                SizedBox(width: 10),
                                                Text(
                                                  getTranslatedString(
                                                      "manageUsers"),
                                                  style: TextStyle(
                                                    fontSize: 15,
                                                    color: Theme.of(context)
                                                        .iconTheme
                                                        .color,
                                                  ),
                                                ),
                                              ],
                                            ),
                                            openBuilder: (BuildContext context,
                                                    VoidCallback
                                                        openContainer) =>
                                                UserManager(
                                              setStateCallback: updateUserList,
                                            ),
                                          ),
                                        )
                                      ],
                                ),
                              ),
                            ],
                          ),
                          Container(
                            width: double.infinity,
                            height: 1,
                            color: globals.darker
                                ? Color(0xFF212121)
                                : Colors.grey,
                          ),
                          SizedBox(
                            height: 10,
                          ),
                        ],
                      );
                      break;
                    case 1:
                      return ListTile(
                        title: Text(capitalize(getTranslatedString("marks"))),
                        leading: Icon(Icons.create),
                        onTap: () {
                          if (widget.screen == MarksTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, MarksTab.tag);
                          }
                        },
                      );
                      break;
                    case 2:
                      return ListTile(
                        title: Text(capitalize(getTranslatedString("reports"))),
                        leading: Icon(MdiIcons.fileChart),
                        onTap: () {
                          if (widget.screen == ReportsTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, ReportsTab.tag);
                          }
                        },
                      );
                      break;
                    case 3:
                      return ListTile(
                        title:
                            Text(capitalize(getTranslatedString("timetable"))),
                        leading: Icon(Icons.today),
                        onTap: () {
                          if (widget.screen == TimetableTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, TimetableTab.tag);
                          }
                        },
                      );
                      break;
                    case 4:
                      return ListTile(
                        title: Text(capitalize(getTranslatedString("exams"))),
                        leading: Icon(MdiIcons.clipboardText),
                        onTap: () {
                          if (widget.screen == ExamsTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, ExamsTab.tag);
                          }
                        },
                      );
                      break;
                    case 5:
                      return ListTile(
                        title: Text(capitalize(getTranslatedString("hw"))),
                        leading: Icon(MdiIcons.bagPersonalOutline),
                        onTap: () {
                          if (widget.screen == HomeworkTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, HomeworkTab.tag);
                          }
                        },
                      );
                      break;
                    case 6:
                      return ListTile(
                        title: Text(capitalize(getTranslatedString("notices"))),
                        leading: Icon(Icons.layers),
                        onTap: () {
                          if (widget.screen == NoticesTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, NoticesTab.tag);
                          }
                        },
                      );
                      break;
                    case 7:
                      return ListTile(
                        title: Text(capitalize(getTranslatedString("events"))),
                        leading: Icon(MdiIcons.pin),
                        onTap: () {
                          if (widget.screen == EventsTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, EventsTab.tag);
                          }
                        },
                      );
                      break;
                    case 8:
                      return ListTile(
                        title:
                            Text(capitalize(getTranslatedString("statistics"))),
                        leading: Icon(MdiIcons.chartScatterPlotHexbin),
                        onTap: () {
                          if (widget.screen == StatisticsTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, StatisticsTab.tag);
                          }
                        },
                      );
                      break;
                    case 9:
                      return ListTile(
                        title:
                            Text(capitalize(getTranslatedString("markCalc"))),
                        leading: new Icon(MdiIcons.calculator),
                        onTap: () {
                          if (widget.screen == CalculatorTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, CalculatorTab.tag);
                          }
                        },
                      );
                      break;
                    case 10:
                      return ListTile(
                        title:
                            Text(capitalize(getTranslatedString("settings"))),
                        leading: Icon(Icons.settings_applications),
                        onTap: () {
                          if (widget.screen == SettingsTab.tag) {
                            Navigator.pop(context);
                          } else {
                            Navigator.pushNamed(context, SettingsTab.tag);
                          }
                        },
                      );
                      break;
                    default:
                      return SizedBox(
                        height: 200,
                      );
                  }
                },
                childCount: 12,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

//TODO Add option to remove items from drawer or reorder cards