Files
tripz-llc/apps/rider_new/lib/features/notifications/view/notifications_page.dart
T
2026-08-05 14:12:41 +03:00

118 lines
3.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import '../../../core/design/tokens.dart';
import '../../../core/design/tripz_colors.dart';
import '../../../core/di.dart';
import '../../../core/l10n/l10n.dart';
import '../../../core/notifications/notification_store.dart';
import '../../../core/ui/empty_view.dart';
import '../../../core/ui/tripz_card.dart';
import '../../../core/ui/tripz_scaffold.dart';
import '../../../core/ui/view_status.dart';
/// صندوق الإشعارات — يقابل `NotificationPage` في دراور سيرو
/// (`map_menu_widget.dart:354`).
///
/// المصدر [NotificationStore] محلّي لا شبكي (السبب في تعليق ذلك الصنف).
/// فلا كيوبت ولا مستودع: قراءة واحدة عند الفتح ثم `setState` — إضافة طبقة
/// حالة لمصدرٍ في الذاكرة تعقيد بلا مقابل.
class NotificationsPage extends StatefulWidget {
const NotificationsPage({super.key});
@override
State<NotificationsPage> createState() => _NotificationsPageState();
}
class _NotificationsPageState extends State<NotificationsPage> {
final NotificationStore _store = sl<NotificationStore>();
@override
void initState() {
super.initState();
// فتح الشاشة هو القراءة — لا زرّ «تعليم كمقروء» منفصل.
_store.markAllRead();
}
Future<void> _clear() async {
await _store.clear();
if (mounted) setState(() {});
}
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
final items = _store.items;
return TripzScaffold(
title: l10n.menuNotifications,
status: items.isEmpty ? ViewStatus.empty : ViewStatus.success,
empty: EmptyView(
icon: Icons.notifications_none_rounded,
message: l10n.notificationsEmpty,
),
actions: [
if (items.isNotEmpty)
IconButton(
icon: const Icon(Icons.delete_outline_rounded),
tooltip: l10n.notificationsClear,
onPressed: _clear,
),
],
child: ListView.separated(
itemCount: items.length,
separatorBuilder: (context, i) => const SizedBox(height: Space.xs),
itemBuilder: (context, i) => _NotificationCard(item: items[i]),
),
);
}
}
class _NotificationCard extends StatelessWidget {
const _NotificationCard({required this.item});
final AppNotification item;
@override
Widget build(BuildContext context) {
return TripzCard(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(
Icons.notifications_active_outlined,
size: Sizes.iconSm,
color: context.colors.primary,
),
const SizedBox(width: Space.sm),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (item.title.isNotEmpty)
Text(item.title, style: context.texts.titleSmall),
if (item.body.isNotEmpty) ...[
const SizedBox(height: Space.xxs),
Text(
item.body,
style: context.texts.bodySmall?.copyWith(
color: context.colors.onSurfaceVariant,
),
),
],
const SizedBox(height: Space.xxs),
Text(
DateFormat.yMd().add_jm().format(item.receivedAt.toLocal()),
style: context.texts.labelSmall?.copyWith(
color: context.colors.onSurfaceVariant,
),
),
],
),
),
],
),
);
}
}