import 'dart:async'; import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'colors.dart'; import 'customBottomAppBar.dart'; import 'customMoment.dart'; import 'generated/i18n.dart'; import 'models/appState.dart'; import 'models/falsePositiveTypes.dart'; import 'models/fireMapState.dart'; import 'models/fireNotification.dart'; import 'models/yourLocation.dart'; typedef OnSave = void Function(); typedef OnCancel = void Function(); typedef OnFalsePositive = void Function( FireNotification notif, FalsePositiveType type); class GenericMapBottom extends StatelessWidget { const GenericMapBottom( {super.key, required this.onSave, required this.onCancel, required this.onFalsePositive, required this.state, required this.scaffoldKey}); final OnSave onSave; final OnCancel onCancel; final OnFalsePositive onFalsePositive; final FireMapState state; final GlobalKey scaffoldKey; @override Widget build(BuildContext context) { final YourLocation? locOrNull = state.yourLocation; if (locOrNull == null) { return const SizedBox.shrink(); } final YourLocation loc = locOrNull; final int kmAround = loc.distance; return CustomBottomAppBar( fabLocation: FloatingActionButtonLocation.centerFloat, color: fires100, actions: buildActionList(loc, context, kmAround, scaffoldKey)); } List buildActionList(YourLocation loc, BuildContext context, int kmAround, GlobalKey scaffoldState) { final List actionList = []; switch (state.status) { case FireMapStatus.edit: actionList.add(TextButton( onPressed: onSave, child: Text(S.of(context).SAVE, style: Theme.of(context).textTheme.labelLarge))); actionList.add(TextButton( onPressed: onCancel, child: Text(S.of(context).CANCEL, style: Theme.of(context).textTheme.labelLarge))); break; case FireMapStatus.subscriptionConfirm: break; case FireMapStatus.viewFireNotification: final FireNotification? notif = state.fireNotification; if (notif != null) { actionList.add(Flexible( child: Padding( padding: const EdgeInsets.all(10.0), child: Column( mainAxisSize: MainAxisSize.min, children: listWithoutNulls([ Text(notif.description), // TODOfire type (neighbout, NASA, etc) const SizedBox(height: 5.0), Row( children: [ const Icon(Icons.access_time), const SizedBox(width: 5.0), Text(Moment.now().from(context, notif.when)), ], ), if (state.industries.isNotEmpty || state.falsePos.isNotEmpty) Padding( padding: const EdgeInsets.only(top: 10.0), child: Text(S.of(context).itSeemsNotAtForesFire, style: const TextStyle(color: fires600))) else null, DropdownButton( style: const TextStyle( color: Colors.black, // fontSize: 18.0, ), hint: Text(S.of(context).notAWildfire), items: FalsePositiveType.values .map((FalsePositiveType value) { String menuText; switch (value) { case FalsePositiveType.industry: menuText = S.of(context).itSeemsAIndustry; break; case FalsePositiveType.controled: menuText = S.of(context).itSeemsAControlledBurning; break; case FalsePositiveType.falsealarm: menuText = S.of(context).itSeemsAFalseAlarm; } return DropdownMenuItem( value: value, child: Text(menuText)); }).toList(), onChanged: (FalsePositiveType? value) async { if (value != null) { onFalsePositive(notif, value); } await Future.delayed( const Duration(milliseconds: 500)); ScaffoldMessenger.of(context) .showSnackBar(SnackBar( content: Text(S.of(context).thanksForParticipating), )); }), ] as List))))); } break; case FireMapStatus.unsubscribe: case FireMapStatus.view: actionList.add(Text(state.numFires > 0 ? loc.currentNumFires == 1 ? S.of(context).fireAroundThisArea(loc.distance.toString()) : S.of(context).firesAroundThisArea( state.numFires.toString(), kmAround.toString()) : S.of(context).noFiresAroundThisArea(kmAround.toString()))); // SizedBox(width: 10.0) } return actionList; } }