From 64d5bc391db0e1eebdbc63cd9ef25c12b321c4e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Zatorski?= Date: Fri, 4 Sep 2026 14:59:58 +0200 Subject: [PATCH] Napis o mikrofonie idzie za uprawnieniem, nie za zgloszeniem Interfejs sali mial DWA niezalezne zrodla prawdy o tym, czy uczestnik moze mowic: napis "Masz glos, mikrofon jest wlaczony" bral sie ze stanu ZGLOSZENIA (`speak.granted`), a faktyczny mikrofon z uprawnienia w TOKENIE (`canPublishAudio`). Te dwie rzeczy nie sa tym samym. Prawo do audio daje takze rola ACTIVE_PARTICIPANT, ktora uczestnik dostaje przy wlaczonym trybie "wideo dla wszystkich". Odebranie glosu nie zmienia wtedy uprawnien, ale zmienia stan zgloszenia: napis znikal, a mikrofon zostawal otwarty. Po kilku cyklach nadania i odebrania obraz w panelu rozjezdzal sie z tym, co uczestnik faktycznie moze. Zgloszone z produkcji. Pasek akcji dostaje teraz `canPublishAudio` wprost z tokenu i to ono rozstrzyga o napisie. Gdy glos jest juz przyznany, a token jeszcze nie dotarl, pasek mowi "trwa wlaczanie mikrofonu" zamiast klamac w ktorakolwiek strone. Przycisk "Oddaj glos" zostaje przy zgloszeniu, bo dotyczy wlasnie jego. SLAD DO DIAGNOZY Rozjazd miedzy interfejsem a serwerem jest trudny do zbadania po fakcie: uczestnik zglasza "mikrofon nie dziala", a log serwera pokazuje poprawnie wydany token. Konsola sali wypisuje teraz po kazdej zmianie stan tokenu obok stanu zgloszenia i obu trybow, wiec przy nastepnym zgloszeniu widac, ktora strona jest nieaktualna. To nie jest debugowanie do usuniecia: nigdzie indziej nie widac obu tych rzeczy naraz. Hipoteza o wygasajacym tokenie sprawdzona i ODRZUCONA: TTL to szesc godzin, czyli dluzej niz najdluzszy webinar. Co-Authored-By: Claude Opus 5 --- .../src/pages/public/MeetingActionBar.tsx | 31 +++++++++++++++++-- frontend/src/pages/public/MeetingPage.tsx | 22 +++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/public/MeetingActionBar.tsx b/frontend/src/pages/public/MeetingActionBar.tsx index f8c4080..2a6814a 100644 --- a/frontend/src/pages/public/MeetingActionBar.tsx +++ b/frontend/src/pages/public/MeetingActionBar.tsx @@ -32,6 +32,19 @@ export function MeetingActionBar({ isSpeaker, /** Tryb otwartego mikrofonu: kazdy mowi bez proszenia o glos. */ openMic, + /** + * Faktyczne uprawnienie do mikrofonu, prosto z tokenu wydanego przez backend. + * + * JEDYNE ZRODLO PRAWDY O TYM, CZY UCZESTNIK MOZE MOWIC + * --------------------------------------------------------------------- + * Wczesniej pasek skladal te odpowiedz sam, ze stanu zgloszenia + * (`speak.granted`) i trybu otwartego mikrofonu. Rozjezdzalo sie to + * z rzeczywistoscia, bo prawo do audio daje takze rola ACTIVE_PARTICIPANT + * przy wlaczonym "wideo dla wszystkich": odebranie glosu nie zmienialo wtedy + * uprawnien, ale napis "Masz glos" znikal. Uczestnik widzial zamkniety + * mikrofon przy dzialajacym i odwrotnie. + */ + canPublishAudio, /** * Temat wybrany klikiem w baner. * @@ -46,6 +59,7 @@ export function MeetingActionBar({ speak: ReturnType isSpeaker: boolean openMic: boolean + canPublishAudio: boolean offerTopicFromBanner?: string | null onOfferHandled?: () => void }) { @@ -96,7 +110,7 @@ export function MeetingActionBar({ Możesz mówić bez zgłaszania się ) : ( - + ))} {/* @@ -193,13 +207,24 @@ export function MeetingActionBar({ * oczekiwania, czyli dokladnie ten, w ktorym uczestnik zastanawia sie, * czy zgloszenie w ogole doszlo. */ -function SpeakButton({ speak }: { speak: ReturnType }) { +function SpeakButton({ + speak, + canPublishAudio, +}: { + speak: ReturnType + canPublishAudio: boolean +}) { + /* + * Napis o mikrofonie idzie za UPRAWNIENIEM, a nie za stanem zgloszenia: + * mowi o tym, co uczestnik faktycznie moze, a nie o tym, o co prosil. + * Przycisk "Oddaj glos" zostaje przy zgloszeniu, bo dotyczy wlasnie jego. + */ if (speak.granted) { return (
- Masz głos, mikrofon jest włączony + {canPublishAudio ? 'Masz głos, mikrofon jest włączony' : 'Masz głos, trwa włączanie mikrofonu...'}