- Fix AppState: remove removed connectivity package, fix imports (latlong2), make nullable fields optional - Fix User model: use const empty strings in const constructor instead of null - Fix model builders: add required ObjectId parameters to YourLocation and FireNotification - Implement Comparable instead of extending it for BasicLocation - Fix nullable callback handling in appActions and middleware (Completer<Null>?) - Add null checks for BuildContext in dialogs (fireAlert, homePage, etc.) - Fix nullable scaffold state access using ?. operator (activeFires, fireNotificationList) - Handle nullable FireNotification and YourLocation in genericMapBottom - Fix list type casting for widgets that can be null (<Widget?> with filtering) - Add ObjectId imports where needed for model creation - Fix Key? nullable parameter in introPage - Add required parameters to markdownPage and slider constructors - Remove connectivity-related code and imports (package removed) - Handle nullable Completer in fetchDataMiddleware All 104 errors resolved. 0 errors, 61 warnings/info remaining.
175 lines
6.6 KiB
Dart
175 lines
6.6 KiB
Dart
import 'package:badges/badges.dart' as badges_pkg;
|
|
import 'package:comunes_flutter/comunes_flutter.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_redux/flutter_redux.dart';
|
|
|
|
import 'activeFires.dart';
|
|
import 'colors.dart';
|
|
import 'fireAlert.dart';
|
|
import 'fireNotificationList.dart';
|
|
import 'generated/i18n.dart';
|
|
import 'globals.dart' as globals;
|
|
import 'models/appState.dart';
|
|
import 'monitoredAreas.dart';
|
|
import 'privacyPage.dart';
|
|
import 'sandbox.dart';
|
|
import 'supportPage.dart';
|
|
|
|
@immutable
|
|
class _ViewModel {
|
|
final int unreadCount;
|
|
|
|
_ViewModel({
|
|
required this.unreadCount,
|
|
});
|
|
|
|
@override
|
|
bool operator ==(Object other) {
|
|
return identical(this, other) ||
|
|
other is _ViewModel &&
|
|
runtimeType == other.runtimeType &&
|
|
unreadCount == other.unreadCount;
|
|
}
|
|
|
|
@override
|
|
int get hashCode => unreadCount.hashCode;
|
|
}
|
|
|
|
class MainDrawer extends Drawer {
|
|
MainDrawer(BuildContext context, String currentRoute, {key})
|
|
: super(key: key, child: mainDrawer(context, currentRoute));
|
|
}
|
|
|
|
Widget mainDrawer(BuildContext context, String currentRoute) {
|
|
return new StoreConnector<AppState, _ViewModel>(
|
|
distinct: true,
|
|
converter: (store) {
|
|
return new _ViewModel(unreadCount: store.state.fireNotificationsUnread);
|
|
},
|
|
builder: (context, view) {
|
|
final bottomTextStyle =
|
|
new TextStyle(fontSize: 12.0, color: Colors.grey);
|
|
return new ListView(
|
|
// Important: Remove any padding from the ListView.
|
|
padding: EdgeInsets.zero,
|
|
children: (<Widget?>[
|
|
new GestureDetector(
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(context, '/');
|
|
},
|
|
child: new DrawerHeader(
|
|
child: new Column(
|
|
children: <Widget>[
|
|
new Image.asset(
|
|
'images/logo-200.png',
|
|
fit: BoxFit.scaleDown,
|
|
height: 80.0,
|
|
),
|
|
const SizedBox(height: 20.0),
|
|
new Text(S.of(context).appName,
|
|
style: new TextStyle(
|
|
fontSize: 24.0,
|
|
color: Colors.white,
|
|
)),
|
|
],
|
|
),
|
|
decoration: new BoxDecoration(
|
|
color: fires300,
|
|
),
|
|
),
|
|
),
|
|
new ListTile(
|
|
leading: const Icon(Icons.whatshot),
|
|
title: new Text(S.of(context).activeFires),
|
|
selected: currentRoute == ActiveFiresPage.routeName,
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(context, ActiveFiresPage.routeName);
|
|
},
|
|
),
|
|
new ListTile(
|
|
leading: const Icon(Icons.notifications_active),
|
|
selected: currentRoute == FireAlert.routeName,
|
|
title: new Text(S.of(context).notifyAFire),
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(context, FireAlert.routeName);
|
|
},
|
|
),
|
|
new ListTile(
|
|
leading: const Icon(Icons.notifications),
|
|
selected: currentRoute == FireNotificationList.routeName,
|
|
title: Text(S.of(context).fireNotificationsTitleShort),
|
|
trailing: SizedBox(
|
|
width: 100,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: <Widget>[
|
|
badges_pkg.Badge(
|
|
position: badges_pkg.BadgePosition.topEnd(
|
|
top: -10, end: -12),
|
|
badgeContent: Text(
|
|
'${view.unreadCount.toString()}',
|
|
style: TextStyle(color: Colors.white),
|
|
),
|
|
child: Icon(Icons.notifications))
|
|
])),
|
|
|
|
// Text(S.of(context).fireNotificationsTitleShort),
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(
|
|
context, FireNotificationList.routeName);
|
|
},
|
|
),
|
|
new ListTile(
|
|
leading: const Icon(Icons.map),
|
|
selected: currentRoute == MonitoredAreasPage.routeName,
|
|
title: new Text(S.of(context).monitoredAreasTitle),
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(
|
|
context, MonitoredAreasPage.routeName);
|
|
},
|
|
),
|
|
new Divider(),
|
|
new ListTile(
|
|
leading: const Icon(Icons.favorite),
|
|
selected: currentRoute == SupportPage.routeName,
|
|
title: new Text(S.of(context).supportThisInitiative),
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(context, SupportPage.routeName);
|
|
},
|
|
),
|
|
new ListTile(
|
|
leading: const Icon(Icons.lock),
|
|
selected: currentRoute == PrivacyPage.routeName,
|
|
title: new Text(S.of(context).privacyPolicy),
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(context, PrivacyPage.routeName);
|
|
},
|
|
),
|
|
globals.isDevelopment
|
|
? new ListTile(
|
|
leading: const Icon(Icons.bug_report),
|
|
title: new Text('Sandbox'),
|
|
selected: currentRoute == Sandbox.routeName,
|
|
onTap: () {
|
|
Navigator.popAndPushNamed(context, Sandbox.routeName);
|
|
},
|
|
)
|
|
: null,
|
|
new AboutListTile(
|
|
icon: globals.appIcon,
|
|
applicationName: S.of(context).appName,
|
|
applicationVersion: globals.appVersion,
|
|
applicationIcon: globals.appMediumIcon,
|
|
applicationLegalese:
|
|
S.of(context).appLicense(DateTime.now().year.toString()),
|
|
aboutBoxChildren: <Widget>[
|
|
new SizedBox(height: 10.0),
|
|
new Text(S.of(context).appMoto),
|
|
// , style: new TextStyle(fontStyle: FontStyle.italic)),
|
|
new SizedBox(height: 10.0),
|
|
new Text(S.of(context).NASAAck, style: bottomTextStyle),
|
|
// More ?
|
|
])
|
|
]).where((w) => w != null).cast<Widget>().toList());
|
|
});
|
|
}
|