diff --git a/src/main/java/sh/mob/timer/web/Room.java b/src/main/java/sh/mob/timer/web/Room.java index a39ae8b..81e7bd8 100644 --- a/src/main/java/sh/mob/timer/web/Room.java +++ b/src/main/java/sh/mob/timer/web/Room.java @@ -94,6 +94,14 @@ public String name() { return name; } + public List historyWithoutLatest() { + if (timerRequests.isEmpty()) { + return List.of(); + } + + return timerRequests.subList(0, timerRequests.size() - 1); + } + public static final class TimerRequest { enum TimerType { diff --git a/src/main/java/sh/mob/timer/web/RoomApiController.java b/src/main/java/sh/mob/timer/web/RoomApiController.java index 1fc35b4..6b1ddc3 100644 --- a/src/main/java/sh/mob/timer/web/RoomApiController.java +++ b/src/main/java/sh/mob/timer/web/RoomApiController.java @@ -34,7 +34,7 @@ public RoomApiController(RoomRepository roomRepository) { @RequestMapping( value = "/{roomId:[a-z0-9-]+}/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux> getEventStream( + public Flux> getEventStream( @PathVariable String roomId, ServerHttpResponse response) { response .getHeaders() @@ -48,20 +48,20 @@ public Flux> getEventStream( .asFlux() .map( timerRequest -> - ServerSentEvent.builder() - .event("TIMER_REQUEST") - .data(timerRequest) - .build()); + ServerSentEvent.builder().event("TIMER_REQUEST").data(timerRequest).build()); var keepAliveFlux = Flux.interval(Duration.ofSeconds(5L)) .map( second -> - ServerSentEvent.builder() + ServerSentEvent.builder() .event("KEEP_ALIVE") .data(new TimerRequest(null, null, null, null, null)) .build()); + var initialHistory = + Flux.just(room.historyWithoutLatest()) + .map(list -> ServerSentEvent.builder().event("INITIAL_HISTORY").data(list).build()); - return keepAliveFlux.mergeWith(timerRequestFlux); + return Flux.concat(initialHistory, keepAliveFlux.mergeWith(timerRequestFlux)); } @PutMapping("/{roomId:[a-z0-9-]+}") diff --git a/src/main/resources/templates/room.html b/src/main/resources/templates/room.html index 5197676..7d8e673 100644 --- a/src/main/resources/templates/room.html +++ b/src/main/resources/templates/room.html @@ -279,6 +279,29 @@
Usage
document.getElementById('history-container').style.display = 'none'; } + eventSource.addEventListener('INITIAL_HISTORY', (event) => { + console.log('handling event INITIAL_HISTORY ' + event.data); + let historyEntries = JSON.parse(event.data); + + if (historyEntries === null) { + return; + } + + historyEntries.forEach(historyEntry => { + prependToHistory(createHistoryEntry(historyEntry)); + }); + }) + + function createHistoryEntry(timerRequest) { + let requested = timerRequest["requested"]; + let timerInMinutes = timerRequest["timer"]; + let user = timerRequest["user"]; + let type = timerRequest["type"]; + let finished = Date.parse(requested) + (timerInMinutes * 60 * 1000); + return `🕒 ${formatTodayAware(requested)} ${type === "BREAKTIMER" ? "☕" + : "⏲"} ${timerInMinutes} min 🏁 ${(formatTodayAware(finished))} 👤 ${user}`; + } + eventSource.addEventListener('TIMER_REQUEST', (event) => { console.log('handling event TIMER_REQUEST ' + event.data); let timerRequest = JSON.parse(event.data); @@ -306,7 +329,6 @@
Usage
return; } - let finished = Date.parse(requested) + (timerInMinutes * 60 * 1000); updateTimerUser(user) updateTimerNextUser(null) updateTimerType(type) @@ -318,7 +340,7 @@
Usage
requestNextUser = nextUser requestTimer = timerInMinutes - prependToHistory(`🕒 ${formatTodayAware(requested)} ${type === "BREAKTIMER" ? "☕" : "⏲"} ${timerInMinutes} min 🏁 ${(formatTodayAware(finished))} 👤 ${user}`); + prependToHistory(createHistoryEntry(timerRequest)); }); checkAudioPlayback(); diff --git a/test.sh b/test.sh index bfee6be..9e3c9ae 100755 --- a/test.sh +++ b/test.sh @@ -1,10 +1,19 @@ export MOB_TIMER_URL=http://localhost:8080/ export MOB_TIMER_ROOM=test MOB_TIMER_USER=test1 mob t 1 +sleep 1 MOB_TIMER_USER=test2 mob t 1 +sleep 1 MOB_TIMER_USER=test1 mob break 1 +sleep 1 MOB_TIMER_USER=test3 mob t 1 +sleep 1 MOB_TIMER_USER=test3 mob t 1 +sleep 1 MOB_TIMER_USER=test1 mob break 1 +sleep 1 MOB_TIMER_USER=test2 mob t 1 -MOB_TIMER_USER=test2 mob t 0 \ No newline at end of file +sleep 1 +MOB_TIMER_USER=test2 mob t 0 +sleep 1 +MOB_TIMER_USER=test2 mob t 1 \ No newline at end of file