Add ability to select distance unit
Some checks failed
Some checks failed
This commit is contained in:
@@ -7,6 +7,7 @@ import 'package:mileograph_flutter/components/dashboard/top_traction_panel.dart'
|
||||
import 'package:mileograph_flutter/objects/objects.dart';
|
||||
import 'package:mileograph_flutter/services/authservice.dart';
|
||||
import 'package:mileograph_flutter/services/data_service.dart';
|
||||
import 'package:mileograph_flutter/services/distance_unit_service.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class Dashboard extends StatefulWidget {
|
||||
@@ -23,6 +24,7 @@ class _DashboardState extends State<Dashboard> {
|
||||
Widget build(BuildContext context) {
|
||||
final data = context.watch<DataService>();
|
||||
final auth = context.watch<AuthService>();
|
||||
final distanceUnits = context.watch<DistanceUnitService>();
|
||||
final stats = data.homepageStats;
|
||||
|
||||
final isInitialLoading = data.isHomepageLoading || stats == null;
|
||||
@@ -46,9 +48,15 @@ class _DashboardState extends State<Dashboard> {
|
||||
ListView(
|
||||
padding: const EdgeInsets.all(16),
|
||||
children: [
|
||||
_buildHero(context, auth, data, stats),
|
||||
_buildHero(context, auth, data, stats, distanceUnits),
|
||||
const SizedBox(height: spacing),
|
||||
_buildTiles(context, data, maxWidth, spacing),
|
||||
_buildTiles(
|
||||
context,
|
||||
data,
|
||||
distanceUnits,
|
||||
maxWidth,
|
||||
spacing,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (isInitialLoading)
|
||||
@@ -81,6 +89,7 @@ class _DashboardState extends State<Dashboard> {
|
||||
AuthService auth,
|
||||
DataService data,
|
||||
HomepageStats? stats,
|
||||
DistanceUnitService distanceUnits,
|
||||
) {
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
final greetingName =
|
||||
@@ -119,14 +128,14 @@ class _DashboardState extends State<Dashboard> {
|
||||
_metricTile(
|
||||
context,
|
||||
label: 'Total mileage',
|
||||
value: '${totalMileage.toStringAsFixed(1)} mi',
|
||||
value: distanceUnits.format(totalMileage, decimals: 1),
|
||||
icon: Icons.route,
|
||||
color: colorScheme.onPrimaryContainer,
|
||||
),
|
||||
_metricTile(
|
||||
context,
|
||||
label: 'This year',
|
||||
value: '${currentYearMileage.toStringAsFixed(1)} mi',
|
||||
value: distanceUnits.format(currentYearMileage, decimals: 1),
|
||||
icon: Icons.calendar_today,
|
||||
color: colorScheme.onPrimaryContainer,
|
||||
),
|
||||
@@ -215,6 +224,7 @@ class _DashboardState extends State<Dashboard> {
|
||||
Widget _buildTiles(
|
||||
BuildContext context,
|
||||
DataService data,
|
||||
DistanceUnitService distanceUnits,
|
||||
double maxWidth,
|
||||
double spacing,
|
||||
) {
|
||||
@@ -229,9 +239,9 @@ class _DashboardState extends State<Dashboard> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
_buildOnThisDayCard(context, data),
|
||||
_buildOnThisDayCard(context, data, distanceUnits),
|
||||
const SizedBox(height: 16),
|
||||
_buildTripsCard(context, data),
|
||||
_buildTripsCard(context, data, distanceUnits),
|
||||
const SizedBox(height: 16),
|
||||
const LatestLocoChangesPanel(expanded: true),
|
||||
],
|
||||
@@ -256,13 +266,13 @@ class _DashboardState extends State<Dashboard> {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
_buildOnThisDayCard(context, data),
|
||||
_buildOnThisDayCard(context, data, distanceUnits),
|
||||
const SizedBox(height: 16),
|
||||
const TopTractionPanel(),
|
||||
const SizedBox(height: 16),
|
||||
const LeaderboardPanel(),
|
||||
const SizedBox(height: 16),
|
||||
_buildTripsCard(context, data),
|
||||
_buildTripsCard(context, data, distanceUnits),
|
||||
const SizedBox(height: 16),
|
||||
const LatestLocoChangesPanel(),
|
||||
],
|
||||
@@ -296,7 +306,8 @@ class _DashboardState extends State<Dashboard> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildOnThisDayCard(BuildContext context, DataService data) {
|
||||
Widget _buildOnThisDayCard(
|
||||
BuildContext context, DataService data, DistanceUnitService distanceUnits) {
|
||||
final filtered = data.onThisDay
|
||||
.where((leg) => leg.beginTime.year != DateTime.now().year)
|
||||
.toList();
|
||||
@@ -329,7 +340,7 @@ class _DashboardState extends State<Dashboard> {
|
||||
: Column(
|
||||
children: [
|
||||
for (int idx = 0; idx < visible.length; idx++) ...[
|
||||
_otdRow(context, visible[idx], textTheme),
|
||||
_otdRow(context, visible[idx], textTheme, distanceUnits),
|
||||
if (idx != visible.length - 1) const Divider(height: 12),
|
||||
],
|
||||
],
|
||||
@@ -337,7 +348,8 @@ class _DashboardState extends State<Dashboard> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _otdRow(BuildContext context, Leg leg, TextTheme textTheme) {
|
||||
Widget _otdRow(BuildContext context, Leg leg, TextTheme textTheme,
|
||||
DistanceUnitService distanceUnits) {
|
||||
final traction = leg.locos;
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
@@ -443,7 +455,7 @@ class _DashboardState extends State<Dashboard> {
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
'${leg.mileage.toStringAsFixed(1)} mi',
|
||||
distanceUnits.format(leg.mileage, decimals: 1),
|
||||
style: textTheme.labelLarge?.copyWith(
|
||||
fontWeight: FontWeight.w800,
|
||||
),
|
||||
@@ -498,7 +510,8 @@ class _DashboardState extends State<Dashboard> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildTripsCard(BuildContext context, DataService data) {
|
||||
Widget _buildTripsCard(
|
||||
BuildContext context, DataService data, DistanceUnitService distanceUnits) {
|
||||
final tripsUnsorted = data.trips;
|
||||
List trips = [];
|
||||
if (tripsUnsorted.isNotEmpty) {
|
||||
@@ -543,7 +556,7 @@ class _DashboardState extends State<Dashboard> {
|
||||
?.copyWith(fontWeight: FontWeight.w700),
|
||||
),
|
||||
Text(
|
||||
'${trip.tripMileage.toStringAsFixed(1)} mi',
|
||||
distanceUnits.format(trip.tripMileage, decimals: 1),
|
||||
style: Theme.of(context).textTheme.labelMedium,
|
||||
),
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user