mirror of
https://gitlab.com/mysocialportal/relatica
synced 2024-10-19 05:53:31 +00:00
102 lines
3.4 KiB
Dart
102 lines
3.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:logging/logging.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import '../controls/app_bottom_nav_bar.dart';
|
|
import '../controls/notifications_control.dart';
|
|
import '../controls/standard_appbar.dart';
|
|
import '../globals.dart';
|
|
import '../services/network_status_service.dart';
|
|
import '../services/notifications_manager.dart';
|
|
import '../utils/snackbar_builder.dart';
|
|
|
|
class NotificationsScreen extends StatelessWidget {
|
|
static final _logger = Logger('$NotificationsScreen');
|
|
|
|
const NotificationsScreen({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
_logger.finest('Building');
|
|
final nss = getIt<NetworkStatusService>();
|
|
final manager = context.watch<NotificationsManager>();
|
|
final notifications = manager.notifications;
|
|
late final String title;
|
|
late final Widget body;
|
|
if (notifications.isEmpty) {
|
|
manager.updateNotifications();
|
|
title = 'Notifications';
|
|
body = Center(
|
|
child: Column(
|
|
children: [
|
|
const Center(child: Text('No notifications')),
|
|
],
|
|
));
|
|
} else {
|
|
final unreadCount = notifications.where((e) => !e.dismissed).length;
|
|
title = 'Notifications ($unreadCount)';
|
|
body = ListView.separated(
|
|
itemBuilder: (context, index) {
|
|
return NotificationControl(notification: notifications[index]);
|
|
},
|
|
separatorBuilder: (context, index) {
|
|
return const Divider(
|
|
color: Colors.black54,
|
|
height: 0.0,
|
|
);
|
|
},
|
|
itemCount: notifications.length + 1);
|
|
}
|
|
|
|
return Scaffold(
|
|
appBar: StandardAppBar.build(
|
|
context,
|
|
title,
|
|
actions: [
|
|
ValueListenableBuilder(
|
|
valueListenable: nss.notificationsUpdateStatus,
|
|
builder: (context2, executing, _) {
|
|
if (executing) {
|
|
final theme = Theme.of(context);
|
|
final size = theme.appBarTheme.actionsIconTheme?.size ??
|
|
theme.iconTheme.size ??
|
|
24;
|
|
return Center(
|
|
child: SizedBox(
|
|
width: size,
|
|
height: size,
|
|
child: CircularProgressIndicator(
|
|
color: theme.canvasColor,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
return IconButton(
|
|
onPressed: () async => await manager.updateNotifications(),
|
|
icon: const Icon(Icons.refresh));
|
|
}),
|
|
IconButton(
|
|
onPressed: () async => _clearAllNotifications(context, manager),
|
|
icon: const Icon(Icons.cleaning_services),
|
|
),
|
|
],
|
|
),
|
|
body: body,
|
|
bottomNavigationBar: const AppBottomNavBar(
|
|
currentButton: NavBarButtons.notifications,
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> _clearAllNotifications(
|
|
BuildContext context, NotificationsManager manager) async {
|
|
final confirmed =
|
|
await showYesNoDialog(context, 'Clear all notifications?');
|
|
if (confirmed == true) {
|
|
final message = (await manager.markAllAsRead()).fold(
|
|
onSuccess: (_) => 'Marked all notifications as read',
|
|
onError: (error) => 'Error marking notifications: $error');
|
|
buildSnackbar(context, message);
|
|
}
|
|
}
|
|
}
|