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