import 'dart:math'; import 'package:google_fonts/google_fonts.dart'; import 'package:refilc/api/providers/update_provider.dart'; import 'package:refilc/models/settings.dart'; import 'package:refilc/ui/date_widget.dart'; import 'package:refilc_kreta_api/providers/message_provider.dart'; import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/theme/colors/colors.dart'; import 'package:refilc_kreta_api/models/message.dart'; import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart'; import 'package:refilc_mobile_ui/common/empty.dart'; import 'package:refilc_mobile_ui/common/filter_bar.dart'; import 'package:refilc_mobile_ui/common/profile_image/profile_button.dart'; import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart'; import 'package:refilc/ui/filter/sort.dart'; // import 'package:refilc_mobile_ui/common/soon_alert/soon_alert.dart'; import 'package:refilc_mobile_ui/common/widgets/message/message_viewable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; import 'messages_page.i18n.dart'; import 'send_message/send_message.dart'; class MessagesPage extends StatefulWidget { const MessagesPage({super.key}); @override MessagesPageState createState() => MessagesPageState(); } class MessagesPageState extends State with TickerProviderStateMixin { final GlobalKey _scaffoldKey = GlobalKey(); late UserProvider user; late MessageProvider messageProvider; late UpdateProvider updateProvider; late String firstName; late TabController tabController; @override void initState() { super.initState(); tabController = TabController(length: 4, vsync: this); } @override Widget build(BuildContext context) { user = Provider.of(context); messageProvider = Provider.of(context); updateProvider = Provider.of(context); List nameParts = user.displayName?.split(" ") ?? ["?"]; firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0]; return Scaffold( key: _scaffoldKey, body: Padding( padding: const EdgeInsets.only(top: 12.0), child: NestedScrollView( physics: const BouncingScrollPhysics( parent: AlwaysScrollableScrollPhysics()), headerSliverBuilder: (context, _) => [ SliverAppBar( pinned: true, floating: false, snap: false, centerTitle: false, surfaceTintColor: Theme.of(context).scaffoldBackgroundColor, actions: [ Padding( padding: const EdgeInsets.symmetric( horizontal: 8.0, vertical: 5.0), child: IconButton( splashRadius: 24.0, onPressed: () async { // Navigator.of(context, rootNavigator: true) // .push(PageRouteBuilder( // pageBuilder: (context, animation, secondaryAnimation) => // PremiumFSTimetable( // controller: controller, // ), // )) // .then((_) { // SystemChrome.setPreferredOrientations( // [DeviceOrientation.portraitUp]); // setSystemChrome(context); // }); // SoonAlert.show(context: context); await showSendMessageSheet(context); }, icon: Icon( FeatherIcons.send, color: AppColors.of(context).text, ), ), ), // Profile Icon Padding( padding: const EdgeInsets.only(right: 24.0), child: ProfileButton( child: ProfileImage( heroTag: "profile", name: firstName, backgroundColor: Theme.of(context) .colorScheme .tertiary, //ColorUtils.stringToColor(user.displayName ?? "?"), badge: updateProvider.available, role: user.role, profilePictureString: user.picture, gradeStreak: (user.gradeStreak ?? 0) > 1, ), ), ), ], automaticallyImplyLeading: false, shadowColor: Theme.of(context).shadowColor, title: Padding( padding: const EdgeInsets.only(left: 0.0), child: Row( children: [ BackButton( style: ButtonStyle( splashFactory: NoSplash.splashFactory, padding: MaterialStateProperty.all( EdgeInsets.zero), ), ), Text( "Messages".i18n, style: Provider.of(context) .fontFamily != '' && Provider.of(context) .titleOnlyFont ? GoogleFonts.getFont( Provider.of(context).fontFamily, textStyle: TextStyle( color: AppColors.of(context).text, fontSize: 32.0, fontWeight: FontWeight.bold), ) : TextStyle( color: AppColors.of(context).text, fontSize: 32.0, fontWeight: FontWeight.bold), ), ], ), ), bottom: FilterBar( items: [ Tab(text: "Inbox".i18n), Tab(text: "Sent".i18n), Tab(text: "Trash".i18n), Tab(text: "Draft".i18n), ], controller: tabController, disableFading: true, ), ), ], body: TabBarView( physics: const BouncingScrollPhysics(), controller: tabController, children: List.generate( 4, (index) => filterViewBuilder(context, index))), ), ), ); } List getFilterWidgets(MessageType activeData) { List items = []; switch (activeData) { case MessageType.inbox: for (var message in messageProvider.messages) { if (message.type == MessageType.inbox) { items.add(DateWidget( date: message.date, widget: MessageViewable(message), )); } } break; case MessageType.sent: for (var message in messageProvider.messages) { if (message.type == MessageType.sent) { items.add(DateWidget( date: message.date, widget: MessageViewable(message), )); } } break; case MessageType.trash: for (var message in messageProvider.messages) { if (message.type == MessageType.trash) { items.add(DateWidget( date: message.date, widget: MessageViewable(message), )); } } break; case MessageType.draft: for (var message in messageProvider.messages) { if (message.type == MessageType.draft) { items.add(DateWidget( date: message.date, widget: MessageViewable(message), )); } } break; } return items; } Widget filterViewBuilder(context, int activeData) { List filterWidgets = sortDateWidgets(context, dateWidgets: getFilterWidgets(MessageType.values[activeData]), hasShadow: true); return Padding( padding: const EdgeInsets.only(top: 12.0), child: RefreshIndicator( color: Theme.of(context).colorScheme.secondary, onRefresh: () { return Future.wait([ messageProvider.fetch(type: MessageType.inbox), messageProvider.fetch(type: MessageType.sent), messageProvider.fetch(type: MessageType.trash), ]); }, child: ListView.builder( padding: EdgeInsets.zero, physics: const BouncingScrollPhysics(), itemBuilder: (context, index) => filterWidgets.isNotEmpty ? Padding( padding: const EdgeInsets.symmetric( horizontal: 24.0, vertical: 6.0), child: filterWidgets[index], ) : Empty(subtitle: "empty".i18n), itemCount: max(filterWidgets.length, 1), ), ), ); } Future showSendMessageSheet(BuildContext context) async { await messageProvider.fetchAllRecipients(); List rs = []; List add = []; for (var r in messageProvider.recipients) { if (!add.contains(r.id)) { rs.add(r); add.add(r.id ?? 0); } } _scaffoldKey.currentState?.showBottomSheet( (context) => RoundedBottomSheet(borderRadius: 14.0, child: SendMessageSheet(rs)), backgroundColor: const Color(0x00000000), elevation: 12.0, ); } }