fix: streamline WhatsApp login flow

main
Peter Steinberger 2025-12-21 00:59:02 +01:00
parent 383097a03a
commit 98891103d0
3 changed files with 20 additions and 7 deletions

View File

@ -84,12 +84,6 @@ struct ConnectionsSettings: View {
.buttonStyle(.bordered) .buttonStyle(.bordered)
.disabled(self.store.whatsappBusy) .disabled(self.store.whatsappBusy)
Button("Wait for scan") {
Task { await self.store.waitWhatsAppLogin() }
}
.buttonStyle(.bordered)
.disabled(self.store.whatsappBusy)
Spacer() Spacer()
Button("Logout") { Button("Logout") {

View File

@ -158,10 +158,11 @@ final class ConnectionsStore {
} }
} }
func startWhatsAppLogin(force: Bool) async { func startWhatsAppLogin(force: Bool, autoWait: Bool = true) async {
guard !self.whatsappBusy else { return } guard !self.whatsappBusy else { return }
self.whatsappBusy = true self.whatsappBusy = true
defer { self.whatsappBusy = false } defer { self.whatsappBusy = false }
var shouldAutoWait = false
do { do {
let params: [String: AnyCodable] = [ let params: [String: AnyCodable] = [
"force": AnyCodable(force), "force": AnyCodable(force),
@ -174,12 +175,16 @@ final class ConnectionsStore {
self.whatsappLoginMessage = result.message self.whatsappLoginMessage = result.message
self.whatsappLoginQrDataUrl = result.qrDataUrl self.whatsappLoginQrDataUrl = result.qrDataUrl
self.whatsappLoginConnected = nil self.whatsappLoginConnected = nil
shouldAutoWait = autoWait && result.qrDataUrl != nil
} catch { } catch {
self.whatsappLoginMessage = error.localizedDescription self.whatsappLoginMessage = error.localizedDescription
self.whatsappLoginQrDataUrl = nil self.whatsappLoginQrDataUrl = nil
self.whatsappLoginConnected = nil self.whatsappLoginConnected = nil
} }
await self.refresh(probe: true) await self.refresh(probe: true)
if shouldAutoWait {
Task { await self.waitWhatsAppLogin() }
}
} }
func waitWhatsAppLogin(timeoutMs: Int = 120_000) async { func waitWhatsAppLogin(timeoutMs: Int = 120_000) async {

View File

@ -1,5 +1,7 @@
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import { DisconnectReason } from "@whiskeysockets/baileys";
import { danger, info, success } from "../globals.js"; import { danger, info, success } from "../globals.js";
import { logInfo } from "../logger.js"; import { logInfo } from "../logger.js";
import { defaultRuntime, type RuntimeEnv } from "../runtime.js"; import { defaultRuntime, type RuntimeEnv } from "../runtime.js";
@ -7,6 +9,8 @@ import { renderQrPngBase64 } from "./qr-image.js";
import { import {
createWaSocket, createWaSocket,
formatError, formatError,
getStatusCode,
logoutWeb,
readWebSelfId, readWebSelfId,
waitForWaConnection, waitForWaConnection,
webAuthExists, webAuthExists,
@ -22,6 +26,7 @@ type ActiveLogin = {
qrDataUrl?: string; qrDataUrl?: string;
connected: boolean; connected: boolean;
error?: string; error?: string;
errorStatus?: number;
waitPromise: Promise<void>; waitPromise: Promise<void>;
}; };
@ -127,6 +132,7 @@ export async function startWebLoginWithQr(
.catch((err) => { .catch((err) => {
if (activeLogin?.id === login.id) { if (activeLogin?.id === login.id) {
activeLogin.error = formatError(err); activeLogin.error = formatError(err);
activeLogin.errorStatus = getStatusCode(err);
} }
}); });
@ -186,6 +192,14 @@ export async function waitForWebLogin(
} }
if (login.error) { if (login.error) {
if (login.errorStatus === DisconnectReason.loggedOut) {
await logoutWeb(runtime);
const message =
"WhatsApp reported the session is logged out. Cleared cached web session; please scan a new QR.";
await resetActiveLogin(message);
runtime.log(danger(message));
return { connected: false, message };
}
const message = `WhatsApp login failed: ${login.error}`; const message = `WhatsApp login failed: ${login.error}`;
await resetActiveLogin(message); await resetActiveLogin(message);
runtime.log(danger(message)); runtime.log(danger(message));