waitForInChat function

Future<bool> waitForInChat(
  1. WpClientInterface wpClient
)

Implementation

Future<bool> waitForInChat(WpClientInterface wpClient) async {
  final wppAuth = WppAuth(wpClient);
  final readyCompleter = Completer<bool>();
  var startTime = DateTime.now();
  int seconds = 0;
  bool reloaded = false;

  // Listen for the ready event to complete immediately
  wpClient.on(WhatsappEvent.connmainready, (_) {
    if (!readyCompleter.isCompleted) readyCompleter.complete(true);
  });

  // Fast-track if already ready
  if (await wppAuth.isMainReady()) {
    wpClient.off(WhatsappEvent.connmainready);
    return true;
  }

  try {
    // Polling as a fallback and for status updates
    Timer.periodic(const Duration(seconds: 1), (timer) async {
      if (readyCompleter.isCompleted) {
        timer.cancel();
        return;
      }

      seconds = DateTime.now().difference(startTime).inSeconds;

      if (seconds >= 120) {
        if (!readyCompleter.isCompleted) readyCompleter.complete(false);
        timer.cancel();
        return;
      }

      try {
        if (await wppAuth.isMainReady()) {
          if (!readyCompleter.isCompleted) readyCompleter.complete(true);
          return;
        }

        final isLoaded = await wppAuth.isMainLoaded();
        final isSynced = await wppAuth.isSynced();

        // If loaded and synced, or loaded and wait for a short period (10s instead of 25s)
        if (isLoaded && (isSynced || seconds > 10)) {
          WhatsappLogger.log(
              "Main identity ready (Early via Loaded: $isLoaded, Synced: $isSynced)");
          if (!readyCompleter.isCompleted) readyCompleter.complete(true);
          return;
        }

        if (seconds > 70 && !reloaded) {
          WhatsappLogger.log(
              "Connection seems stuck. Attempting a page reload for recovery...");
          await wpClient.reload();
          reloaded = true;
          // Reset timer after reload
          startTime = DateTime.now();
          await Future.delayed(const Duration(seconds: 5));
          await WppConnect.init(wpClient);
        }

        if (seconds % 10 == 0) {
          final isAuth = await wppAuth.isAuthenticated();
          if (!isAuth) {
            WhatsappLogger.log("Authentication lost while waiting for main.");
            if (!readyCompleter.isCompleted) readyCompleter.complete(false);
            return;
          }
          WhatsappLogger.log(
              "Waiting for main ready... (Auth: OK, Loaded: $isLoaded, Synced: $isSynced, Time: $seconds/120s)");
        }
      } catch (e) {
        // Silent error in loop
      }
    });

    return await readyCompleter.future;
  } finally {
    wpClient.off(WhatsappEvent.connmainready);
  }
}