part of '../neon_notifications.dart'; class NotificationsMainPage extends StatefulWidget { const NotificationsMainPage({ required this.bloc, super.key, }); final NotificationsBloc bloc; @override State createState() => _NotificationsMainPageState(); } class _NotificationsMainPageState extends State { @override void initState() { super.initState(); widget.bloc.errors.listen((final error) { NeonException.showSnackbar(context, error); }); } @override Widget build(final BuildContext context) => ResultBuilder>( stream: widget.bloc.notifications, builder: (final context, final notifications) => Scaffold( resizeToAvoidBottomInset: false, floatingActionButton: FloatingActionButton( onPressed: () async { widget.bloc.deleteAllNotifications(); }, child: const Icon(MdiIcons.checkAll), ), body: NeonListView( scrollKey: 'notifications-notifications', withFloatingActionButton: true, items: notifications.data, isLoading: notifications.loading, error: notifications.error, onRefresh: widget.bloc.refresh, builder: _buildNotification, ), ), ); Widget _buildNotification( final BuildContext context, final NextcloudNotificationsNotification notification, ) { final app = Provider.of>(context, listen: false).find(notification.app); return ListTile( title: Text(notification.subject), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (notification.message.isNotEmpty) ...[ Text( notification.message, overflow: TextOverflow.ellipsis, ), const SizedBox( height: 5, ), ], RelativeTime( date: DateTime.parse(notification.datetime), ), ], ), leading: app != null ? app.buildIcon( context, size: const Size.square(40), ) : SizedBox.fromSize( size: const Size.square(40), child: NeonCachedUrlImage( url: notification.icon!, size: const Size.square(40), svgColor: Theme.of(context).colorScheme.primary, ), ), onTap: () async { if (notification.app == 'notifications') { return; } if (app != null) { final accountsBloc = Provider.of(context, listen: false); await accountsBloc.getAppsBloc(accountsBloc.activeAccount.value!).setActiveApp(app.id); } else { await showDialog( context: context, builder: (final context) => AlertDialog( title: Text(AppLocalizations.of(context).notificationsNextcloudAppNotImplementedYet), actions: [ ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Colors.red, foregroundColor: Theme.of(context).colorScheme.onPrimary, ), onPressed: () { Navigator.of(context).pop(); }, child: Text(AppLocalizations.of(context).close), ), ], ), ); } }, onLongPress: () { widget.bloc.deleteNotification(notification.notificationId); }, ); } }