Skip to content

Commit c268424

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

2 files changed

Lines changed: 35 additions & 10 deletions

File tree

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

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

server/tsconfig.tsbuildinfo

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

0 commit comments

Comments
 (0)