QoL changes
All checks were successful
Release / meta (push) Successful in 22s
Release / linux-build (push) Successful in 4m32s
Release / android-build (push) Successful in 7m10s
Release / release-dev (push) Successful in 9s
Release / release-master (push) Successful in 9s

This commit is contained in:
2025-12-14 09:45:32 +00:00
parent 8116cfe7b1
commit f0dfbd185b
11 changed files with 887 additions and 321 deletions

View File

@@ -7,15 +7,24 @@ import 'package:mileograph_flutter/services/authservice.dart';
import 'package:mileograph_flutter/services/dataService.dart';
import 'package:provider/provider.dart';
class Dashboard extends StatelessWidget {
class Dashboard extends StatefulWidget {
const Dashboard({super.key});
@override
State<Dashboard> createState() => _DashboardState();
}
class _DashboardState extends State<Dashboard> {
bool _showAllOnThisDay = false;
@override
Widget build(BuildContext context) {
final data = context.watch<DataService>();
final auth = context.watch<AuthService>();
final stats = data.homepageStats;
final isInitialLoading = data.isHomepageLoading || stats == null;
return RefreshIndicator(
onRefresh: () async {
await data.fetchHomepageStats();
@@ -34,32 +43,53 @@ class Dashboard extends StatelessWidget {
currentYearMileage: data.getMileageForCurrentYear(),
trips: data.trips.length,
);
return ListView(
padding: const EdgeInsets.all(16),
return Stack(
children: [
_buildHeader(context, auth, stats, data.isHomepageLoading),
const SizedBox(height: 12),
Wrap(spacing: 12, runSpacing: 12, children: metricChips),
const SizedBox(height: 16),
isWide
? Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: _buildMainColumn(context, data)),
const SizedBox(width: 16),
SizedBox(
width: 360,
child: _buildSidebar(context, data),
ListView(
padding: const EdgeInsets.all(16),
children: [
_buildHeader(context, auth, stats, data.isHomepageLoading),
const SizedBox(height: 12),
Wrap(spacing: 12, runSpacing: 12, children: metricChips),
const SizedBox(height: 16),
isWide
? Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: _buildMainColumn(context, data)),
const SizedBox(width: 16),
SizedBox(
width: 360,
child: _buildSidebar(context, data),
),
],
)
: Column(
children: [
_buildMainColumn(context, data),
const SizedBox(height: 16),
_buildSidebar(context, data),
],
),
],
)
: Column(
children: [
_buildMainColumn(context, data),
const SizedBox(height: 16),
_buildSidebar(context, data),
],
],
),
if (isInitialLoading)
Positioned.fill(
child: Container(
color:
Theme.of(context).colorScheme.surface.withOpacity(0.7),
child: const Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
CircularProgressIndicator(),
SizedBox(height: 12),
Text('Loading dashboard data...'),
],
),
),
),
),
],
);
},
@@ -153,6 +183,17 @@ class Dashboard extends StatelessWidget {
_buildCard(
context,
title: 'On this day',
action: data.onThisDay
.where((leg) => leg.beginTime.year != DateTime.now().year)
.length >
5
? TextButton(
onPressed: () => setState(() {
_showAllOnThisDay = !_showAllOnThisDay;
}),
child: Text(_showAllOnThisDay ? 'Show less' : 'Show more'),
)
: null,
trailing: data.isOnThisDayLoading
? const SizedBox(
height: 18,
@@ -163,6 +204,7 @@ class Dashboard extends StatelessWidget {
child: _buildLegList(
context,
data.onThisDay,
showAll: _showAllOnThisDay,
emptyMessage: 'No historical moves for today yet.',
),
),
@@ -231,12 +273,17 @@ class Dashboard extends StatelessWidget {
BuildContext context,
List<Leg> legs, {
required String emptyMessage,
bool showAll = false,
}) {
if (legs.isEmpty) {
final filtered = legs
.where((leg) => leg.beginTime.year != DateTime.now().year)
.toList();
if (filtered.isEmpty) {
return Text(emptyMessage, style: Theme.of(context).textTheme.bodyMedium);
}
final toShow = showAll ? filtered : filtered.take(5).toList();
return Column(
children: legs.take(5).map((leg) {
children: toShow.map((leg) {
return ListTile(
dense: true,
contentPadding: EdgeInsets.zero,