depor_os/lib/widgets/sidebar/sidebar_widget.dart

126 lines
3.7 KiB
Dart
Raw Permalink Normal View History

2026-03-18 11:47:06 +00:00
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../navigation/app_navigation.dart';
import '../../services/auth_service.dart';
import 'nav_item_tile.dart';
class SidebarWidget extends StatelessWidget {
const SidebarWidget({super.key});
static const double _width = 260;
@override
Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
final currentRoute = GoRouterState.of(context).matchedLocation;
return SizedBox(
width: _width,
child: Material(
color: cs.surfaceContainerLow,
child: Column(
children: [
_SidebarHeader(),
const Divider(height: 1),
Expanded(
child: ListView(
padding: const EdgeInsets.symmetric(vertical: 8),
children: kAdminNavItems
.map((item) => NavItemTile(
item: item,
currentRoute: currentRoute,
))
.toList(),
),
),
const Divider(height: 1),
_SidebarFooter(),
],
),
),
);
}
}
class _SidebarHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
child: Row(
children: [
CircleAvatar(
radius: 20,
backgroundColor: cs.primaryContainer,
child: Icon(Icons.sports, color: cs.onPrimaryContainer, size: 22),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'DeporOS',
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
color: cs.onSurface,
),
),
Text(
'Panel de administración',
style: Theme.of(context).textTheme.labelSmall?.copyWith(
color: cs.onSurfaceVariant,
),
),
],
),
),
],
),
);
}
}
class _SidebarFooter extends StatelessWidget {
@override
Widget build(BuildContext context) {
final cs = Theme.of(context).colorScheme;
return Padding(
padding: const EdgeInsets.all(8),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 1),
child: Material(
color: Colors.transparent,
borderRadius: BorderRadius.circular(12),
child: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () => _logout(context),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Row(
children: [
Icon(Icons.logout, size: 20, color: cs.error),
const SizedBox(width: 12),
Text(
'Salir',
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: cs.error,
fontWeight: FontWeight.w500,
),
),
],
),
),
),
),
),
);
}
Future<void> _logout(BuildContext context) async {
await AuthService().logout();
if (context.mounted) context.go('/login');
}
}