diff --git a/creche_app/lib/core/routes.dart b/creche_app/lib/core/routes.dart deleted file mode 100644 index a7407c9..0000000 --- a/creche_app/lib/core/routes.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:supabase_flutter/supabase_flutter.dart'; -import 'auth_provider.dart'; -import '../features/auth/login_screen.dart'; -import '../features/auth/waiting_approval_screen.dart'; -import '../features/splash/splash_screen.dart'; -import '../features/home/home_dashboard.dart'; -import '../features/children/children_list_screen.dart'; -import '../features/children/child_detail_screen.dart'; -import '../features/diary/new_diary_screen.dart'; -import '../features/diary/diary_history_screen.dart'; -import '../features/attendance/attendance_screen.dart'; -import '../features/payments/payments_screen.dart'; -import '../features/announcements/announcements_screen.dart'; -import '../features/chat/chat_list_screen.dart'; -import '../features/chat/chat_screen.dart'; -import '../features/profile/profile_screen.dart'; -import '../features/users/users_management_screen.dart'; -import '../features/settings/settings_screen.dart'; -import '../features/medication/medication_screen.dart'; -import '../features/menu/menu_screen.dart'; - -const _adminRoles = ['principal', 'admin']; -const _staffRoles = ['principal', 'admin', 'teacher', 'staff']; -const _allRoles = ['principal', 'admin', 'teacher', 'staff', 'parent']; - -final goRouterProvider = Provider((ref) { - return GoRouter( - initialLocation: '/splash', - redirect: (context, state) { - final session = Supabase.instance.client.auth.currentSession; - final publicPaths = ['/login', '/splash', '/waiting']; - final isPublic = publicPaths.any((p) => state.fullPath?.startsWith(p) ?? false); - if (session == null && !isPublic) return '/login'; - return null; - }, - routes: [ - GoRoute(path: '/splash', builder: (_, __) => const SplashScreen()), - GoRoute(path: '/login', builder: (_, __) => const LoginScreen()), - GoRoute(path: '/waiting', builder: (_, __) => const WaitingApprovalScreen()), - GoRoute(path: '/home', builder: (_, __) => const HomeDashboard()), - GoRoute(path: '/profile', builder: (_, __) => const ProfileScreen()), - - // ── Todos (incluindo encarregados) ───────────────────── - GoRoute(path: '/chat', builder: (_, __) => const _Guard(roles: _allRoles, child: ChatListScreen())), - GoRoute(path: '/chat/:userId', builder: (_, state) => _Guard( - roles: _allRoles, child: ChatScreen(toUserId: state.pathParameters['userId']!))), - GoRoute(path: '/menu', builder: (_, __) => const _Guard(roles: _allRoles, child: MenuScreen())), - GoRoute(path: '/medication', builder: (_, __) => const _Guard(roles: _allRoles, child: MedicationScreen())), - GoRoute(path: '/announcements', builder: (_, __) => const _Guard(roles: _allRoles, child: AnnouncementsScreen())), - - // ── Staff (educadoras, auxiliares, admins) ───────────── - GoRoute(path: '/children', builder: (_, __) => const _Guard(roles: _staffRoles, child: ChildrenListScreen())), - GoRoute(path: '/child/:id', builder: (_, state) => _Guard( - roles: _staffRoles, child: ChildDetailScreen(id: state.pathParameters['id']!))), - GoRoute(path: '/new-diary', builder: (_, state) => _Guard( - roles: _staffRoles, child: NewDiaryScreen(childId: state.uri.queryParameters['childId']))), - GoRoute(path: '/diary-history/:childId', builder: (_, state) => _Guard( - roles: _staffRoles, child: DiaryHistoryScreen(childId: state.pathParameters['childId']!))), - GoRoute(path: '/attendance', builder: (_, __) => const _Guard(roles: _staffRoles, child: AttendanceScreen())), - - // ── Admin / Principal apenas ─────────────────────────── - GoRoute(path: '/payments', builder: (_, __) => const _Guard(roles: _adminRoles, child: PaymentsScreen())), - GoRoute(path: '/users', builder: (_, __) => const _Guard(roles: _adminRoles, child: UsersManagementScreen())), - GoRoute(path: '/settings', builder: (_, __) => const _Guard(roles: _adminRoles, child: SettingsScreen())), - ], - ); -}); - -class _Guard extends ConsumerWidget { - final List roles; - final Widget child; - const _Guard({required this.roles, required this.child}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final async = ref.watch(currentProfileProvider); - return async.when( - data: (profile) { - if (profile != null && roles.contains(profile.role)) return child; - return Scaffold( - backgroundColor: const Color(0xFF0D1117), - body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon(Icons.lock_outline, color: Color(0xFFE74C3C), size: 64), - const SizedBox(height: 16), - const Text('Acesso Não Autorizado', - style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold)), - const SizedBox(height: 8), - Text('A tua função não tem permissão para esta área.', - style: TextStyle(color: Colors.white.withOpacity(0.4), fontSize: 13)), - const SizedBox(height: 24), - TextButton(onPressed: () => context.go('/home'), - child: const Text('← Voltar ao início', style: TextStyle(color: Color(0xFF4FC3F7)))), - ])), - ); - }, - loading: () => const Scaffold(backgroundColor: Color(0xFF0D1117), - body: Center(child: CircularProgressIndicator(color: Color(0xFF4FC3F7)))), - error: (_, __) => const Scaffold(body: Center(child: Text('Erro'))), - ); - } -}