environment_monitoring_app/lib/home_page.dart

209 lines
6.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:environment_monitoring_app/auth_provider.dart';
import 'package:environment_monitoring_app/collapsible_sidebar.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool _isSidebarCollapsed = true;
String _currentSelectedRoute = '/home';
@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthProvider>(context);
final colorScheme = Theme.of(context).colorScheme;
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(_isSidebarCollapsed ? Icons.menu : Icons.close, color: Colors.white),
onPressed: () {
setState(() {
_isSidebarCollapsed = !_isSidebarCollapsed;
});
},
),
title: const Text("Environment Monitoring"),
actions: [
IconButton(
icon: const Icon(Icons.person),
onPressed: () {
Navigator.pushNamed(context, '/profile');
},
),
],
),
body: Row(
children: [
CollapsibleSidebar(
isCollapsed: _isSidebarCollapsed,
onToggle: () {
setState(() {
_isSidebarCollapsed = !_isSidebarCollapsed;
});
},
onNavigate: (route) {
setState(() {
_currentSelectedRoute = route;
});
Navigator.pushNamed(context, route);
},
),
Expanded(
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Welcome, ${auth.userEmail ?? 'User'}",
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
color: colorScheme.onBackground,
),
),
const SizedBox(height: 8),
Text(
"Select a Department:",
style: Theme.of(context).textTheme.titleSmall?.copyWith(
fontWeight: FontWeight.w600,
color: colorScheme.onBackground,
),
),
const SizedBox(height: 8),
Expanded(
child: GridView.count(
crossAxisCount: 2,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
childAspectRatio: 1.6, // Wider and much shorter boxes
padding: EdgeInsets.zero, // No extra padding
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
children: [
_buildMiniCategoryCard(
context,
title: "Air",
icon: Icons.air,
color: Colors.blue.shade700,
route: '/air/home',
),
_buildMiniCategoryCard(
context,
title: "River",
icon: Icons.water,
color: Colors.teal.shade700,
route: '/river/home',
),
_buildMiniCategoryCard(
context,
title: "Marine",
icon: Icons.sailing,
color: Colors.indigo.shade700,
route: '/marine/home',
),
_buildMiniSettingsCard(context),
],
),
),
],
),
),
),
],
),
);
}
Widget _buildMiniCategoryCard(
BuildContext context, {
required String title,
required IconData icon,
required Color color,
required String route,
}) {
return Card(
elevation: 1,
margin: EdgeInsets.zero,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
child: InkWell(
borderRadius: BorderRadius.circular(6),
onTap: () => Navigator.pushNamed(context, route),
child: Container(
padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [color.withOpacity(0.9), color],
),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(icon, size: 26, color: Colors.white),
const SizedBox(height: 4),
Text(
title,
style: const TextStyle(
color: Colors.white,
fontSize: 13,
fontWeight: FontWeight.bold,
),
),
],
),
),
),
);
}
Widget _buildMiniSettingsCard(BuildContext context) {
return Card(
elevation: 1,
margin: EdgeInsets.zero,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6),
),
child: InkWell(
borderRadius: BorderRadius.circular(6),
onTap: () => Navigator.pushNamed(context, '/settings'),
child: Container(
padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Colors.grey.shade700, Colors.grey.shade800],
),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.settings, size: 26, color: Colors.white),
const SizedBox(height: 4),
const Text(
"Settings",
style: TextStyle(
color: Colors.white,
fontSize: 13,
fontWeight: FontWeight.bold,
),
),
],
),
),
),
);
}
}