verifyOTP method

Future<void> verifyOTP({
  1. required String email,
  2. required String code,
  3. String? tenantId,
})

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));
  }
}