@@ -47,6 +47,7 @@ export function FloorDisplay({ floor, announcements: initialAnnouncements }: Pro
4747 const [ rooms , setRooms ] = useState ( floor . rooms ) ;
4848 const [ announcements , setAnnouncements ] = useState ( initialAnnouncements ) ;
4949 const [ connected , setConnected ] = useState ( false ) ;
50+ const [ lastUpdate , setLastUpdate ] = useState ( Date . now ( ) ) ;
5051
5152 // Live clock
5253 useEffect ( ( ) => {
@@ -77,8 +78,9 @@ export function FloorDisplay({ floor, announcements: initialAnnouncements }: Pro
7778 } ) )
7879 ) ;
7980 }
80- } catch {
81- // Silent fail — next event will retry
81+ setLastUpdate ( Date . now ( ) ) ;
82+ } catch ( e ) {
83+ console . warn ( "[display] refresh failed:" , e ) ;
8284 }
8385 } , [ floor . id ] ) ;
8486
@@ -87,16 +89,33 @@ export function FloorDisplay({ floor, announcements: initialAnnouncements }: Pro
8789 const socket : Socket = io ( { path : "/api/socketio" } ) ;
8890
8991 socket . on ( "connect" , ( ) => {
92+ console . log ( `[display] connected on socket ${ socket . id } ` ) ;
9093 setConnected ( true ) ;
9194 socket . emit ( "join:floor" , { floorId : floor . id } ) ;
9295 refreshData ( ) ; // Catch any updates missed while disconnected
9396 } ) ;
9497
95- socket . on ( "disconnect" , ( ) => setConnected ( false ) ) ;
98+ socket . on ( "disconnect" , ( ) => {
99+ console . log ( "[display] disconnected from server" ) ;
100+ setConnected ( false ) ;
101+ } ) ;
96102
97- socket . on ( "announcement:update" , refreshData ) ;
98- socket . on ( "schedule:update" , refreshData ) ;
99- socket . on ( "display:refresh" , refreshData ) ;
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" ) ;
113+ refreshData ( ) ;
114+ } ) ;
115+
116+ socket . on ( "connect_error" , ( err ) => {
117+ console . error ( "[display] socket connection error:" , err ) ;
118+ } ) ;
100119
101120 // Send heartbeat every 30s so server knows this node is alive
102121 const heartbeat = setInterval ( ( ) => {
@@ -111,11 +130,17 @@ export function FloorDisplay({ floor, announcements: initialAnnouncements }: Pro
111130 } ;
112131 } , [ floor . id , refreshData ] ) ;
113132
114- // Auto- refresh every 5 minutes as fallback
133+ // Fallback refresh every 30s to ensure display updates even if socket fails
115134 useEffect ( ( ) => {
116- const timer = setInterval ( refreshData , 5 * 60 * 1000 ) ;
135+ const timer = setInterval ( ( ) => {
136+ const timeSinceLastUpdate = Date . now ( ) - lastUpdate ;
137+ if ( timeSinceLastUpdate > 25_000 ) {
138+ console . log ( "[display] fallback refresh (no socket event for 25s)" ) ;
139+ refreshData ( ) ;
140+ }
141+ } , 10_000 ) ; // Check every 10s
117142 return ( ) => clearInterval ( timer ) ;
118- } , [ refreshData ] ) ;
143+ } , [ refreshData , lastUpdate ] ) ;
119144
120145 const now = time . getTime ( ) ;
121146
0 commit comments