import 'package:flutter/foundation.dart'; import 'package:refilc/api/providers/database_provider.dart'; import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/helpers/notification_helper.dart'; import 'package:refilc/models/settings.dart'; import 'package:refilc/models/user.dart'; import 'package:refilc/theme/colors/colors.dart'; import 'package:refilc_mobile_ui/common/beta_chip.dart'; import 'package:refilc_mobile_ui/common/panel/panel_button.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart'; import 'notifications_screen.i18n.dart'; class MenuNotifications extends StatelessWidget { const MenuNotifications({ super.key, this.borderRadius = const BorderRadius.vertical( top: Radius.circular(4.0), bottom: Radius.circular(4.0)), }); final BorderRadius borderRadius; @override Widget build(BuildContext context) { return PanelButton( onPressed: () => Navigator.of(context, rootNavigator: true).push( CupertinoPageRoute(builder: (context) => const NotificationsScreen()), ), title: Row( children: [ Text( "notifications_screen".i18n, ), const SizedBox(width: 5.0), const BetaChip( disabled: false, ), ], ), leading: Icon( FeatherIcons.messageCircle, size: 22.0, color: AppColors.of(context).text.withOpacity(0.95), ), trailing: Icon( FeatherIcons.chevronRight, size: 22.0, color: AppColors.of(context).text.withOpacity(0.95), ), borderRadius: borderRadius, ); } } class NotificationsScreen extends StatelessWidget { const NotificationsScreen({super.key}); // Set all notification categories as seen to avoid spamming the user with notifications when they turn on notifications void setAll(BuildContext context, DateTime date) { DatabaseProvider database = Provider.of(context, listen: false); User? user = Provider.of(context, listen: false).user; if (user != null) { for (LastSeenCategory category in LastSeenCategory.values) { database.userStore .storeLastSeen(date, userId: user.id, category: category); } } } @override Widget build(BuildContext context) { SettingsProvider settings = Provider.of(context); return Scaffold( appBar: AppBar( surfaceTintColor: Theme.of(context).scaffoldBackgroundColor, leading: BackButton(color: AppColors.of(context).text), title: Text( "notifications_screen".i18n, style: TextStyle(color: AppColors.of(context).text), ), ), body: SingleChildScrollView( child: Padding( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0), child: Column( children: [ SplittedPanel( padding: const EdgeInsets.only(top: 8.0), cardPadding: const EdgeInsets.all(4.0), isSeparated: true, children: [ PanelButton( padding: const EdgeInsets.only(left: 14.0, right: 6.0), onPressed: () { settings.update( notificationsEnabled: !settings.notificationsGradesEnabled); setAll(context, DateTime.now()); }, title: Text( "grades".i18n, style: TextStyle( color: AppColors.of(context).text.withOpacity( settings.notificationsGradesEnabled ? .95 : .25), ), ), leading: Icon( FeatherIcons.bookmark, size: 22.0, color: AppColors.of(context).text.withOpacity( settings.notificationsGradesEnabled ? .95 : .25), ), trailing: Switch( onChanged: (v) => settings.update(notificationsGradesEnabled: v), value: settings.notificationsGradesEnabled, activeColor: Theme.of(context).colorScheme.secondary, ), borderRadius: const BorderRadius.vertical( top: Radius.circular(12.0), bottom: Radius.circular(12.0), ), ), ], ), SplittedPanel( padding: const EdgeInsets.only(top: 8.0), cardPadding: const EdgeInsets.all(4.0), isSeparated: true, children: [ PanelButton( padding: const EdgeInsets.only(left: 14.0, right: 6.0), onPressed: () { settings.update( notificationsEnabled: !settings.notificationsAbsencesEnabled); setAll(context, DateTime.now()); }, title: Text( "absences".i18n, style: TextStyle( color: AppColors.of(context).text.withOpacity( settings.notificationsAbsencesEnabled ? .95 : .25), ), ), leading: Icon( FeatherIcons.clock, size: 22.0, color: AppColors.of(context).text.withOpacity( settings.notificationsAbsencesEnabled ? .95 : .25), ), trailing: Switch( onChanged: (v) => settings.update(notificationsAbsencesEnabled: v), value: settings.notificationsAbsencesEnabled, activeColor: Theme.of(context).colorScheme.secondary, ), borderRadius: const BorderRadius.vertical( top: Radius.circular(12.0), bottom: Radius.circular(12.0), ), ), ], ), SplittedPanel( padding: const EdgeInsets.only(top: 8.0), cardPadding: const EdgeInsets.all(4.0), isSeparated: true, children: [ PanelButton( padding: const EdgeInsets.only(left: 14.0, right: 6.0), onPressed: () { settings.update( notificationsEnabled: !settings.notificationsMessagesEnabled); setAll(context, DateTime.now()); }, title: Text( "messages".i18n, style: TextStyle( color: AppColors.of(context).text.withOpacity( settings.notificationsMessagesEnabled ? .95 : .25), ), ), leading: Icon( FeatherIcons.messageSquare, size: 22.0, color: AppColors.of(context).text.withOpacity( settings.notificationsMessagesEnabled ? .95 : .25), ), trailing: Switch( onChanged: (v) => settings.update(notificationsMessagesEnabled: v), value: settings.notificationsMessagesEnabled, activeColor: Theme.of(context).colorScheme.secondary, ), borderRadius: const BorderRadius.vertical( top: Radius.circular(12.0), bottom: Radius.circular(12.0), ), ), ], ), SplittedPanel( padding: const EdgeInsets.only(top: 8.0), cardPadding: const EdgeInsets.all(4.0), isSeparated: true, children: [ PanelButton( padding: const EdgeInsets.only(left: 14.0, right: 6.0), onPressed: () { settings.update( notificationsEnabled: !settings.notificationsLessonsEnabled); setAll(context, DateTime.now()); }, title: Text( "lessons".i18n, style: TextStyle( color: AppColors.of(context).text.withOpacity( settings.notificationsLessonsEnabled ? .95 : .25), ), ), leading: Icon( FeatherIcons.bookmark, size: 22.0, color: AppColors.of(context).text.withOpacity( settings.notificationsLessonsEnabled ? .95 : .25), ), trailing: Switch( onChanged: (v) => settings.update(notificationsLessonsEnabled: v), value: settings.notificationsLessonsEnabled, activeColor: Theme.of(context).colorScheme.secondary, ), borderRadius: const BorderRadius.vertical( top: Radius.circular(12.0), bottom: Radius.circular(12.0), ), ), ], ), // only used for debugging, pressing **will** cause notification spam kDebugMode ? SplittedPanel( padding: const EdgeInsets.only(top: 9.0), cardPadding: const EdgeInsets.all(4.0), isSeparated: true, children: [ PanelButton( onPressed: () => setAll( context, DateTime(1970, 1, 1, 0, 0, 0, 0, 0)), title: Text("set_all_as_unseen".i18n), leading: Icon( FeatherIcons.mail, size: 22.0, color: AppColors.of(context).text.withOpacity(0.95), ), borderRadius: const BorderRadius.vertical( top: Radius.circular(12.0), bottom: Radius.circular(4.0)), ) ], ) : const SizedBox.shrink(), ], ), ), ), ); } }