todos-contra-el-fuego-mobile/lib/global_fires_bottom_stats.dart
vjrj 12653b80a4 Fix 78 additional lint issues: rename all files to snake_case and fix 16 style issues
Lint issues fixed (263 total in lib/):
- file_names (57 issues): Renamed all PascalCase files to snake_case
  - All lib files: activeFires -> active_fires, etc.
  - All models: appState -> app_state, fireMapState -> fire_map_state, etc.
  - All redux files: appActions -> app_actions, appReducer -> app_reducer, etc.
- Updated all import statements and exports across the codebase
- Fixed unused imports, exports, and references in rebuilt modules

Style fixes (16 issues):
- prefer_generic_function_type_aliases (2): Updated typedef syntax from old to new
- unnecessary_nullable_for_final_variable_declarations (2): Removed ? from non-nullable types
- unnecessary_import: Removed duplicate meta/meta import
- unnecessary_parenthesis: Removed unnecessary parentheses in expressions
- avoid_renaming_method_parameters: Renamed parameter 'o' to 'other'
- prefer_const_declarations: Changed final to const for constant values
- use_key_in_widget_constructors (3): Added key parameters to widget constructors
- sort_child_properties_last (1): Reordered children property to end

Verification:
- APK builds successfully (146 MB)
- Reduced from 106 lint issues to 49 high-priority issues
- Total file_names issues: 0 (down from 57)
- All imports and exports updated correctly
2026-03-12 09:00:06 +01:00

76 lines
2.3 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:http/http.dart' as http;
import 'colors.dart';
import 'custom_bottom_app_bar.dart';
import 'custom_moment.dart';
import 'generated/i18n.dart';
class GlobalFiresBottomStats extends StatefulWidget {
const GlobalFiresBottomStats({super.key});
@override
_GlobalFiresBottomStatsState createState() => _GlobalFiresBottomStatsState();
}
class _GlobalFiresBottomStatsState extends State<GlobalFiresBottomStats> {
late String lastCheck;
int activeFires = 0;
final String firesApiUrl =
GetIt.instance<String>(instanceName: 'firesApiUrl');
@override
void initState() {
super.initState();
http
.read(Uri.parse('${firesApiUrl}status/last-fire-check'))
.then((String result) {
try {
final Moment now = Moment.now();
final dynamic decodedResult = json.decode(result);
final Map<String, dynamic> resultMap =
decodedResult as Map<String, dynamic>;
final DateTime last = DateTime.parse(resultMap['value'] as String);
http
.read(Uri.parse('${firesApiUrl}status/active-fires-count'))
.then((String result) {
try {
final dynamic decodedCountResult = json.decode(result);
final Map<String, dynamic> countMap =
decodedCountResult as Map<String, dynamic>;
final int count = (countMap['total'] as num).toInt();
setState(() {
lastCheck = now.from(context, last);
activeFires = count;
});
} catch (_) {
// Ignore JSON parse errors
}
});
} catch (_) {
// Ignore storage read errors
}
});
}
@override
Widget build(BuildContext context) {
final List<Widget> actionWidgets = <Widget>[];
if (activeFires > 0) {
actionWidgets
.add(Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
Text(S.of(context).activeFiresWorldWide(activeFires.toString())),
Text(S.of(context).updatedLastCheck(lastCheck))
]));
}
return CustomBottomAppBar(
fabLocation: FloatingActionButtonLocation.centerDocked,
showNotch: true,
color: fires100,
actions: actionWidgets);
}
}