commit 188cac20261586e782bf9705fdc6a6b578efe69b
parent cbb8bb303e66bed80ec607a4e8dfc8dbc174b1d3
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Sat, 27 May 2023 17:51:28 -0700
fix read-marker for stream chat
Diffstat:
4 files changed, 39 insertions(+), 31 deletions(-)
diff --git a/pkg/web/handlers/api/v1/messages.qtpl b/pkg/web/handlers/api/v1/messages.qtpl
@@ -314,13 +314,13 @@
{%- func RenderMessage(idx int, e database.ChatMessage, AuthUser *database.User,
Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) -%}
{%- if e.UserCanSee(*AuthUser) -%}
+ {%- if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered %}
+ <div class="read-marker read-marker-0"></div>
+ {%- code *readMarkerRendered = true -%}
+ {%- endif -%}
<div id="msgid-{%s e.UUID %}" class="msgidc-{%s e.UUID %}-{%dl e.Rev %} msg
{%- if (e.User.IsHellbanned || e.IsHellbanned) && AuthUser.DisplayHellbanned %} hb-row
{%- elseif AuthUser.ID == e.User.ID && AuthUser.HighlightOwnMessages %} own-highlight{%- endif -%}
- {%- if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered %}
- {%- if idx > 0 -%} read-marker{%- endif -%}
- {%- code *readMarkerRendered = true -%}
- {%- endif -%}
">
{%- if e.UserCanDelete(*AuthUser) -%}
{%- if !e.TooOldToDelete() -%}
diff --git a/pkg/web/handlers/api/v1/messages.qtpl.go b/pkg/web/handlers/api/v1/messages.qtpl.go
@@ -693,46 +693,41 @@ func StreamRenderMessage(qw422016 *qt422016.Writer, idx int, e database.ChatMess
Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) {
//line messages.qtpl:316
if e.UserCanSee(*AuthUser) {
-//line messages.qtpl:316
- qw422016.N().S(` <div id="msgid-`)
//line messages.qtpl:317
- qw422016.E().S(e.UUID)
+ if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered {
//line messages.qtpl:317
+ qw422016.N().S(`
+ <div class="read-marker read-marker-0"></div>
+`)
+//line messages.qtpl:319
+ *readMarkerRendered = true
+
+//line messages.qtpl:320
+ }
+//line messages.qtpl:320
+ qw422016.N().S(` <div id="msgid-`)
+//line messages.qtpl:321
+ qw422016.E().S(e.UUID)
+//line messages.qtpl:321
qw422016.N().S(`" class="msgidc-`)
-//line messages.qtpl:317
+//line messages.qtpl:321
qw422016.E().S(e.UUID)
-//line messages.qtpl:317
+//line messages.qtpl:321
qw422016.N().S(`-`)
-//line messages.qtpl:317
+//line messages.qtpl:321
qw422016.N().DL(e.Rev)
-//line messages.qtpl:317
+//line messages.qtpl:321
qw422016.N().S(` msg
`)
-//line messages.qtpl:318
+//line messages.qtpl:322
if (e.User.IsHellbanned || e.IsHellbanned) && AuthUser.DisplayHellbanned {
-//line messages.qtpl:318
+//line messages.qtpl:322
qw422016.N().S(` hb-row
`)
-//line messages.qtpl:319
+//line messages.qtpl:323
} else if AuthUser.ID == e.User.ID && AuthUser.HighlightOwnMessages {
-//line messages.qtpl:319
+//line messages.qtpl:323
qw422016.N().S(` own-highlight`)
-//line messages.qtpl:319
- }
-//line messages.qtpl:320
- if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered {
-//line messages.qtpl:320
- qw422016.N().S(`
-`)
-//line messages.qtpl:321
- if idx > 0 {
-//line messages.qtpl:321
- qw422016.N().S(`read-marker`)
-//line messages.qtpl:321
- }
-//line messages.qtpl:322
- *readMarkerRendered = true
-
//line messages.qtpl:323
}
//line messages.qtpl:323
diff --git a/pkg/web/handlers/api/v1/msgInterceptor.go b/pkg/web/handlers/api/v1/msgInterceptor.go
@@ -54,6 +54,7 @@ func (i MsgInterceptor) InterceptMsg(cmd *Command) {
// Update chat read marker
cmd.db.UpdateChatReadMarker(cmd.authUser.ID, cmd.room.ID)
+ database.MsgPubSub.Pub("readmarker_"+string(cmd.authUser.Username), database.ChatMessageType{Typ: database.ForceRefresh})
// Update user activity
isPM := cmd.toUser != nil
diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go
@@ -5079,13 +5079,17 @@ func ChatStreamMessagesHandler(c echo.Context) error {
c.Response().Flush()
selfRefreshTopic := "refresh_" + string(authUser.Username)
+ readMarkerTopic := "readmarker_" + string(authUser.Username)
authorizedChannels := []string{
"refresh",
selfRefreshTopic,
+ readMarkerTopic,
"room_" + room.ID.String()}
sub := database.MsgPubSub.Subscribe(authorizedChannels)
defer sub.Close()
+ readMarkerRev := 0
+
var indicatorSelector bool
Loop:
for {
@@ -5122,6 +5126,14 @@ Loop:
continue
}
+ if topic == readMarkerTopic {
+ send(fmt.Sprintf(`<style>.read-marker-%d{display:none}</style>`, readMarkerRev))
+ send(fmt.Sprintf(`<div class="read-marker read-marker-%d"></div>`, readMarkerRev+1))
+ readMarkerRev++
+ c.Response().Flush()
+ continue
+ }
+
if topic == selfRefreshTopic || msgTyp.Typ == database.ForceRefresh {
send(`<meta http-equiv="refresh" content="0" />`)
return nil