requestOTP method

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

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