diff --git a/backend/internal/web/handlers_discussion.go b/backend/internal/web/handlers_discussion.go index 50c4bde..e843b5e 100644 --- a/backend/internal/web/handlers_discussion.go +++ b/backend/internal/web/handlers_discussion.go @@ -92,6 +92,8 @@ func DiscussionMessageCreateHandler(deps DiscussionDeps) http.HandlerFunc { } if errs.Body != "" { w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Header().Set("HX-Retarget", "form[action$='/discussion/messages']") + w.Header().Set("HX-Reswap", "outerHTML") w.WriteHeader(http.StatusUnprocessableEntity) _ = templates.DiscussionComposer(tablo, form, errs, csrf.Token(r)).Render(r.Context(), w) return @@ -104,6 +106,8 @@ func DiscussionMessageCreateHandler(deps DiscussionDeps) http.HandlerFunc { if err != nil { slog.Default().Error("discussion create: CreateDiscussionMessage failed", "tablo_id", tablo.ID, "err", err) w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Header().Set("HX-Retarget", "form[action$='/discussion/messages']") + w.Header().Set("HX-Reswap", "outerHTML") w.WriteHeader(http.StatusInternalServerError) errs.General = "Message could not be sent. Please try again." _ = templates.DiscussionComposer(tablo, form, errs, csrf.Token(r)).Render(r.Context(), w) @@ -118,11 +122,14 @@ func DiscussionMessageCreateHandler(deps DiscussionDeps) http.HandlerFunc { http.Error(w, "internal server error", http.StatusInternalServerError) return } - message := templates.DiscussionMessageFromRow(row, row.AuthorUserID == user.ID) + message := templates.DiscussionMessageFromRow(row, user.ID) data := templates.DiscussionTabData{Messages: []templates.DiscussionMessageView{message}} markDiscussionRead(r, deps.Queries, tablo, user.ID, data) if deps.Realtime != nil { - html, err := renderDiscussionMessageHTML(r, message) + // SSE recipients are never the author — always render as IsOwn: false. + sseMessage := message + sseMessage.IsOwn = false + html, err := renderDiscussionMessageHTML(r, sseMessage) if err != nil { slog.Default().Warn("discussion create: render realtime message failed", "tablo_id", tablo.ID, "message_id", msg.ID, "err", err) } else { diff --git a/backend/internal/web/ui/app.css b/backend/internal/web/ui/app.css index edf1f46..518de05 100644 --- a/backend/internal/web/ui/app.css +++ b/backend/internal/web/ui/app.css @@ -749,7 +749,7 @@ } .message-row.message-own .message-bubble { - background-color: rgba(128, 78, 236, 0.10); + background-color: color-mix(in srgb, var(--color-brand-primary) 10%, transparent); border-radius: 0.75rem 0.75rem 0.25rem 0.75rem; color: var(--color-text-primary); } diff --git a/backend/templates/discussion.templ b/backend/templates/discussion.templ index 69bfb8e..de981c5 100644 --- a/backend/templates/discussion.templ +++ b/backend/templates/discussion.templ @@ -12,22 +12,20 @@ templ DiscussionTabFragment(tablo sqlc.Tablo, data DiscussionTabData, form Discu
1 participant