QoL changes
All checks were successful
All checks were successful
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user