feat(reactions): add emoji reactions for comments and issue descriptions
Add Slack-style emoji reactions to comments and issue descriptions with full-stack support: database tables, REST API endpoints, real-time WebSocket sync, optimistic UI updates, and inbox notifications. - New `comment_reaction` and `issue_reaction` tables with migrations - POST/DELETE endpoints for adding/removing reactions on both comments and issue descriptions - Real-time WS events (reaction:added/removed, issue_reaction:added/removed) - Shared ReactionBar component with quick emoji picker and full emoji-mart picker (lazy-loaded) - Optimistic add/remove with rollback on failure - Inbox notifications for comment author and issue creator when reacted to - Reactions included in timeline, comment list, and issue detail responses
This commit is contained in:
parent
72e3ccfe33
commit
7c1aabbe3a
32 changed files with 1221 additions and 49 deletions
|
|
@ -17,6 +17,8 @@ import type {
|
|||
InboxItem,
|
||||
IssueSubscriber,
|
||||
Comment,
|
||||
Reaction,
|
||||
IssueReaction,
|
||||
Workspace,
|
||||
WorkspaceRepo,
|
||||
MemberWithUser,
|
||||
|
|
@ -225,6 +227,34 @@ export class ApiClient {
|
|||
await this.fetch(`/api/comments/${commentId}`, { method: "DELETE" });
|
||||
}
|
||||
|
||||
async addReaction(commentId: string, emoji: string): Promise<Reaction> {
|
||||
return this.fetch(`/api/comments/${commentId}/reactions`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ emoji }),
|
||||
});
|
||||
}
|
||||
|
||||
async removeReaction(commentId: string, emoji: string): Promise<void> {
|
||||
await this.fetch(`/api/comments/${commentId}/reactions`, {
|
||||
method: "DELETE",
|
||||
body: JSON.stringify({ emoji }),
|
||||
});
|
||||
}
|
||||
|
||||
async addIssueReaction(issueId: string, emoji: string): Promise<IssueReaction> {
|
||||
return this.fetch(`/api/issues/${issueId}/reactions`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ emoji }),
|
||||
});
|
||||
}
|
||||
|
||||
async removeIssueReaction(issueId: string, emoji: string): Promise<void> {
|
||||
await this.fetch(`/api/issues/${issueId}/reactions`, {
|
||||
method: "DELETE",
|
||||
body: JSON.stringify({ emoji }),
|
||||
});
|
||||
}
|
||||
|
||||
// Subscribers
|
||||
async listIssueSubscribers(issueId: string): Promise<IssueSubscriber[]> {
|
||||
return this.fetch(`/api/issues/${issueId}/subscribers`);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue