From 6e444e83d04ba6ac7e21ebd3ce5121211b6e18f5 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Sat, 7 Mar 2026 01:24:54 +0100
Subject: [PATCH] fix: Chat-Panel Toggle-Oszillation - nur 1x klicken pro
Versuch, check vor erneutem Klick
Made-with: Cursor
---
src/bot/chatProcedure.ts | 45 +++++++++++++++++++++++++++++-----------
1 file changed, 33 insertions(+), 12 deletions(-)
diff --git a/src/bot/chatProcedure.ts b/src/bot/chatProcedure.ts
index ea2261c..e96b5ec 100644
--- a/src/bot/chatProcedure.ts
+++ b/src/bot/chatProcedure.ts
@@ -125,7 +125,6 @@ export class ChatProcedure {
const chatButtonSelectors = [
'#chat-button',
- 'button[id="chat-button"]',
'button[aria-label="Chat"]',
'button[aria-label*="Chat" i]',
'button[aria-label*="Unterhaltung" i]',
@@ -133,11 +132,21 @@ export class ChatProcedure {
'button[aria-label*="Meeting chat" i]',
];
- // Poll for the chat button (toolbar renders asynchronously after join)
- const maxAttempts = 10;
- const pollIntervalMs = 1500;
+ // Poll for the chat button (toolbar renders asynchronously after join).
+ // IMPORTANT: click only ONCE per attempt, then wait for the panel to appear.
+ // Multiple clicks on the same toggle button would open/close/open/close.
+ const maxAttempts = 12;
+ const pollIntervalMs = 2000;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
+ // Check first - a previous click might have opened it by now
+ if (await this._isChatPanelOpen()) {
+ this._logger.info(`Chat panel detected as open (attempt ${attempt})`);
+ return;
+ }
+
+ // Try to find and click the button (only one click per attempt)
+ let clicked = false;
for (const selector of chatButtonSelectors) {
try {
const button = await this._page.$(selector);
@@ -145,23 +154,35 @@ export class ChatProcedure {
const isVisible = await button.isVisible().catch(() => false);
if (!isVisible) continue;
await button.click();
- this._logger.info(`Opened chat panel via: ${selector} (attempt ${attempt}/${maxAttempts})`);
- await this._page.waitForTimeout(1500);
- if (await this._isChatPanelOpen()) return;
- this._logger.info(`Clicked ${selector} but panel not detected as open yet`);
+ clicked = true;
+ this._logger.info(`Clicked chat button: ${selector} (attempt ${attempt}/${maxAttempts})`);
+ break;
}
} catch {
- // Continue
+ // Continue to next selector
}
}
- if (attempt < maxAttempts) {
- this._logger.info(`Chat button not found yet, retry ${attempt}/${maxAttempts} in ${pollIntervalMs}ms`);
+ if (clicked) {
+ // Wait for panel to render after click
+ await this._page.waitForTimeout(2500);
+ if (await this._isChatPanelOpen()) {
+ this._logger.info('Chat panel opened successfully');
+ return;
+ }
+ // Panel didn't open despite click - DON'T click again immediately,
+ // wait for next attempt cycle (avoids toggle oscillation)
+ this._logger.info('Chat button clicked but panel not detected yet, waiting before next attempt');
await this._page.waitForTimeout(pollIntervalMs);
+ } else {
+ if (attempt < maxAttempts) {
+ this._logger.info(`Chat button not found, retry ${attempt}/${maxAttempts}`);
+ await this._page.waitForTimeout(pollIntervalMs);
+ }
}
}
- this._logger.warn('Could not find chat button after polling - chat will not work');
+ this._logger.warn('Could not open chat panel after polling - chat will not work');
}
/**