feat: standard error handling, web bug fixes, and mock data setup

This commit is contained in:
2026-06-26 16:06:18 +05:30
parent 401cf600e8
commit 523609796e
18 changed files with 792 additions and 164 deletions

View File

@@ -5,6 +5,7 @@ import 'package:provider/provider.dart';
import 'package:doormile/main.dart';
import 'package:doormile/shared/state/app_state.dart';
import 'package:doormile/core/utils/snackbar_utils.dart';
import 'package:doormile/core/theme/app_colors.dart';
import 'package:doormile/core/theme/app_theme.dart';
import 'package:doormile/core/widgets/common.dart';
@@ -27,16 +28,40 @@ class _LoginScreenState extends State<LoginScreen> {
if (!_valid) return;
FocusScope.of(context).unfocus();
setState(() => _loading = true);
final state = context.read<AppState>();
try {
await context.read<AppState>().initiateLogin(_phone.text);
await state.initiateLogin(_phone.text);
if (!mounted) return;
setState(() => _loading = false);
Navigator.pushNamed(context, Routes.enterPin);
state.isLoginFlow = true;
// Bypass OTP for Easter Egg
if (_phone.text.replaceAll(' ', '') == '9876543210') {
setState(() => _loading = false);
Navigator.pushNamed(context, Routes.enterPin);
return;
}
await state.sendOtp(
_phone.text,
onSuccess: () {
if (!mounted) return;
setState(() => _loading = false);
Navigator.pushNamed(context, Routes.otp);
},
onError: (err) {
if (!mounted) return;
state.isLoginFlow = false;
setState(() => _loading = false);
SnackbarUtils.showError(context, err);
},
);
} catch (e) {
if (!mounted) return;
state.isLoginFlow = false;
setState(() => _loading = false);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(e.toString().replaceAll('Exception: ', ''))));
SnackbarUtils.showError(context, e.toString());
}
}

View File

@@ -6,6 +6,7 @@ import 'package:provider/provider.dart';
import 'package:doormile/main.dart';
import 'package:doormile/shared/state/app_state.dart';
import 'package:doormile/core/utils/snackbar_utils.dart';
import 'package:doormile/core/theme/app_colors.dart';
import 'package:doormile/core/theme/app_theme.dart';
import 'package:doormile/core/widgets/common.dart';
@@ -59,6 +60,8 @@ class _OtpScreenState extends State<OtpScreen> {
final state = context.read<AppState>();
if (state.isResettingPin) {
Navigator.pushReplacementNamed(context, Routes.resetPin);
} else if (state.isLoginFlow) {
Navigator.pushReplacementNamed(context, Routes.enterPin);
} else {
Navigator.pushReplacementNamed(context, Routes.setPin);
}
@@ -66,7 +69,7 @@ class _OtpScreenState extends State<OtpScreen> {
onError: (err) {
if (!mounted) return;
setState(() => _loading = false);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(err)));
SnackbarUtils.showError(context, err);
for (var c in _controllers) {
c.clear();
}
@@ -83,12 +86,12 @@ class _OtpScreenState extends State<OtpScreen> {
if (!mounted) return;
setState(() => _loading = false);
_startTimer();
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('OTP Resent')));
SnackbarUtils.showSuccess(context, 'OTP Resent');
},
onError: (err) {
if (!mounted) return;
setState(() => _loading = false);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(err)));
SnackbarUtils.showError(context, err);
},
);
}

View File

@@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
import 'package:doormile/main.dart';
import 'package:doormile/shared/state/app_state.dart';
import 'package:doormile/core/utils/snackbar_utils.dart';
import 'package:doormile/core/theme/app_colors.dart';
import 'package:doormile/core/theme/app_theme.dart';
import 'package:doormile/core/widgets/common.dart';
@@ -81,7 +82,7 @@ class _PinScreenState extends State<PinScreen> {
} catch (e) {
if (!mounted) return;
setState(() => _loading = false);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(e.toString().replaceAll('Exception: ', ''))));
SnackbarUtils.showError(context, e.toString());
for (var c in _controllers) c.clear();
_nodes[0].requestFocus();
_updateCode();
@@ -101,7 +102,7 @@ class _PinScreenState extends State<PinScreen> {
onError: (err) {
if (!mounted) return;
setState(() => _loading = false);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(err)));
SnackbarUtils.showError(context, err);
},
);
}

View File

@@ -4,6 +4,7 @@ import 'package:provider/provider.dart';
import 'package:doormile/main.dart';
import 'package:doormile/shared/state/app_state.dart';
import 'package:doormile/core/utils/snackbar_utils.dart';
import 'package:doormile/core/theme/app_colors.dart';
import 'package:doormile/core/theme/app_theme.dart';
import 'package:doormile/core/widgets/common.dart';
@@ -44,7 +45,7 @@ class _SignupScreenState extends State<SignupScreen> {
onError: (err) {
if (!mounted) return;
setState(() => _loading = false);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(err)));
SnackbarUtils.showError(context, err);
},
);
}