271 lines
8.6 KiB
Dart
Raw Normal View History

2025-08-29 16:33:12 +07:00
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import '../../../../../common/theme/theme.dart';
@RoutePage()
class NotificationPage extends StatelessWidget {
const NotificationPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.background,
appBar: AppBar(
title: Text(
'Notifikasi',
style: AppStyle.xl.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.textPrimary,
),
),
backgroundColor: AppColor.backgroundLight,
elevation: 0,
iconTheme: IconThemeData(color: AppColor.textPrimary),
actions: [
TextButton(
onPressed: () => _markAllAsRead(context),
child: Text(
'Tandai Semua',
style: AppStyle.sm.copyWith(
color: AppColor.primary,
fontWeight: FontWeight.w600,
),
),
),
],
bottom: PreferredSize(
preferredSize: Size.fromHeight(1),
child: Container(height: 1, color: AppColor.borderLight),
),
),
body: ListView(
padding: EdgeInsets.symmetric(vertical: 8),
children: [
// Today Section
_buildSectionHeader('Hari Ini'),
_buildNotificationItem(
icon: Icons.local_offer,
iconColor: AppColor.primary,
iconBgColor: AppColor.primaryWithOpacity(0.1),
title: 'Voucher Baru Tersedia!',
subtitle: 'Dapatkan diskon 50% untuk pembelian pertama Anda',
time: '2 menit lalu',
isUnread: true,
),
_buildNotificationItem(
icon: Icons.shopping_bag,
iconColor: AppColor.success,
iconBgColor: AppColor.successWithOpacity(0.1),
title: 'Pesanan Sedang Dikirim',
subtitle: 'Pesanan #ORD-2024-001 sedang dalam perjalanan',
time: '1 jam lalu',
isUnread: true,
),
_buildNotificationItem(
icon: Icons.payment,
iconColor: AppColor.info,
iconBgColor: AppColor.info.withOpacity(0.1),
title: 'Pembayaran Berhasil',
subtitle:
'Pembayaran untuk pesanan #ORD-2024-001 telah dikonfirmasi',
time: '3 jam lalu',
isUnread: false,
),
// Yesterday Section
_buildSectionHeader('Kemarin'),
_buildNotificationItem(
icon: Icons.star,
iconColor: AppColor.warning,
iconBgColor: AppColor.warningWithOpacity(0.1),
title: 'Berikan Rating Produk',
subtitle: 'Bagaimana pengalaman Anda dengan produk yang dibeli?',
time: '1 hari lalu',
isUnread: false,
),
_buildNotificationItem(
icon: Icons.local_shipping,
iconColor: AppColor.success,
iconBgColor: AppColor.successWithOpacity(0.1),
title: 'Pesanan Telah Diterima',
subtitle: 'Pesanan #ORD-2024-002 telah sampai di tujuan',
time: '1 hari lalu',
isUnread: false,
),
// This Week Section
_buildSectionHeader('Minggu Ini'),
_buildNotificationItem(
icon: Icons.campaign,
iconColor: AppColor.primary,
iconBgColor: AppColor.primaryWithOpacity(0.1),
title: 'Flash Sale 12.12!',
subtitle: 'Jangan lewatkan flash sale dengan diskon hingga 70%',
time: '3 hari lalu',
isUnread: false,
),
_buildNotificationItem(
icon: Icons.card_giftcard,
iconColor: AppColor.secondary,
iconBgColor: AppColor.secondary.withOpacity(0.1),
title: 'Poin Reward Ditambahkan',
subtitle: 'Selamat! Anda mendapat 100 poin dari transaksi terakhir',
time: '5 hari lalu',
isUnread: false,
),
_buildNotificationItem(
icon: Icons.security,
iconColor: AppColor.textSecondary,
iconBgColor: AppColor.textSecondary.withOpacity(0.1),
title: 'Keamanan Akun',
subtitle: 'Login dari perangkat baru terdeteksi',
time: '6 hari lalu',
isUnread: false,
),
SizedBox(height: 16),
],
),
);
}
Widget _buildSectionHeader(String title) {
return Padding(
padding: EdgeInsets.fromLTRB(16, 16, 16, 8),
child: Text(
title,
style: AppStyle.md.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.textSecondary,
),
),
);
}
Widget _buildNotificationItem({
required IconData icon,
required Color iconColor,
required Color iconBgColor,
required String title,
required String subtitle,
required String time,
required bool isUnread,
}) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 4),
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: isUnread
? AppColor.primary.withOpacity(0.02)
: AppColor.backgroundLight,
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: isUnread
? AppColor.primary.withOpacity(0.1)
: AppColor.borderLight,
),
),
child: InkWell(
onTap: () => _handleNotificationTap(title),
borderRadius: BorderRadius.circular(12),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Icon Container
Container(
width: 48,
height: 48,
decoration: BoxDecoration(
color: iconBgColor,
borderRadius: BorderRadius.circular(12),
),
child: Icon(icon, color: iconColor, size: 24),
),
SizedBox(width: 12),
// Content
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Text(
title,
style: AppStyle.md.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.textPrimary,
),
),
),
if (isUnread)
Container(
width: 8,
height: 8,
decoration: BoxDecoration(
color: AppColor.primary,
shape: BoxShape.circle,
),
),
],
),
SizedBox(height: 4),
Text(
subtitle,
style: AppStyle.sm.copyWith(
color: AppColor.textSecondary,
height: 1.4,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
SizedBox(height: 8),
Text(
time,
style: AppStyle.xs.copyWith(color: AppColor.textLight),
),
],
),
),
// Options Menu
IconButton(
onPressed: () => _showNotificationOptions(title),
icon: Icon(Icons.more_vert, color: AppColor.textLight, size: 20),
constraints: BoxConstraints(),
padding: EdgeInsets.all(4),
),
],
),
),
);
}
void _markAllAsRead(BuildContext context) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Semua notifikasi ditandai sebagai dibaca',
style: AppStyle.md.copyWith(color: AppColor.white),
),
backgroundColor: AppColor.success,
behavior: SnackBarBehavior.floating,
margin: EdgeInsets.all(16),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
);
}
void _handleNotificationTap(String title) {
// Handle notification tap - navigate to relevant page
print('Notification tapped: $title');
}
void _showNotificationOptions(String title) {
// Show bottom sheet or popup menu for notification options
print('Show options for: $title');
}
}