relatica/lib/controls/notifications_control.dart

92 wiersze
3.1 KiB
Dart

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<void> _goToStatus(BuildContext context) async {
final manager = getIt<TimelineManager>();
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<NotificationsManager>();
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.favourite:
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)),
);
}
}