From b96cf8d07de9b934fd6b90f5707453db1f81c6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Zatorski?= Date: Fri, 4 Sep 2026 13:55:36 +0200 Subject: [PATCH] Panel prowadzenia dociaga stan po ponownym polaczeniu WebSocket nie ma historii: zdarzenie wyslane, gdy panel byl rozlaczony, przepada bezpowrotnie. Panel wracal wiec ze stanem sprzed zerwania i pokazywal go jako aktualny. Zdarzylo sie to realnie: backend zrestartowal sie przy wdrozeniu, uczestnik poprosil o glos w czasie, gdy panel byl rozlaczony, a prowadzacy widzial "Nikt nie prosi o glos" przy zgloszeniu czekajacym juz kilkadziesiat sekund. Zgloszenie pojawilo sie dopiero po odswiezeniu strony. Objaw myli, bo panel wyglada na dzialajacy, a jedyna wskazowka jest znikniecie znacznika "polaczono". Rozlaczenie nie jest sytuacja wyjatkowa: wystarczy restart backendu, chwilowa utrata sieci albo uspienie laptopa. `reconnectDelay` wznawial polaczenie, ale nikt nie dociagal tego, co umknelo w miedzyczasie. `onConnect` odswieza teraz kolejke glosu, czat z pytaniami oraz tryby mikrofonu i wideo. Przy pierwszym polaczeniu jest to zapytanie nadmiarowe, przy kazdym nastepnym jedyne zrodlo prawdy. `refetch` sa pominiete w zaleznosciach efektu swiadomie: TanStack Query daje je stabilne, a dopisanie ich przelaczaloby WebSocket przy kazdym odswiezeniu danych, czyli powodowalo dokladnie ten problem, ktoremu ta zmiana zapobiega. Co-Authored-By: Claude Opus 5 --- .../src/pages/webinars/HostConsolePage.tsx | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/frontend/src/pages/webinars/HostConsolePage.tsx b/frontend/src/pages/webinars/HostConsolePage.tsx index cf332e4..73b6f5e 100644 --- a/frontend/src/pages/webinars/HostConsolePage.tsx +++ b/frontend/src/pages/webinars/HostConsolePage.tsx @@ -172,6 +172,29 @@ export function HostConsolePage() { reconnectDelay: 4000, onConnect: () => { setConnected(true) + + /* + * DOCIAGNIECIE STANU PO KAZDYM POLACZENIU + * + * WebSocket nie ma historii: zdarzenie wyslane, gdy panel byl + * rozlaczony, przepada bezpowrotnie. Przy pierwszym polaczeniu to bez + * znaczenia (dane przyszly zapytaniami), ale przy KAZDYM NASTEPNYM + * panel wracalby ze stanem sprzed zerwania i pokazywal go jako + * aktualny. + * + * Zdarzylo sie to realnie: backend zrestartowal sie przy wdrozeniu, + * uczestnik poprosil o glos w czasie, gdy panel byl rozlaczony, + * a prowadzacy widzial "Nikt nie prosi o glos" przy zgloszeniu + * czekajacym juz kilkadziesiat sekund. Zgloszenie pojawilo sie + * dopiero po odswiezeniu strony. + * + * Rozlaczenie nie jest przy tym sytuacja wyjatkowa: wystarczy restart + * backendu, chwilowa utrata sieci albo uspienie laptopa. + */ + void loadSpeakQueue() + void initial.refetch() + void webinar.refetch() + stomp.subscribe(`/topic/webinars/${id}/moderation`, (message: IMessage) => { const event = JSON.parse(message.body) as { kind: string; payload: InteractionView } apply(event) @@ -236,6 +259,14 @@ export function HostConsolePage() { return () => { void stomp.deactivate() } + /* + * `initial.refetch` i `webinar.refetch` sa POMINIETE w zaleznosciach + * swiadomie. TanStack Query daje je stabilne, a dopisanie ich tutaj + * przelaczaloby WebSocket przy kazdym odswiezeniu danych: polaczenie + * zrywaloby sie samo i gubilo zdarzenia, czyli dokladnie to, czemu ten + * efekt ma zapobiegac. + */ + // eslint-disable-next-line react-hooks/exhaustive-deps }, [id, loadSpeakQueue]) async function act(interactionId: number, action: string, body?: unknown) {