medora-provider/lib/screens/authentication/launch_screen.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);
}
}