import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/models/settings.dart'; import 'package:refilc/ui/date_widget.dart'; import 'package:refilc_mobile_ui/common/filter_bar.dart'; import 'package:flutter/material.dart'; import 'package:animated_list_plus/animated_list_plus.dart'; import 'package:provider/provider.dart'; import 'package:refilc/ui/filter/widgets.dart'; import 'package:refilc/ui/filter/sort.dart'; import 'home_page.i18n.dart'; class HomePage extends StatefulWidget { const HomePage({Key? key}) : super(key: key); @override State createState() => _HomePageState(); } class _HomePageState extends State with SingleTickerProviderStateMixin { late UserProvider user; late SettingsProvider settings; late TabController _tabController; late PageController _pageController; late String greeting; late String firstName; late List listOrder; static const pageCount = 4; @override void initState() { super.initState(); _tabController = TabController(length: pageCount, vsync: this); _pageController = PageController(); listOrder = List.generate(pageCount, (index) => "$index"); user = Provider.of(context, listen: false); DateTime now = DateTime.now(); if (now.isBefore(DateTime(now.year, DateTime.august, 31)) && now.isAfter(DateTime(now.year, DateTime.june, 14))) { greeting = "goodrest"; } else if (now.month == user.student?.birth.month && now.day == user.student?.birth.day) { greeting = "happybirthday"; } else if (now.month == DateTime.december && now.day >= 24 && now.day <= 26) { greeting = "merryxmas"; } else if (now.month == DateTime.january && now.day == 1) { greeting = "happynewyear"; } else if (now.hour >= 18) { greeting = "goodevening"; } else if (now.hour >= 10) { greeting = "goodafternoon"; } else if (now.hour >= 4) { greeting = "goodmorning"; } else { greeting = "goodevening"; } } @override Widget build(BuildContext context) { user = Provider.of(context); settings = Provider.of(context); List nameParts = user.name?.split(" ") ?? ["?"]; if (!settings.presentationMode) { firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; } else { firstName = "Béla"; } return SafeArea( child: Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Greeting Padding( padding: const EdgeInsets.only( left: 32.0, top: 24.0, bottom: 12.0), child: Text( greeting.i18n.fill([firstName]), overflow: TextOverflow.fade, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 24.0, color: Theme.of(context).textTheme.bodyMedium?.color, ), ), ), Padding( padding: const EdgeInsets.only(bottom: 12.0), child: FilterBar( items: [ Tab(text: "All".i18n), Tab(text: "Grades".i18n), Tab(text: "Messages".i18n), Tab(text: "Absences".i18n), ], controller: _tabController, onTap: (i) async { int selectedPage = _pageController.page!.round(); if (i == selectedPage) return; if (_pageController.page?.roundToDouble() != _pageController.page) { _pageController.animateToPage(i, curve: Curves.easeIn, duration: kTabScrollDuration); return; } // swap current page with target page setState(() { _pageController.jumpToPage(i); String currentList = listOrder[selectedPage]; listOrder[selectedPage] = listOrder[i]; listOrder[i] = currentList; }); }, disableFading: true, ), ), // Data filters Expanded( child: PageView.custom( controller: _pageController, childrenDelegate: SliverChildBuilderDelegate( (BuildContext context, int index) { return FutureBuilder>( key: ValueKey(listOrder[index]), future: getFilterWidgets(homeFilters[index], context: context), builder: (context, dateWidgets) => dateWidgets.data != null ? ImplicitlyAnimatedList( items: sortDateWidgets(context, dateWidgets: dateWidgets.data!), itemBuilder: filterItemBuilder, spawnIsolate: false, areItemsTheSame: (a, b) => a.key == b.key, physics: const BouncingScrollPhysics( parent: AlwaysScrollableScrollPhysics()), padding: const EdgeInsets.symmetric( horizontal: 24.0), ) : Container(), ); }, childCount: 4, findChildIndexCallback: (Key key) { final ValueKey valueKey = key as ValueKey; final String data = valueKey.value; return listOrder.indexOf(data); }, ), physics: const PageScrollPhysics() .applyTo(const BouncingScrollPhysics()), ), ), ], ), ), ], ), ); } }