import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:fcs/model/notification_model.dart'; import 'package:fcs/pages/util.dart'; import 'package:fcs/vo/notification.dart' as Noti; import 'package:fcs/vo/popup_menu.dart'; import 'package:fcs/widget/localization/app_translations.dart'; import 'package:fcs/widget/popupmenu.dart'; import 'package:fcs/widget/progress.dart'; import '../theme/theme.dart'; class NotificationList extends StatefulWidget { @override _NotificationListState createState() => _NotificationListState(); } class _NotificationListState extends State { var timeFormatter = new DateFormat('KK:mm a'); var dateFormatter = new DateFormat('dd MMM'); final double dotSize = 15.0; int _selectedIndex = 0; bool _isLoading = false; bool _isClicked = false; @override Widget build(BuildContext context) { NotificationModel notificationModel = Provider.of(context); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( backgroundColor: primaryColor, title: Text(AppTranslations.of(context).text("noti.title")), actions: [ PopupMenuButton( elevation: 3.2, onSelected: (selected) { setState(() { this._selectedIndex = selected.index; }); notificationModel.filter(selected.index); }, icon: Container( width: 30, height: 30, decoration: new BoxDecoration( shape: BoxShape.circle, color: Colors.white, ), child: Stack( fit: StackFit.expand, children: [ Icon( Icons.filter_list, color: primaryColor, ), _selectedIndex != 0 ? Positioned( bottom: 0, right: 0, child: Container( width: 10, height: 10, decoration: new BoxDecoration( shape: BoxShape.circle, color: secondaryColor, ), ), ) : Container() ], )), itemBuilder: (BuildContext context) { return notificationMenu.map((PopupMenu choice) { return PopupMenuItem( value: choice, child: Row( children: [ Text(choice.status), SizedBox( width: 10, ), _selectedIndex != null && _selectedIndex == choice.index ? Icon( Icons.check, color: Colors.grey, ) : Container(), ], ), ); }).toList(); }), ], ), body: new ListView.separated( separatorBuilder: (context, index) => Divider( color: Colors.black, ), scrollDirection: Axis.vertical, padding: EdgeInsets.only(left: 15, right: 15, top: 15), shrinkWrap: true, itemCount: notificationModel.notis.length, itemBuilder: (BuildContext context, int index) { Noti.Notification noti = notificationModel.notis[index]; return Stack( children: [ InkWell( onTap: () => _display(noti), child: Row( children: [ Expanded( child: new Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: new Row( children: [ new Padding( padding: new EdgeInsets.symmetric( horizontal: 32.0 - dotSize / 2), child: Icon(Icons.message), ), new Expanded( child: new Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( noti.getDesc, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), new Text( noti.itemType == "reg" ? "" : noti.itemNumber, style: new TextStyle( fontSize: 13.0, color: Colors.grey), ), ], ), ), ], ), ), ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text(timeFormatter.format(noti.time)), ), noti.fromToday() ? Container() : Text(dateFormatter.format(noti.time)), ], ) ], ), ), noti.seen ? Container() : new Positioned( left: 11, top: 11, child: new Container( padding: EdgeInsets.all(2), decoration: new BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(6), ), constraints: BoxConstraints( minWidth: 18, minHeight: 18, ), child: Text( 'new', style: TextStyle( color: Colors.white, fontSize: 14, ), textAlign: TextAlign.center, ), ), ) ], ); }), ), ); } _display(Noti.Notification noti) async { if (_isClicked) return; _isClicked = true; await displayNotiContent(context, noti); _isClicked = false; } }