Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 10 additions & 11 deletions lib/screens/auth/forgot_password_screen.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:ell_ena/utils/app_error_handler.dart';
import '../../widgets/custom_widgets.dart';
import '../../services/navigation_service.dart';
import '../../services/supabase_service.dart';
Expand Down Expand Up @@ -58,18 +59,16 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> {
if (mounted) {
// Show user-friendly error message
setState(() {
String errorMsg = 'An error occurred. Please try again.';

// Parse the error message to be more user-friendly
if (e.toString().contains('Invalid email')) {
errorMsg = 'Invalid email address';
} else if (e.toString().contains('Email not found')) {
errorMsg = 'Email address not found';
} else if (e.toString().contains('Rate limit')) {
errorMsg = 'Too many attempts. Please try again later.';
final raw = e.toString();
if (raw.contains('Invalid email')) {
_errorMessage = 'Invalid email address';
} else if (raw.contains('Email not found')) {
_errorMessage = 'Email address not found';
} else if (raw.contains('Rate limit')) {
_errorMessage = 'Too many attempts. Please try again later.';
} else {
_errorMessage = AppErrorHandler.messageFor(e);
}

_errorMessage = errorMsg;
});
}
} finally {
Expand Down
29 changes: 11 additions & 18 deletions lib/screens/auth/login_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import '../home/home_screen.dart';
import 'signup_screen.dart';
import 'forgot_password_screen.dart';
import 'team_selection_dialog.dart';
import 'package:ell_ena/utils/app_error_handler.dart';

class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
Expand Down Expand Up @@ -94,14 +95,12 @@ class _LoginScreenState extends State<LoginScreen>
backgroundColor: Colors.red,
),
);
} catch (_) {
} catch (e) {
if (!mounted) return;

ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Connection error. Please try again.'),
backgroundColor: Colors.red,
),
AppErrorHandler.showSnackBar(
context,
e,
fallback: 'Unable to sign in. Please try again.',
);
} finally {
if (mounted) {
Expand Down Expand Up @@ -133,22 +132,16 @@ class _LoginScreenState extends State<LoginScreen>
NavigationService().navigateToReplacement(const HomeScreen());
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(result['error'] ?? 'Google sign-in failed'),
backgroundColor: Colors.red,
),
AppErrorHandler.showSnackBar(
context,
result['error'],
fallback: 'Google sign-in failed',
);
}
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error: $e'),
backgroundColor: Colors.red,
),
);
AppErrorHandler.showSnackBar(context, e);
}
} finally {
if (mounted) {
Expand Down
3 changes: 2 additions & 1 deletion lib/screens/auth/set_new_password_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import '../../widgets/custom_widgets.dart';
import '../../services/navigation_service.dart';
import '../../services/supabase_service.dart';
import 'login_screen.dart';
import 'package:ell_ena/utils/app_error_handler.dart';

class SetNewPasswordScreen extends StatefulWidget {
final String email;
Expand Down Expand Up @@ -67,7 +68,7 @@ class _SetNewPasswordScreenState extends State<SetNewPasswordScreen> {
}
} catch (e) {
setState(() {
_errorMessage = e.toString();
_errorMessage = AppErrorHandler.messageFor(e);
});
} finally {
if (mounted) {
Expand Down
25 changes: 8 additions & 17 deletions lib/screens/auth/signup_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import '../home/home_screen.dart';
import 'login_screen.dart';
import 'verify_otp_screen.dart';
import 'team_selection_dialog.dart';
import 'package:ell_ena/utils/app_error_handler.dart';

class SignupScreen extends StatefulWidget {
const SignupScreen({super.key});
Expand Down Expand Up @@ -84,9 +85,7 @@ class _SignupScreenState extends State<SignupScreen>
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.toString()), backgroundColor: Colors.red),
);
AppErrorHandler.showSnackBar(context, e);
}
} finally {
if (mounted) {
Expand Down Expand Up @@ -146,9 +145,7 @@ class _SignupScreenState extends State<SignupScreen>
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.toString()), backgroundColor: Colors.red),
);
AppErrorHandler.showSnackBar(context, e);
}
} finally {
if (mounted) {
Expand Down Expand Up @@ -180,22 +177,16 @@ class _SignupScreenState extends State<SignupScreen>
NavigationService().navigateToReplacement(const HomeScreen());
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(result['error'] ?? 'Google sign-in failed'),
backgroundColor: Colors.red,
),
AppErrorHandler.showSnackBar(
context,
result['error'],
fallback: 'Google sign-in failed',
);
}
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error: $e'),
backgroundColor: Colors.red,
),
);
AppErrorHandler.showSnackBar(context, e);
}
} finally {
if (mounted) {
Expand Down
33 changes: 11 additions & 22 deletions lib/screens/auth/team_selection_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import '../../services/supabase_service.dart';
import '../../services/navigation_service.dart';
import '../../widgets/custom_widgets.dart';
import '../home/home_screen.dart';
import 'package:ell_ena/utils/app_error_handler.dart';

class TeamSelectionDialog extends StatefulWidget {
final String userEmail;
Expand Down Expand Up @@ -53,22 +54,16 @@ class _TeamSelectionDialogState extends State<TeamSelectionDialog> {
Navigator.of(context).pop();
NavigationService().navigateToReplacement(const HomeScreen());
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(result['error'] ?? 'Failed to join team'),
backgroundColor: Colors.red,
),
AppErrorHandler.showSnackBar(
context,
result['error'],
fallback: 'Failed to join team',
);
}
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error: $e'),
backgroundColor: Colors.red,
),
);
AppErrorHandler.showSnackBar(context, e);
}
} finally {
if (mounted) {
Expand All @@ -95,22 +90,16 @@ class _TeamSelectionDialogState extends State<TeamSelectionDialog> {
// Show team ID dialog
_showTeamIdDialog(result['teamId']);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(result['error'] ?? 'Failed to create team'),
backgroundColor: Colors.red,
),
AppErrorHandler.showSnackBar(
context,
result['error'],
fallback: 'Failed to create team',
);
}
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Error: $e'),
backgroundColor: Colors.red,
),
);
AppErrorHandler.showSnackBar(context, e);
}
} finally {
if (mounted) {
Expand Down
66 changes: 32 additions & 34 deletions lib/screens/auth/verify_otp_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import '../../services/navigation_service.dart';
import '../../services/supabase_service.dart';
import '../home/home_screen.dart';
import '../auth/set_new_password_screen.dart';
import 'package:ell_ena/utils/app_error_handler.dart';

class VerifyOTPScreen extends StatefulWidget {
final String email;
Expand Down Expand Up @@ -136,14 +137,17 @@ class _VerifyOTPScreenState extends State<VerifyOTPScreen> {
}
} else {
setState(() {
String errorMsg = result['error'] ?? 'Verification failed';
String errorMsg = AppErrorHandler.messageFor(
result['error'],
fallback: 'Verification failed',
);

// Make the error message more user-friendly
if (errorMsg.contains('expired') ||
errorMsg.contains('otp_expired')) {
// Make OTP failures more specific when we can detect them
final raw = (result['error'] ?? '').toString().toLowerCase();
if (raw.contains('expired') || raw.contains('otp_expired')) {
errorMsg =
'Verification code has expired or invalid. Please request a new code.';
} else if (errorMsg.contains('invalid')) {
} else if (raw.contains('invalid')) {
errorMsg = 'Invalid verification code. Please try again.';
}

Expand All @@ -153,20 +157,15 @@ class _VerifyOTPScreenState extends State<VerifyOTPScreen> {
}
} catch (e) {
setState(() {
String errorMsg = e.toString();

// Make the error message more user-friendly
if (errorMsg.contains('expired') ||
errorMsg.contains('otp_expired')) {
errorMsg =
final raw = e.toString().toLowerCase();
if (raw.contains('expired') || raw.contains('otp_expired')) {
_errorMessage =
'Verification code has expired. Please request a new code.';
} else if (errorMsg.contains('invalid')) {
errorMsg = 'Invalid verification code. Please try again.';
} else if (raw.contains('invalid')) {
_errorMessage = 'Invalid verification code. Please try again.';
} else {
errorMsg = 'An error occurred. Please try again.';
_errorMessage = AppErrorHandler.messageFor(e);
}

_errorMessage = errorMsg;
});
_showErrorSnackBar(_errorMessage!);
} finally {
Expand Down Expand Up @@ -210,13 +209,16 @@ class _VerifyOTPScreenState extends State<VerifyOTPScreen> {
);
} else {
setState(() {
String errorMsg = result['error'] ?? 'Failed to resend code';
String errorMsg = AppErrorHandler.messageFor(
result['error'],
fallback: 'Failed to resend code',
);

// Make the error message more user-friendly
if (errorMsg.contains('Rate limit')) {
final raw = (result['error'] ?? '').toString();
if (raw.contains('Rate limit')) {
errorMsg = 'Too many attempts. Please try again later.';
} else if (errorMsg.contains('not found') ||
errorMsg.contains('Invalid email')) {
} else if (raw.contains('not found') ||
raw.contains('Invalid email')) {
errorMsg = 'Email address not found or invalid.';
}

Expand All @@ -226,21 +228,17 @@ class _VerifyOTPScreenState extends State<VerifyOTPScreen> {
}
} catch (e) {
setState(() {
String errorMsg = e.toString();

// Make the error message more user-friendly
if (errorMsg.contains('Rate limit')) {
errorMsg = 'Too many attempts. Please try again later.';
} else if (errorMsg.contains('not found') ||
errorMsg.contains('Invalid email')) {
errorMsg = 'Email address not found or invalid.';
} else if (errorMsg.contains('Assertion failed')) {
errorMsg = 'Unable to resend code. Please go back and try again.';
final raw = e.toString();
if (raw.contains('Rate limit')) {
_errorMessage = 'Too many attempts. Please try again later.';
} else if (raw.contains('not found') || raw.contains('Invalid email')) {
_errorMessage = 'Email address not found or invalid.';
} else if (raw.contains('Assertion failed')) {
_errorMessage =
'Unable to resend code. Please go back and try again.';
} else {
errorMsg = 'An error occurred. Please try again.';
_errorMessage = AppErrorHandler.messageFor(e);
}

_errorMessage = errorMsg;
});
_showErrorSnackBar(_errorMessage!);
} finally {
Expand Down
Loading