requestOTP method
Request OTP for email login
Implementation
Future<void> requestOTP({
required String email,
String? tenantId,
}) async {
// Don't change auth state during OTP request to prevent widget disposal
// Only use OTP provider for loading state
ref.read(otpProvider.notifier).setRequesting();
try {
final client = ref.read(prodobitClientProvider);
final otpResponse = await client.auth.requestOTP(
email: email,
tenantId: tenantId,
);
if (otpResponse.success) {
// Debug log
print('🔐 OTP request success - checking response type');
print(
'🔐 RequiresTenantSelection: ${otpResponse.requiresTenantSelection}',
);
print('🔐 ExpiresAt: ${otpResponse.expiresAt}');
if (otpResponse.requiresTenantSelection ?? false) {
// User needs to select tenant first - show tenant selection
print('🏢 Multi-tenant user - showing tenant selection');
ref.read(otpProvider.notifier).setTenantSelection(
email,
otpResponse.tenants ?? [],
isNewUser: otpResponse.isNewUser ?? false,
);
} else {
// Single tenant or OTP already sent - show verification screen
print('✅ Single tenant or OTP sent - navigating to verification');
print('🔐 DefaultTenantId: ${otpResponse.defaultTenantId}');
print('🔐 DefaultTenantName: ${otpResponse.defaultTenantName}');
ref.read(otpProvider.notifier).setOTPSent(
email,
otpResponse.expiresAt ??
DateTime.now()
.add(const Duration(minutes: 10))
.toIso8601String(),
otpResponse.defaultTenantId,
otpResponse.defaultTenantName,
);
}
} else {
ref.read(otpProvider.notifier).setError(otpResponse.message);
// Don't change auth state for OTP errors
}
} on AuthException catch (e) {
ref.read(otpProvider.notifier).setError(e.message);
// Don't change auth state for OTP errors
} on Exception catch (e) {
final errorMessage = 'Failed to request OTP: $e';
ref.read(otpProvider.notifier).setError(errorMessage);
// Don't change auth state for OTP errors
}
}