mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
4b5ec8a9a4
## Summary Adds a new `diff_status_change` event kind to the `/chats/watch` pubsub stream so the sidebar can update diff status (PR created, files changed, branch info) without a full page reload. ### Problem When a chat's diff status changes (e.g. PR created via GitHub, git branch pushed), the sidebar didn't update because: 1. The backend `publishChatPubsubEvent` didn't include diff status data 2. The frontend watch handler only merged `status`, `title`, and `updated_at` from events ### Solution A **notify-only** approach: a new `ChatEventKindDiffStatusChange` event kind tells the frontend "diff status changed for chat X" — the frontend then invalidates the relevant React Query cache entries to re-fetch. ### Backend changes - **`coderd/pubsub/chatevent.go`**: New `ChatEventKindDiffStatusChange = "diff_status_change"` constant - **`coderd/chatd/chatd.go`**: New `PublishDiffStatusChange(ctx, chatID)` method on `Server` - **`coderd/chats.go`**: New `publishChatDiffStatusEvent` helper. Published from: - `refreshWorkspaceChatDiffStatuses` — after each chat's diff status is refreshed via GitHub API - `storeChatGitRef` — after persisting git branch/origin info from workspace agent ### Frontend changes - **`AgentsPage.tsx`**: Handle `diff_status_change` event by invalidating `chatDiffStatusKey` and `chatDiffContentsKey` queries - **`ChatContext.ts`**: Remove redundant diff status invalidation that fired on every chat status change (the new event kind handles this properly)
48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package pubsub
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/google/uuid"
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/coder/coder/v2/codersdk"
|
|
)
|
|
|
|
func ChatEventChannel(ownerID uuid.UUID) string {
|
|
return fmt.Sprintf("chat:owner:%s", ownerID)
|
|
}
|
|
|
|
func HandleChatEvent(cb func(ctx context.Context, payload ChatEvent, err error)) func(ctx context.Context, message []byte, err error) {
|
|
return func(ctx context.Context, message []byte, err error) {
|
|
if err != nil {
|
|
cb(ctx, ChatEvent{}, xerrors.Errorf("chat event pubsub: %w", err))
|
|
return
|
|
}
|
|
var payload ChatEvent
|
|
if err := json.Unmarshal(message, &payload); err != nil {
|
|
cb(ctx, ChatEvent{}, xerrors.Errorf("unmarshal chat event"))
|
|
return
|
|
}
|
|
|
|
cb(ctx, payload, err)
|
|
}
|
|
}
|
|
|
|
type ChatEvent struct {
|
|
Kind ChatEventKind `json:"kind"`
|
|
Chat codersdk.Chat `json:"chat"`
|
|
}
|
|
|
|
type ChatEventKind string
|
|
|
|
const (
|
|
ChatEventKindStatusChange ChatEventKind = "status_change"
|
|
ChatEventKindTitleChange ChatEventKind = "title_change"
|
|
ChatEventKindCreated ChatEventKind = "created"
|
|
ChatEventKindDeleted ChatEventKind = "deleted"
|
|
ChatEventKindDiffStatusChange ChatEventKind = "diff_status_change"
|
|
)
|