@@ -86,41 +86,46 @@ export function FloorDisplay({ floor, announcements: initialAnnouncements }: Pro
8686
8787 // WebSocket connection + heartbeat
8888 useEffect ( ( ) => {
89- const socket : Socket = io ( { path : "/api/socketio" } ) ;
89+ const socket : Socket = io ( {
90+ path : "/api/socketio" ,
91+ reconnectionDelay : 1000 ,
92+ reconnectionDelayMax : 5000 ,
93+ reconnectionAttempts : Infinity ,
94+ } ) ;
95+
96+ const onUpdate = ( ) => {
97+ console . log ( "[display] updating from socket event" ) ;
98+ refreshData ( ) ;
99+ } ;
90100
91101 socket . on ( "connect" , ( ) => {
92- console . log ( `[display] connected on socket ${ socket . id } ` ) ;
102+ console . log ( `[display] socket connected: ${ socket . id } ` ) ;
93103 setConnected ( true ) ;
94104 socket . emit ( "join:floor" , { floorId : floor . id } ) ;
95- refreshData ( ) ; // Catch any updates missed while disconnected
105+ // Immediate refresh when reconnecting
106+ refreshData ( ) ;
96107 } ) ;
97108
98109 socket . on ( "disconnect" , ( ) => {
99- console . log ( "[display] disconnected from server " ) ;
110+ console . log ( "[display] socket disconnected " ) ;
100111 setConnected ( false ) ;
101- } ) ;
102-
103- socket . on ( "announcement:update" , ( ) => {
104- console . log ( "[display] received announcement:update" ) ;
105- refreshData ( ) ;
106- } ) ;
107- socket . on ( "schedule:update" , ( ) => {
108- console . log ( "[display] received schedule:update" ) ;
109- refreshData ( ) ;
110- } ) ;
111- socket . on ( "display:refresh" , ( ) => {
112- console . log ( "[display] received display:refresh" ) ;
112+ // Try to refresh immediately in case it's a temporary disconnect
113113 refreshData ( ) ;
114114 } ) ;
115115
116+ socket . on ( "announcement:update" , onUpdate ) ;
117+ socket . on ( "schedule:update" , onUpdate ) ;
118+ socket . on ( "display:refresh" , onUpdate ) ;
119+
116120 socket . on ( "connect_error" , ( err ) => {
117- console . error ( "[display] socket connection error:" , err ) ;
121+ console . warn ( "[display] socket error:" , err . message ) ;
118122 } ) ;
119123
120- // Send heartbeat every 30s so server knows this node is alive
124+ // Send heartbeat every 30s
121125 const heartbeat = setInterval ( ( ) => {
122126 if ( socket . connected ) {
123127 socket . emit ( "heartbeat" , { floorId : floor . id } ) ;
128+ console . log ( "[display] heartbeat sent" ) ;
124129 }
125130 } , 30_000 ) ;
126131
@@ -130,15 +135,16 @@ export function FloorDisplay({ floor, announcements: initialAnnouncements }: Pro
130135 } ;
131136 } , [ floor . id , refreshData ] ) ;
132137
133- // Fallback refresh every 30s to ensure display updates even if socket fails
138+ // Aggressive fallback: refresh every 10s if no recent update
134139 useEffect ( ( ) => {
135140 const timer = setInterval ( ( ) => {
136141 const timeSinceLastUpdate = Date . now ( ) - lastUpdate ;
137- if ( timeSinceLastUpdate > 25_000 ) {
138- console . log ( "[display] fallback refresh (no socket event for 25s)" ) ;
142+ // Refresh if >8 seconds since last successful update
143+ if ( timeSinceLastUpdate > 8_000 ) {
144+ console . log ( `[display] fallback refresh (${ Math . round ( timeSinceLastUpdate / 1000 ) } s since last update)` ) ;
139145 refreshData ( ) ;
140146 }
141- } , 10_000 ) ; // Check every 10s
147+ } , 3_000 ) ; // Check every 3s (fast and lightweight)
142148 return ( ) => clearInterval ( timer ) ;
143149 } , [ refreshData , lastUpdate ] ) ;
144150
0 commit comments