Skip to content

Commit 4d5c5be

Browse files
committed
Refactor code structure for improved readability and maintainability
1 parent c268424 commit 4d5c5be

2 files changed

Lines changed: 29 additions & 23 deletions

File tree

server/src/components/display/floor-display.tsx

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

server/tsconfig.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)