fix: TYPING_START events now carry user_id and username
The backend was broadcasting TYPING_START with only channel_id. Frontend required user_id + username to show who is typing. Added Username to Client struct, fetched on WS connect via JOIN. Typing events now enriched with sender identity before broadcast.
This commit is contained in:
@@ -105,6 +105,7 @@ type Client struct {
|
|||||||
Hub *Hub
|
Hub *Hub
|
||||||
Conn *websocket.Conn
|
Conn *websocket.Conn
|
||||||
UserID string
|
UserID string
|
||||||
|
Username string
|
||||||
send chan []byte
|
send chan []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,7 +141,19 @@ func (c *Client) readPump() {
|
|||||||
c.Hub.RecordActivity(c.UserID)
|
c.Hub.RecordActivity(c.UserID)
|
||||||
|
|
||||||
switch event.Type {
|
switch event.Type {
|
||||||
case EventTypingStart, EventPresenceUpdate:
|
case EventTypingStart:
|
||||||
|
// Enrich with sender info so receivers know who is typing
|
||||||
|
var data map[string]interface{}
|
||||||
|
if raw, ok := event.Data.(json.RawMessage); ok {
|
||||||
|
json.Unmarshal(raw, &data)
|
||||||
|
}
|
||||||
|
if data == nil {
|
||||||
|
data = make(map[string]interface{})
|
||||||
|
}
|
||||||
|
data["user_id"] = c.UserID
|
||||||
|
data["username"] = c.Username
|
||||||
|
c.Hub.BroadcastEvent(Event{Type: event.Type, Data: data})
|
||||||
|
case EventPresenceUpdate:
|
||||||
c.Hub.BroadcastEvent(event)
|
c.Hub.BroadcastEvent(event)
|
||||||
case EventVoiceWhisper:
|
case EventVoiceWhisper:
|
||||||
// Forward voice whispers only to the target user, not broadcast
|
// Forward voice whispers only to the target user, not broadcast
|
||||||
@@ -247,11 +260,11 @@ func ServeWS(db *sql.DB, hub *Hub, logger *slog.Logger, w http.ResponseWriter, r
|
|||||||
token = auth.Token
|
token = auth.Token
|
||||||
}
|
}
|
||||||
|
|
||||||
var userID string
|
var userID, username string
|
||||||
err = db.QueryRowContext(context.Background(),
|
err = db.QueryRowContext(context.Background(),
|
||||||
`SELECT user_id FROM sessions WHERE token = $1 AND expires_at > NOW()`,
|
`SELECT u.id, u.username FROM sessions s JOIN users u ON u.id = s.user_id WHERE s.token = $1 AND s.expires_at > NOW()`,
|
||||||
token,
|
token,
|
||||||
).Scan(&userID)
|
).Scan(&userID, &username)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn("ws auth: invalid session", "error", err)
|
logger.Warn("ws auth: invalid session", "error", err)
|
||||||
conn.WriteMessage(websocket.TextMessage, []byte(`{"error":"invalid session"}`))
|
conn.WriteMessage(websocket.TextMessage, []byte(`{"error":"invalid session"}`))
|
||||||
@@ -266,6 +279,7 @@ func ServeWS(db *sql.DB, hub *Hub, logger *slog.Logger, w http.ResponseWriter, r
|
|||||||
Hub: hub,
|
Hub: hub,
|
||||||
Conn: conn,
|
Conn: conn,
|
||||||
UserID: userID,
|
UserID: userID,
|
||||||
|
Username: username,
|
||||||
send: make(chan []byte, 256),
|
send: make(chan []byte, 256),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user