Files
floodwatch/lib/pages/landing_page.dart
2025-01-28 22:02:09 +01:00

110 lines
2.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../model/flood_station.dart';
import '../services/overlay_service.dart';
import '../widgets/flood_station_list_view.dart';
import '../services/flood_station_provider.dart';
import '../widgets/station_filter.dart';
import 'flood_station_page.dart';
class LandingPage extends StatefulWidget {
const LandingPage({super.key});
@override
State<LandingPage> createState() => _LandingPageState();
}
class _LandingPageState extends State<LandingPage> with OverlayService {
late FloodStationProvider floodStationProvider;
@override
void dispose() {
super.dispose();
removeLoadingNotifier(); // Clean up overlay if needed
}
@override
Widget build(BuildContext context) {
floodStationProvider = context.watch<FloodStationProvider>();
return Column(
children: [
StationFilter(
onChanged: (filterText) => _handleFilterChange(filterText),
),
_buildStationList(),
],
);
}
Widget _buildStationList() {
if (!_shouldShowList()) {
return Expanded(
child: Center(
child: ElevatedButton(
onPressed: _handleLoadAllStations,
child: const Text('Load all Stations'),
),
),
);
}
return Expanded(
child: FloodStationListView(
stations: floodStationProvider.filtered
? floodStationProvider.filteredStations
: floodStationProvider.allStations,
onItemTapped: _navigateToStationDetail,
),
);
}
void _handleFilterChange(String filterText) {
if (filterText.isEmpty) {
floodStationProvider.filtered = false;
setState(() {});
return;
}
showLoadingNotifier(
context: context,
message: 'Loading',
onDismiss: () {
floodStationProvider.cancelFilterLoading();
},
);
floodStationProvider.loadFilteredStations(filterText);
floodStationProvider.filteredStationsFuture
?.then((_) => removeLoadingNotifier());
floodStationProvider.filtered = true;
}
void _handleLoadAllStations() {
showLoadingNotifier(
context: context,
message: 'Loading',
onDismiss: () {
floodStationProvider.cancelFilterLoading();
},
);
floodStationProvider
.loadAllStations()
.whenComplete(() => removeLoadingNotifier());
}
void _navigateToStationDetail(FloodStation station) {
floodStationProvider.selectedStation = station;
Navigator.of(context).pushNamed(FloodStationPage.routeName);
}
bool _shouldShowList() {
if (!floodStationProvider.filtered &&
floodStationProvider.allStations.isNotEmpty) {
return true;
}
return floodStationProvider.filtered;
}
}