125 lines
3.7 KiB
Dart
125 lines
3.7 KiB
Dart
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');
|
|
}
|
|
}
|