flagged bugs fix

This commit is contained in:
Suriya
2026-07-23 11:11:25 +05:30
parent 842c2307d0
commit 6c7d656de5
11 changed files with 305 additions and 94 deletions

View File

@@ -78,7 +78,6 @@ class AppState extends ChangeNotifier {
String? pendingEmail;
String? authToken;
bool isResettingPin = false;
bool isLoginFlow = false;
String? _deviceToken;
AppState() {
@@ -127,52 +126,103 @@ class AppState extends ChangeNotifier {
notifyListeners();
}
/// Sends a 6-digit OTP to [phoneNumber] via Firebase Phone Auth.
Future<void> sendOtp(String phoneNumber, {String? firstName, String? email, bool resetPin = false, required Function onSuccess, required Function(String) onError}) async {
final fullPhone = '+91${phoneNumber.replaceAll(' ', '')}';
setPhone(phoneNumber);
pendingFirstName = firstName;
pendingEmail = email;
pendingFirstName = firstName ?? pendingFirstName;
pendingEmail = email ?? pendingEmail;
isResettingPin = resetPin;
if (email == null || email.isEmpty) {
onError('Email address is required for verification.');
final rawPhone = phoneNumber.replaceAll(' ', '');
if (rawPhone.length != 10) {
onError('A valid mobile number is required for verification.');
return;
}
final fullPhone = '+91$rawPhone';
if (kIsWeb) {
debugPrint('[OTP Service] Web build: bypassing Firebase OTP (mocking success)');
Future.delayed(const Duration(seconds: 1), () {
verificationId = 'mock_verification_id_$fullPhone';
onSuccess();
});
return;
}
try {
final res = await http.post(
Uri.parse(ApiConstants.sendEmailOtp),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({"email": email, "phone": fullPhone}),
debugPrint('[OTP Service] Initiating Firebase phone verification for $fullPhone');
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: fullPhone,
verificationCompleted: (PhoneAuthCredential credential) async {
debugPrint('[OTP Service] Verification completed automatically');
try {
await FirebaseAuth.instance.signInWithCredential(credential);
} catch (e) {
debugPrint('[OTP Service] Error signing in: $e');
}
},
verificationFailed: (FirebaseAuthException e) {
debugPrint('[OTP Service] Verification failed: ${e.code} - ${e.message}');
onError(e.message ?? 'Failed to send verification code.');
},
codeSent: (String vId, int? resendToken) {
debugPrint('[OTP Service] Code sent. Verification ID: $vId');
verificationId = vId;
onSuccess();
},
codeAutoRetrievalTimeout: (String vId) {
debugPrint('[OTP Service] Auto retrieval timeout. Verification ID: $vId');
verificationId = vId;
},
);
if (res.statusCode >= 200 && res.statusCode < 300) {
onSuccess();
} else {
final body = jsonDecode(res.body);
onError(body['message'] ?? 'Failed to send verification code.');
}
} catch (e) {
onError('Error: $e');
debugPrint('[OTP Service] Exception during OTP request: $e');
onError('Error sending verification code: $e');
}
}
Future<void> verifyOtp(String smsCode, {required Function onSuccess, required Function(String) onError}) async {
try {
final res = await http.post(
Uri.parse(ApiConstants.verifyEmailOtp),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({"email": pendingEmail, "otp": smsCode}),
);
/// Debug-only tester shortcut: if `smsDefaultProvider`/`smsPassKey` are set
/// in SharedPreferences, that fixed passkey is accepted instead of the real
/// OTP. `kDebugMode` means this branch is compiled out of release builds
/// entirely, so it can never ship as a bypass.
Future<bool> _checkDebugBypass(String smsCode) async {
if (!kDebugMode) return false;
final prefs = await SharedPreferences.getInstance();
final provider = prefs.getInt('smsDefaultProvider') ?? 0;
final passKey = prefs.getInt('smsPassKey');
return provider == 1 && passKey != null && smsCode == passKey.toString().padLeft(6, '0');
}
if (res.statusCode >= 200 && res.statusCode < 300) {
Future<void> verifyOtp(String smsCode, {required Function onSuccess, required Function(String) onError}) async {
if (await _checkDebugBypass(smsCode)) {
onSuccess();
return;
}
if (verificationId == null) {
onError('Verification ID is missing. Please resend OTP.');
return;
}
if (kIsWeb) {
debugPrint('[OTP Service] Web build: bypassing Firebase OTP verification (mocking success)');
if (smsCode.length == 6) {
onSuccess();
} else {
final body = jsonDecode(res.body);
onError(body['message'] ?? 'Invalid verification code.');
onError('Invalid mock OTP code (must be 6 digits).');
}
return;
}
try {
final credential = PhoneAuthProvider.credential(
verificationId: verificationId!,
smsCode: smsCode,
);
await FirebaseAuth.instance.signInWithCredential(credential);
onSuccess();
} catch (e) {
onError('Error: $e');
onError('Invalid verification code.');
}
}
@@ -317,7 +367,6 @@ class AppState extends ChangeNotifier {
void login() {
isLoggedIn = true;
isLoginFlow = false;
orders.clear();
savedAddresses.clear();
_saveSession();
@@ -333,7 +382,6 @@ class AppState extends ChangeNotifier {
verificationId = null;
pendingFirstName = null;
pendingEmail = null;
isLoginFlow = false;
orders.clear();
savedAddresses.clear();
notifyListeners();
@@ -517,6 +565,8 @@ class AppState extends ChangeNotifier {
"deliverypincode": draft.dropPincode,
"deliveryaddress": draft.dropAddress,
"serviceoption": draft.service,
"contactname": draft.contactName,
"contactmobile": draft.contactMobile,
"parcels": [
{
"itemcategory": backendCategory,