verifyOTP method
Verify OTP and complete login
Implementation
Future<void> verifyOTP({
required String email,
required String code,
String? tenantId,
}) async {
state = const AsyncValue.loading();
ref.read(otpProvider.notifier).setVerifying();
try {
final client = ref.read(prodobitClientProvider);
final loginResponse = await client.auth.verifyOTP(
email: email,
code: code,
tenantId: tenantId,
);
if (loginResponse.success && loginResponse.data != null) {
ref.read(otpProvider.notifier).setVerified();
// Set current tenant if available
var currentTenantId = tenantId;
if (currentTenantId == null &&
loginResponse.data!.tenantMemberships!.isNotEmpty) {
currentTenantId =
loginResponse.data!.tenantMemberships!.first.tenantId;
}
state = AsyncValue.data(
AuthState.authenticated(loginResponse.data!.user, currentTenantId),
);
} else {
final errorMessage = loginResponse.message ?? 'Verification failed';
ref.read(otpProvider.notifier).setError(errorMessage);
state = AsyncValue.data(AuthState.error(errorMessage));
}
} on AuthException catch (e) {
ref.read(otpProvider.notifier).setError(e.message);
state = AsyncValue.data(AuthState.error(e.message));
} on Exception catch (e) {
final errorMessage = 'OTP verification failed: $e';
ref.read(otpProvider.notifier).setError(errorMessage);
state = AsyncValue.data(AuthState.error(errorMessage));
}
}