import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import '../globals.dart'; import '../models/user_notification.dart'; import '../routes.dart'; import '../services/notifications_manager.dart'; import '../services/timeline_manager.dart'; import '../utils/dateutils.dart'; import '../utils/snackbar_builder.dart'; class NotificationControl extends StatelessWidget { final UserNotification notification; const NotificationControl({ super.key, required this.notification, }); Future _goToStatus(BuildContext context) async { final manager = getIt(); final existingPostData = manager.getPostTreeEntryBy(notification.iid); if (existingPostData.isSuccess) { context.push('/post/view/${existingPostData.value.id}'); return; } final loadedPost = await manager.refreshStatusChain(notification.iid); if (loadedPost.isSuccess) { context.push('/post/view/${loadedPost.value.id}'); return; } buildSnackbar( context, 'Error getting data for notification: ${loadedPost.error}'); } @override Widget build(BuildContext context) { final manager = context.watch(); return ListTile( tileColor: notification.dismissed ? null : Colors.black12, leading: GestureDetector( onTap: () async { context.pushNamed(ScreenPaths.userProfile, params: {'id': notification.fromId}); }, child: Text(notification.fromName), ), title: GestureDetector( onTap: () async { switch (notification.type) { case NotificationType.follow: buildSnackbar( context, 'Want to follow ${notification.fromName}?'); break; case NotificationType.follow_request: buildSnackbar( context, 'Want to accept follow ${notification.fromName}?'); break; case NotificationType.unknown: buildSnackbar(context, 'Unknown message type, nothing to do'); break; case NotificationType.favorite: case NotificationType.mention: case NotificationType.reshare: case NotificationType.status: _goToStatus(context); break; } }, child: HtmlWidget(notification.content), ), subtitle: Text(ElapsedDateUtils.epochSecondsToString(notification.timestamp)), trailing: notification.dismissed || (notification.type == NotificationType.follow || notification.type == NotificationType.follow_request) ? null : IconButton( onPressed: () async { final result = await manager.markSeen(notification); if (result.isFailure) { buildSnackbar( context, 'Error marking notification: ${result.error}'); } }, icon: Icon(Icons.close_rounded)), ); } }