fix: streamline WhatsApp login flow
parent
383097a03a
commit
98891103d0
|
|
@ -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") {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue