forked from firka/student-legacy
181 lines
6.4 KiB
Dart
181 lines
6.4 KiB
Dart
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({super.key});
|
|
|
|
@override
|
|
State<HomePage> createState() => _HomePageState();
|
|
}
|
|
|
|
class _HomePageState extends State<HomePage>
|
|
with SingleTickerProviderStateMixin {
|
|
late UserProvider user;
|
|
late SettingsProvider settings;
|
|
|
|
late TabController _tabController;
|
|
late PageController _pageController;
|
|
|
|
late String greeting;
|
|
late String firstName;
|
|
|
|
late List<String> 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<UserProvider>(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 >= 12) {
|
|
greeting = "goodafternoon";
|
|
} else if (now.hour >= 4) {
|
|
greeting = "goodmorning";
|
|
} else {
|
|
greeting = "goodevening";
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
user = Provider.of<UserProvider>(context);
|
|
settings = Provider.of<SettingsProvider>(context);
|
|
|
|
List<String> 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<List<DateWidget>>(
|
|
key: ValueKey<String>(listOrder[index]),
|
|
future: getFilterWidgets(homeFilters[index],
|
|
context: context),
|
|
builder: (context, dateWidgets) => dateWidgets.data !=
|
|
null
|
|
? ImplicitlyAnimatedList<Widget>(
|
|
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<String> valueKey =
|
|
key as ValueKey<String>;
|
|
final String data = valueKey.value;
|
|
return listOrder.indexOf(data);
|
|
},
|
|
),
|
|
physics: const PageScrollPhysics()
|
|
.applyTo(const BouncingScrollPhysics()),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|