diff --git a/chat/components/chat.templ b/chat/components/chat.templ index f2d02fe..326bd3e 100644 --- a/chat/components/chat.templ +++ b/chat/components/chat.templ @@ -23,16 +23,21 @@ type Config struct { StopKeyPropagation bool } +// ChatMessage renders a single chat message. Used for appending new messages via SSE. +templ ChatMessage(m chat.Message, cfg Config) { +
+ + { m.Nickname + ": " } + + { m.Message } +
+} + templ Chat(messages []chat.Message, cfg Config) {
-
+
for _, m := range messages { -
- - { m.Nickname + ": " } - - { m.Message } -
+ @ChatMessage(m, cfg) }
diff --git a/features/c4game/handlers.go b/features/c4game/handlers.go index c5a5bc0..be6c09b 100644 --- a/features/c4game/handlers.go +++ b/features/c4game/handlers.go @@ -148,8 +148,13 @@ func HandleGameEvents(store *connect4.Store, nc *nats.Conn, sm *scs.SessionManag return } case msg := <-chatCh: - room.Receive(msg.Data) - if err := patchAll(); err != nil { + chatMsg, _ := room.Receive(msg.Data) + err := sse.PatchElementTempl( + chatcomponents.ChatMessage(chatMsg, chatCfg), + datastar.WithSelectorID("c4-chat-history"), + datastar.WithModeAppend(), + ) + if err != nil { return } } diff --git a/features/snakegame/handlers.go b/features/snakegame/handlers.go index dffb6a0..7a96ed4 100644 --- a/features/snakegame/handlers.go +++ b/features/snakegame/handlers.go @@ -172,8 +172,13 @@ func HandleSnakeEvents(snakeStore *snake.SnakeStore, nc *nats.Conn, sm *scs.Sess if msg == nil { continue } - room.Receive(msg.Data) - if err := patchAll(); err != nil { + chatMsg, _ := room.Receive(msg.Data) + err := sse.PatchElementTempl( + chatcomponents.ChatMessage(chatMsg, chatCfg), + datastar.WithSelectorID("snake-chat-history"), + datastar.WithModeAppend(), + ) + if err != nil { return } }