197 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:firebase_auth/firebase_auth.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:medora/data/services/navigation_service.dart';
 | |
| import 'package:medora/route/route_names.dart';
 | |
| import 'package:medora/screens/authentication/sign_up_screen.dart';
 | |
| import 'package:medora/widgets/primary_button.dart';
 | |
| 
 | |
| class LaunchScreen extends StatefulWidget {
 | |
|   const LaunchScreen({super.key});
 | |
| 
 | |
|   @override
 | |
|   State<LaunchScreen> createState() => _LaunchScreenState();
 | |
| }
 | |
| 
 | |
| class _LaunchScreenState extends State<LaunchScreen> {
 | |
|   String? selectedUserType;
 | |
| 
 | |
|   @override
 | |
|   void initState() {
 | |
|     super.initState();
 | |
|     _checkAuthenticationState();
 | |
|   }
 | |
| 
 | |
|   void _checkAuthenticationState() {
 | |
|     FirebaseAuth.instance.authStateChanges().listen((user) {
 | |
|       if (user != null) {
 | |
|         if (mounted) {
 | |
|           _fetchProfileAndNavigate(context);
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Scaffold(
 | |
|       body: Container(
 | |
|         decoration: const BoxDecoration(
 | |
|           image: DecorationImage(
 | |
|             image: AssetImage('images/cover-picture.jpg'),
 | |
|             fit: BoxFit.cover,
 | |
|           ),
 | |
|         ),
 | |
|         child: Center(
 | |
|           child: SingleChildScrollView(
 | |
|             padding: const EdgeInsets.all(24.0),
 | |
|             child: Card(
 | |
|               elevation: 4,
 | |
|               shape: RoundedRectangleBorder(
 | |
|                 borderRadius: BorderRadius.circular(16),
 | |
|               ),
 | |
|               child: Padding(
 | |
|                 padding: const EdgeInsets.all(24.0),
 | |
|                 child: _buildUserTypeSelection(context),
 | |
|               ),
 | |
|             ),
 | |
|           ),
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget _buildUserTypeSelection(BuildContext context) {
 | |
|     return Column(
 | |
|       mainAxisSize: MainAxisSize.min,
 | |
|       children: [
 | |
|         const Text(
 | |
|           'Register',
 | |
|           style: TextStyle(
 | |
|             fontSize: 24,
 | |
|             fontWeight: FontWeight.bold,
 | |
|           ),
 | |
|         ),
 | |
|         const SizedBox(height: 16),
 | |
|         const Text(
 | |
|           'Who are you?',
 | |
|           style: TextStyle(
 | |
|             color: Colors.grey,
 | |
|             fontSize: 16,
 | |
|           ),
 | |
|         ),
 | |
|         const SizedBox(height: 24),
 | |
|         _buildSelectionCard(
 | |
|           title: 'Doctor',
 | |
|           description: 'Can organise and approve appointments',
 | |
|           icon: Icons.medical_services,
 | |
|           isSelected: selectedUserType == 'doctor',
 | |
|           onTap: () => setState(() => selectedUserType = 'doctor'),
 | |
|         ),
 | |
|         const SizedBox(height: 12),
 | |
|         _buildSelectionCard(
 | |
|           title: 'Patient',
 | |
|           description: 'Can book appointments',
 | |
|           icon: Icons.person,
 | |
|           isSelected: selectedUserType == 'patient',
 | |
|           onTap: () => setState(() => selectedUserType = 'patient'),
 | |
|         ),
 | |
|         const SizedBox(height: 24),
 | |
|         SizedBox(
 | |
|           width: double.infinity,
 | |
|           child: PrimaryButton(
 | |
|             onPressed: selectedUserType != null ? _navigateToSignUp : null,
 | |
|             text: 'Next',
 | |
|           ),
 | |
|         ),
 | |
|         const SizedBox(height: 16),
 | |
|         Row(
 | |
|           mainAxisAlignment: MainAxisAlignment.center,
 | |
|           children: [
 | |
|             const Text('Already have an account?'),
 | |
|             TextButton(
 | |
|               onPressed: () {
 | |
|                 Navigator.of(context).pushNamed(RouteNames.signIn);
 | |
|               },
 | |
|               child: const Text(
 | |
|                 'Login',
 | |
|                 style: TextStyle(color: Colors.blue),
 | |
|               ),
 | |
|             ),
 | |
|           ],
 | |
|         ),
 | |
|       ],
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Widget _buildSelectionCard({
 | |
|     required String title,
 | |
|     required String description,
 | |
|     required IconData icon,
 | |
|     required bool isSelected,
 | |
|     required VoidCallback onTap,
 | |
|   }) {
 | |
|     return InkWell(
 | |
|       onTap: onTap,
 | |
|       borderRadius: BorderRadius.circular(12),
 | |
|       child: Container(
 | |
|         decoration: BoxDecoration(
 | |
|           border: Border.all(
 | |
|             color: isSelected ? Colors.blue : Colors.grey.shade300,
 | |
|             width: isSelected ? 2 : 1,
 | |
|           ),
 | |
|           borderRadius: BorderRadius.circular(12),
 | |
|           color: isSelected ? Colors.blue.shade50 : Colors.white,
 | |
|         ),
 | |
|         padding: const EdgeInsets.all(16),
 | |
|         child: Row(
 | |
|           children: [
 | |
|             Container(
 | |
|               padding: const EdgeInsets.all(8),
 | |
|               decoration: BoxDecoration(
 | |
|                 color: Colors.blue.shade100,
 | |
|                 borderRadius: BorderRadius.circular(8),
 | |
|               ),
 | |
|               child: Icon(icon, color: Colors.blue, size: 24),
 | |
|             ),
 | |
|             const SizedBox(width: 16),
 | |
|             Expanded(
 | |
|               child: Column(
 | |
|                 crossAxisAlignment: CrossAxisAlignment.start,
 | |
|                 children: [
 | |
|                   Text(
 | |
|                     title,
 | |
|                     style: const TextStyle(
 | |
|                       fontSize: 16,
 | |
|                       fontWeight: FontWeight.w600,
 | |
|                     ),
 | |
|                   ),
 | |
|                   const SizedBox(height: 4),
 | |
|                   Text(
 | |
|                     description,
 | |
|                     style: TextStyle(
 | |
|                       fontSize: 14,
 | |
|                       color: Colors.grey.shade600,
 | |
|                     ),
 | |
|                   ),
 | |
|                 ],
 | |
|               ),
 | |
|             ),
 | |
|           ],
 | |
|         ),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   void _navigateToSignUp() {
 | |
|     Navigator.of(context).push(
 | |
|       MaterialPageRoute(
 | |
|         builder: (context) => const SignUpScreen(),
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   Future<void> _fetchProfileAndNavigate(BuildContext context) async {
 | |
|     await NavigationService.handleUserNavigation(context);
 | |
|   }
 | |
| }
 |