@hamzasaleemorg/convex-comments 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +201 -0
  3. package/README.md +581 -0
  4. package/dist/client/_generated/_ignore.d.ts +1 -0
  5. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  6. package/dist/client/_generated/_ignore.js +3 -0
  7. package/dist/client/_generated/_ignore.js.map +1 -0
  8. package/dist/client/index.d.ts +745 -0
  9. package/dist/client/index.d.ts.map +1 -0
  10. package/dist/client/index.js +579 -0
  11. package/dist/client/index.js.map +1 -0
  12. package/dist/component/_generated/api.d.ts +44 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -0
  14. package/dist/component/_generated/api.js +31 -0
  15. package/dist/component/_generated/api.js.map +1 -0
  16. package/dist/component/_generated/component.d.ts +673 -0
  17. package/dist/component/_generated/component.d.ts.map +1 -0
  18. package/dist/component/_generated/component.js +11 -0
  19. package/dist/component/_generated/component.js.map +1 -0
  20. package/dist/component/_generated/dataModel.d.ts +46 -0
  21. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  22. package/dist/component/_generated/dataModel.js +11 -0
  23. package/dist/component/_generated/dataModel.js.map +1 -0
  24. package/dist/component/_generated/server.d.ts +121 -0
  25. package/dist/component/_generated/server.d.ts.map +1 -0
  26. package/dist/component/_generated/server.js +78 -0
  27. package/dist/component/_generated/server.js.map +1 -0
  28. package/dist/component/convex.config.d.ts +3 -0
  29. package/dist/component/convex.config.d.ts.map +1 -0
  30. package/dist/component/convex.config.js +3 -0
  31. package/dist/component/convex.config.js.map +1 -0
  32. package/dist/component/lib.d.ts +17 -0
  33. package/dist/component/lib.d.ts.map +1 -0
  34. package/dist/component/lib.js +18 -0
  35. package/dist/component/lib.js.map +1 -0
  36. package/dist/component/messages.d.ts +173 -0
  37. package/dist/component/messages.d.ts.map +1 -0
  38. package/dist/component/messages.js +410 -0
  39. package/dist/component/messages.js.map +1 -0
  40. package/dist/component/reactions.d.ts +51 -0
  41. package/dist/component/reactions.d.ts.map +1 -0
  42. package/dist/component/reactions.js +191 -0
  43. package/dist/component/reactions.js.map +1 -0
  44. package/dist/component/schema.d.ts +274 -0
  45. package/dist/component/schema.d.ts.map +1 -0
  46. package/dist/component/schema.js +159 -0
  47. package/dist/component/schema.js.map +1 -0
  48. package/dist/component/threads.d.ts +110 -0
  49. package/dist/component/threads.d.ts.map +1 -0
  50. package/dist/component/threads.js +276 -0
  51. package/dist/component/threads.js.map +1 -0
  52. package/dist/component/typing.d.ts +31 -0
  53. package/dist/component/typing.d.ts.map +1 -0
  54. package/dist/component/typing.js +147 -0
  55. package/dist/component/typing.js.map +1 -0
  56. package/dist/component/zones.d.ts +63 -0
  57. package/dist/component/zones.d.ts.map +1 -0
  58. package/dist/component/zones.js +159 -0
  59. package/dist/component/zones.js.map +1 -0
  60. package/dist/react/AddComment.d.ts +57 -0
  61. package/dist/react/AddComment.d.ts.map +1 -0
  62. package/dist/react/AddComment.js +285 -0
  63. package/dist/react/AddComment.js.map +1 -0
  64. package/dist/react/Comment.d.ts +70 -0
  65. package/dist/react/Comment.d.ts.map +1 -0
  66. package/dist/react/Comment.js +259 -0
  67. package/dist/react/Comment.js.map +1 -0
  68. package/dist/react/Comments.d.ts +74 -0
  69. package/dist/react/Comments.d.ts.map +1 -0
  70. package/dist/react/Comments.js +108 -0
  71. package/dist/react/Comments.js.map +1 -0
  72. package/dist/react/CommentsProvider.d.ts +104 -0
  73. package/dist/react/CommentsProvider.d.ts.map +1 -0
  74. package/dist/react/CommentsProvider.js +98 -0
  75. package/dist/react/CommentsProvider.js.map +1 -0
  76. package/dist/react/ReactionPicker.d.ts +28 -0
  77. package/dist/react/ReactionPicker.d.ts.map +1 -0
  78. package/dist/react/ReactionPicker.js +56 -0
  79. package/dist/react/ReactionPicker.js.map +1 -0
  80. package/dist/react/Thread.d.ts +84 -0
  81. package/dist/react/Thread.d.ts.map +1 -0
  82. package/dist/react/Thread.js +124 -0
  83. package/dist/react/Thread.js.map +1 -0
  84. package/dist/react/TypingIndicator.d.ts +25 -0
  85. package/dist/react/TypingIndicator.d.ts.map +1 -0
  86. package/dist/react/TypingIndicator.js +99 -0
  87. package/dist/react/TypingIndicator.js.map +1 -0
  88. package/dist/react/index.d.ts +15 -0
  89. package/dist/react/index.d.ts.map +1 -0
  90. package/dist/react/index.js +15 -0
  91. package/dist/react/index.js.map +1 -0
  92. package/package.json +106 -0
  93. package/src/client/_generated/_ignore.ts +1 -0
  94. package/src/client/index.ts +813 -0
  95. package/src/component/_generated/api.ts +60 -0
  96. package/src/component/_generated/component.ts +784 -0
  97. package/src/component/_generated/dataModel.ts +60 -0
  98. package/src/component/_generated/server.ts +156 -0
  99. package/src/component/convex.config.ts +3 -0
  100. package/src/component/lib.ts +57 -0
  101. package/src/component/messages.ts +476 -0
  102. package/src/component/reactions.ts +222 -0
  103. package/src/component/schema.ts +169 -0
  104. package/src/component/threads.ts +319 -0
  105. package/src/component/typing.ts +168 -0
  106. package/src/component/zones.ts +180 -0
  107. package/src/react/AddComment.tsx +463 -0
  108. package/src/react/Comment.tsx +519 -0
  109. package/src/react/Comments.tsx +276 -0
  110. package/src/react/CommentsProvider.tsx +197 -0
  111. package/src/react/ReactionPicker.tsx +95 -0
  112. package/src/react/Thread.tsx +336 -0
  113. package/src/react/TypingIndicator.tsx +144 -0
  114. package/src/react/index.ts +45 -0
@@ -0,0 +1,745 @@
1
+ /**
2
+ * Comments Component - Client Library
3
+ *
4
+ * This module provides a class-based client for interacting with the
5
+ * comments component, plus helper functions for re-exporting APIs.
6
+ */
7
+ import type { Auth, GenericDataModel, GenericMutationCtx, GenericQueryCtx, HttpRouter } from "convex/server";
8
+ import type { ComponentApi } from "../component/_generated/component.js";
9
+ /** Minimal context types for flexibility */
10
+ type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;
11
+ type MutationCtx = Pick<GenericMutationCtx<GenericDataModel>, "runQuery" | "runMutation">;
12
+ /** Authentication operation types */
13
+ type AuthOperation = {
14
+ type: "read";
15
+ zoneId?: string;
16
+ threadId?: string;
17
+ } | {
18
+ type: "create";
19
+ zoneId?: string;
20
+ threadId?: string;
21
+ } | {
22
+ type: "update";
23
+ messageId?: string;
24
+ threadId?: string;
25
+ } | {
26
+ type: "delete";
27
+ messageId?: string;
28
+ threadId?: string;
29
+ } | {
30
+ type: "react";
31
+ messageId?: string;
32
+ };
33
+ /** Authentication callback that returns the user ID or throws */
34
+ type AuthCallback = (ctx: {
35
+ auth: Auth;
36
+ }, operation: AuthOperation) => Promise<string>;
37
+ /** Attachment metadata */
38
+ interface Attachment {
39
+ type: "url" | "file" | "image";
40
+ url: string;
41
+ name?: string;
42
+ mimeType?: string;
43
+ size?: number;
44
+ }
45
+ /** Mention callbacks */
46
+ interface MentionCallbacks {
47
+ /** Called when a new message is created */
48
+ onNewMessage?: (params: {
49
+ messageId: string;
50
+ threadId: string;
51
+ authorId: string;
52
+ body: string;
53
+ mentions: Array<{
54
+ userId: string;
55
+ start: number;
56
+ end: number;
57
+ }>;
58
+ }) => Promise<void>;
59
+ /** Called for each mention in a message */
60
+ onMention?: (params: {
61
+ messageId: string;
62
+ mentionedUserId: string;
63
+ authorId: string;
64
+ body: string;
65
+ }) => Promise<void>;
66
+ }
67
+ /**
68
+ * Class-based client for the Comments component.
69
+ *
70
+ * Usage:
71
+ * ```ts
72
+ * import { Comments } from "@your-org/comments";
73
+ * import { components } from "./_generated/api";
74
+ *
75
+ * const comments = new Comments(components.comments);
76
+ *
77
+ * // In a mutation/query handler:
78
+ * const zoneId = await comments.getOrCreateZone(ctx, { entityId: "doc_123" });
79
+ * const threads = await comments.getThreads(ctx, { zoneId });
80
+ * ```
81
+ */
82
+ export declare class Comments {
83
+ readonly component: ComponentApi;
84
+ private readonly callbacks?;
85
+ constructor(component: ComponentApi, callbacks?: MentionCallbacks | undefined);
86
+ /**
87
+ * Get or create a zone for an entity.
88
+ */
89
+ getOrCreateZone(ctx: MutationCtx, args: {
90
+ entityId: string;
91
+ metadata?: unknown;
92
+ }): Promise<string>;
93
+ /**
94
+ * Get a zone by entity ID (without creating).
95
+ */
96
+ getZone(ctx: QueryCtx, args: {
97
+ entityId: string;
98
+ }): Promise<{
99
+ _creationTime: number;
100
+ _id: string;
101
+ createdAt: number;
102
+ entityId: string;
103
+ metadata?: any;
104
+ } | null>;
105
+ /**
106
+ * Get a zone by its ID.
107
+ */
108
+ getZoneById(ctx: QueryCtx, args: {
109
+ zoneId: string;
110
+ }): Promise<{
111
+ _creationTime: number;
112
+ _id: string;
113
+ createdAt: number;
114
+ entityId: string;
115
+ metadata?: any;
116
+ } | null>;
117
+ /**
118
+ * Delete a zone and all its contents.
119
+ */
120
+ deleteZone(ctx: MutationCtx, args: {
121
+ zoneId: string;
122
+ }): Promise<{
123
+ deletedMessages: number;
124
+ deletedReactions: number;
125
+ deletedThreads: number;
126
+ }>;
127
+ /**
128
+ * Create a new thread in a zone.
129
+ */
130
+ addThread(ctx: MutationCtx, args: {
131
+ zoneId: string;
132
+ position?: {
133
+ x: number;
134
+ y: number;
135
+ anchor?: string;
136
+ };
137
+ metadata?: unknown;
138
+ }): Promise<string>;
139
+ /**
140
+ * Get a thread by ID.
141
+ */
142
+ getThread(ctx: QueryCtx, args: {
143
+ threadId: string;
144
+ }): Promise<{
145
+ _creationTime: number;
146
+ _id: string;
147
+ createdAt: number;
148
+ lastActivityAt: number;
149
+ metadata?: any;
150
+ position?: {
151
+ anchor?: string;
152
+ x: number;
153
+ y: number;
154
+ };
155
+ resolved: boolean;
156
+ resolvedAt?: number;
157
+ resolvedBy?: string;
158
+ zoneId: string;
159
+ } | null>;
160
+ /**
161
+ * Get all threads in a zone with pagination.
162
+ */
163
+ getThreads(ctx: QueryCtx, args: {
164
+ zoneId: string;
165
+ limit?: number;
166
+ includeResolved?: boolean;
167
+ cursor?: string;
168
+ }): Promise<{
169
+ hasMore: boolean;
170
+ nextCursor?: string;
171
+ threads: Array<{
172
+ firstMessage: null | {
173
+ _id: string;
174
+ authorId: string;
175
+ body: string;
176
+ createdAt: number;
177
+ };
178
+ messageCount: number;
179
+ thread: {
180
+ _creationTime: number;
181
+ _id: string;
182
+ createdAt: number;
183
+ lastActivityAt: number;
184
+ metadata?: any;
185
+ position?: {
186
+ anchor?: string;
187
+ x: number;
188
+ y: number;
189
+ };
190
+ resolved: boolean;
191
+ resolvedAt?: number;
192
+ resolvedBy?: string;
193
+ zoneId: string;
194
+ };
195
+ }>;
196
+ }>;
197
+ /**
198
+ * Resolve a thread.
199
+ */
200
+ resolveThread(ctx: MutationCtx, args: {
201
+ threadId: string;
202
+ userId: string;
203
+ }): Promise<null>;
204
+ /**
205
+ * Unresolve a thread.
206
+ */
207
+ unresolveThread(ctx: MutationCtx, args: {
208
+ threadId: string;
209
+ }): Promise<null>;
210
+ /**
211
+ * Update thread position.
212
+ */
213
+ updateThreadPosition(ctx: MutationCtx, args: {
214
+ threadId: string;
215
+ position?: {
216
+ x: number;
217
+ y: number;
218
+ anchor?: string;
219
+ };
220
+ }): Promise<null>;
221
+ /**
222
+ * Delete a thread and all its messages.
223
+ */
224
+ deleteThread(ctx: MutationCtx, args: {
225
+ threadId: string;
226
+ }): Promise<{
227
+ deletedMessages: number;
228
+ deletedReactions: number;
229
+ }>;
230
+ /**
231
+ * Add a comment to a thread.
232
+ * Returns the message ID and parsed mentions/links.
233
+ */
234
+ addComment(ctx: MutationCtx, args: {
235
+ threadId: string;
236
+ authorId: string;
237
+ body: string;
238
+ attachments?: Attachment[];
239
+ }): Promise<{
240
+ links: Array<{
241
+ end: number;
242
+ start: number;
243
+ url: string;
244
+ }>;
245
+ mentions: Array<{
246
+ end: number;
247
+ start: number;
248
+ userId: string;
249
+ }>;
250
+ messageId: string;
251
+ }>;
252
+ /**
253
+ * Get a single message with reactions.
254
+ */
255
+ getMessage(ctx: QueryCtx, args: {
256
+ messageId: string;
257
+ currentUserId?: string;
258
+ }): Promise<{
259
+ message: {
260
+ _creationTime: number;
261
+ _id: string;
262
+ attachments: Array<{
263
+ mimeType?: string;
264
+ name?: string;
265
+ size?: number;
266
+ type: "url" | "file" | "image";
267
+ url: string;
268
+ }>;
269
+ authorId: string;
270
+ body: string;
271
+ createdAt: number;
272
+ editedAt?: number;
273
+ isDeleted: boolean;
274
+ isEdited: boolean;
275
+ links: Array<{
276
+ end: number;
277
+ start: number;
278
+ url: string;
279
+ }>;
280
+ mentions: Array<{
281
+ end: number;
282
+ start: number;
283
+ userId: string;
284
+ }>;
285
+ resolved?: boolean;
286
+ resolvedAt?: number;
287
+ resolvedBy?: string;
288
+ threadId: string;
289
+ };
290
+ reactions: Array<{
291
+ count: number;
292
+ emoji: string;
293
+ includesMe: boolean;
294
+ users: Array<string>;
295
+ }>;
296
+ } | null>;
297
+ /**
298
+ * Get messages in a thread with pagination.
299
+ */
300
+ getMessages(ctx: QueryCtx, args: {
301
+ threadId: string;
302
+ limit?: number;
303
+ cursor?: string;
304
+ order?: "asc" | "desc";
305
+ currentUserId?: string;
306
+ includeDeleted?: boolean;
307
+ }): Promise<{
308
+ hasMore: boolean;
309
+ messages: Array<{
310
+ message: {
311
+ _creationTime: number;
312
+ _id: string;
313
+ attachments: Array<{
314
+ mimeType?: string;
315
+ name?: string;
316
+ size?: number;
317
+ type: "url" | "file" | "image";
318
+ url: string;
319
+ }>;
320
+ authorId: string;
321
+ body: string;
322
+ createdAt: number;
323
+ editedAt?: number;
324
+ isDeleted: boolean;
325
+ isEdited: boolean;
326
+ links: Array<{
327
+ end: number;
328
+ start: number;
329
+ url: string;
330
+ }>;
331
+ mentions: Array<{
332
+ end: number;
333
+ start: number;
334
+ userId: string;
335
+ }>;
336
+ resolved?: boolean;
337
+ resolvedAt?: number;
338
+ resolvedBy?: string;
339
+ threadId: string;
340
+ };
341
+ reactions: Array<{
342
+ count: number;
343
+ emoji: string;
344
+ includesMe: boolean;
345
+ users: Array<string>;
346
+ }>;
347
+ }>;
348
+ nextCursor?: string;
349
+ }>;
350
+ /**
351
+ * Edit a message.
352
+ */
353
+ editMessage(ctx: MutationCtx, args: {
354
+ messageId: string;
355
+ body: string;
356
+ authorId?: string;
357
+ }): Promise<{
358
+ links: Array<{
359
+ end: number;
360
+ start: number;
361
+ url: string;
362
+ }>;
363
+ mentions: Array<{
364
+ end: number;
365
+ start: number;
366
+ userId: string;
367
+ }>;
368
+ }>;
369
+ /**
370
+ * Soft delete a message.
371
+ */
372
+ deleteMessage(ctx: MutationCtx, args: {
373
+ messageId: string;
374
+ authorId?: string;
375
+ }): Promise<null>;
376
+ /**
377
+ * Add a reaction to a message.
378
+ */
379
+ addReaction(ctx: MutationCtx, args: {
380
+ messageId: string;
381
+ userId: string;
382
+ emoji: string;
383
+ }): Promise<string | null>;
384
+ /**
385
+ * Remove a reaction from a message.
386
+ */
387
+ removeReaction(ctx: MutationCtx, args: {
388
+ messageId: string;
389
+ userId: string;
390
+ emoji: string;
391
+ }): Promise<boolean>;
392
+ /**
393
+ * Toggle a reaction (add if not present, remove if present).
394
+ */
395
+ toggleReaction(ctx: MutationCtx, args: {
396
+ messageId: string;
397
+ userId: string;
398
+ emoji: string;
399
+ }): Promise<{
400
+ added: boolean;
401
+ reactionId?: string;
402
+ }>;
403
+ /**
404
+ * Get all reactions for a message.
405
+ */
406
+ getReactions(ctx: QueryCtx, args: {
407
+ messageId: string;
408
+ currentUserId?: string;
409
+ }): Promise<{
410
+ count: number;
411
+ emoji: string;
412
+ includesMe: boolean;
413
+ users: Array<string>;
414
+ }[]>;
415
+ /**
416
+ * Set typing indicator for a user in a thread.
417
+ */
418
+ setIsTyping(ctx: MutationCtx, args: {
419
+ threadId: string;
420
+ userId: string;
421
+ isTyping: boolean;
422
+ }): Promise<null>;
423
+ /**
424
+ * Get all users currently typing in a thread.
425
+ */
426
+ getTypingUsers(ctx: QueryCtx, args: {
427
+ threadId: string;
428
+ excludeUserId?: string;
429
+ }): Promise<{
430
+ updatedAt: number;
431
+ userId: string;
432
+ }[]>;
433
+ /**
434
+ * Clear all typing indicators for a user.
435
+ */
436
+ clearUserTyping(ctx: MutationCtx, args: {
437
+ userId: string;
438
+ }): Promise<number>;
439
+ /**
440
+ * Resolve a message.
441
+ */
442
+ resolveMessage(ctx: MutationCtx, args: {
443
+ messageId: string;
444
+ userId: string;
445
+ }): Promise<null>;
446
+ /**
447
+ * Unresolve a message.
448
+ */
449
+ unresolveMessage(ctx: MutationCtx, args: {
450
+ messageId: string;
451
+ }): Promise<null>;
452
+ }
453
+ /**
454
+ * Create a re-exportable API for the Comments component.
455
+ *
456
+ * This allows apps to expose comments functionality directly to React clients
457
+ * with authentication. The auth callback is called before each operation.
458
+ *
459
+ * Usage:
460
+ * ```ts
461
+ * // In convex/comments.ts
462
+ * import { exposeApi } from "@your-org/comments";
463
+ * import { components } from "./_generated/api";
464
+ *
465
+ * export const { getThreads, addComment, toggleReaction } = exposeApi(
466
+ * components.comments,
467
+ * {
468
+ * auth: async (ctx, operation) => {
469
+ * const userId = await getAuthUserId(ctx);
470
+ * if (!userId && operation.type !== "read") {
471
+ * throw new Error("Authentication required");
472
+ * }
473
+ * return userId ?? "anonymous";
474
+ * },
475
+ * }
476
+ * );
477
+ * ```
478
+ */
479
+ export declare function exposeApi(component: ComponentApi, options: {
480
+ /** Authentication callback - must return user ID or throw */
481
+ auth: AuthCallback;
482
+ /** Optional notification callbacks */
483
+ callbacks?: MentionCallbacks;
484
+ }): {
485
+ getOrCreateZone: import("convex/server").RegisteredMutation<"public", {
486
+ metadata?: any;
487
+ entityId: string;
488
+ }, Promise<string>>;
489
+ getZone: import("convex/server").RegisteredQuery<"public", {
490
+ entityId: string;
491
+ }, Promise<{
492
+ _creationTime: number;
493
+ _id: string;
494
+ createdAt: number;
495
+ entityId: string;
496
+ metadata?: any;
497
+ } | null>>;
498
+ addThread: import("convex/server").RegisteredMutation<"public", {
499
+ metadata?: any;
500
+ position?: {
501
+ anchor?: string | undefined;
502
+ x: number;
503
+ y: number;
504
+ } | undefined;
505
+ zoneId: string;
506
+ }, Promise<string>>;
507
+ getThread: import("convex/server").RegisteredQuery<"public", {
508
+ threadId: string;
509
+ }, Promise<{
510
+ _creationTime: number;
511
+ _id: string;
512
+ createdAt: number;
513
+ lastActivityAt: number;
514
+ metadata?: any;
515
+ position?: {
516
+ anchor?: string;
517
+ x: number;
518
+ y: number;
519
+ };
520
+ resolved: boolean;
521
+ resolvedAt?: number;
522
+ resolvedBy?: string;
523
+ zoneId: string;
524
+ } | null>>;
525
+ getThreads: import("convex/server").RegisteredQuery<"public", {
526
+ cursor?: string | undefined;
527
+ limit?: number | undefined;
528
+ includeResolved?: boolean | undefined;
529
+ zoneId: string;
530
+ }, Promise<{
531
+ hasMore: boolean;
532
+ nextCursor?: string;
533
+ threads: Array<{
534
+ firstMessage: null | {
535
+ _id: string;
536
+ authorId: string;
537
+ body: string;
538
+ createdAt: number;
539
+ };
540
+ messageCount: number;
541
+ thread: {
542
+ _creationTime: number;
543
+ _id: string;
544
+ createdAt: number;
545
+ lastActivityAt: number;
546
+ metadata?: any;
547
+ position?: {
548
+ anchor?: string;
549
+ x: number;
550
+ y: number;
551
+ };
552
+ resolved: boolean;
553
+ resolvedAt?: number;
554
+ resolvedBy?: string;
555
+ zoneId: string;
556
+ };
557
+ }>;
558
+ }>>;
559
+ resolveThread: import("convex/server").RegisteredMutation<"public", {
560
+ threadId: string;
561
+ }, Promise<null>>;
562
+ unresolveThread: import("convex/server").RegisteredMutation<"public", {
563
+ threadId: string;
564
+ }, Promise<null>>;
565
+ addComment: import("convex/server").RegisteredMutation<"public", {
566
+ attachments?: {
567
+ name?: string | undefined;
568
+ mimeType?: string | undefined;
569
+ size?: number | undefined;
570
+ url: string;
571
+ type: "url" | "file" | "image";
572
+ }[] | undefined;
573
+ body: string;
574
+ threadId: string;
575
+ }, Promise<{
576
+ links: Array<{
577
+ end: number;
578
+ start: number;
579
+ url: string;
580
+ }>;
581
+ mentions: Array<{
582
+ end: number;
583
+ start: number;
584
+ userId: string;
585
+ }>;
586
+ messageId: string;
587
+ }>>;
588
+ getMessage: import("convex/server").RegisteredQuery<"public", {
589
+ messageId: string;
590
+ }, Promise<{
591
+ message: {
592
+ _creationTime: number;
593
+ _id: string;
594
+ attachments: Array<{
595
+ mimeType?: string;
596
+ name?: string;
597
+ size?: number;
598
+ type: "url" | "file" | "image";
599
+ url: string;
600
+ }>;
601
+ authorId: string;
602
+ body: string;
603
+ createdAt: number;
604
+ editedAt?: number;
605
+ isDeleted: boolean;
606
+ isEdited: boolean;
607
+ links: Array<{
608
+ end: number;
609
+ start: number;
610
+ url: string;
611
+ }>;
612
+ mentions: Array<{
613
+ end: number;
614
+ start: number;
615
+ userId: string;
616
+ }>;
617
+ resolved?: boolean;
618
+ resolvedAt?: number;
619
+ resolvedBy?: string;
620
+ threadId: string;
621
+ };
622
+ reactions: Array<{
623
+ count: number;
624
+ emoji: string;
625
+ includesMe: boolean;
626
+ users: Array<string>;
627
+ }>;
628
+ } | null>>;
629
+ getMessages: import("convex/server").RegisteredQuery<"public", {
630
+ cursor?: string | undefined;
631
+ includeDeleted?: boolean | undefined;
632
+ limit?: number | undefined;
633
+ order?: "asc" | "desc" | undefined;
634
+ threadId: string;
635
+ }, Promise<{
636
+ hasMore: boolean;
637
+ messages: Array<{
638
+ message: {
639
+ _creationTime: number;
640
+ _id: string;
641
+ attachments: Array<{
642
+ mimeType?: string;
643
+ name?: string;
644
+ size?: number;
645
+ type: "url" | "file" | "image";
646
+ url: string;
647
+ }>;
648
+ authorId: string;
649
+ body: string;
650
+ createdAt: number;
651
+ editedAt?: number;
652
+ isDeleted: boolean;
653
+ isEdited: boolean;
654
+ links: Array<{
655
+ end: number;
656
+ start: number;
657
+ url: string;
658
+ }>;
659
+ mentions: Array<{
660
+ end: number;
661
+ start: number;
662
+ userId: string;
663
+ }>;
664
+ resolved?: boolean;
665
+ resolvedAt?: number;
666
+ resolvedBy?: string;
667
+ threadId: string;
668
+ };
669
+ reactions: Array<{
670
+ count: number;
671
+ emoji: string;
672
+ includesMe: boolean;
673
+ users: Array<string>;
674
+ }>;
675
+ }>;
676
+ nextCursor?: string;
677
+ }>>;
678
+ editMessage: import("convex/server").RegisteredMutation<"public", {
679
+ body: string;
680
+ messageId: string;
681
+ }, Promise<{
682
+ links: Array<{
683
+ end: number;
684
+ start: number;
685
+ url: string;
686
+ }>;
687
+ mentions: Array<{
688
+ end: number;
689
+ start: number;
690
+ userId: string;
691
+ }>;
692
+ }>>;
693
+ deleteMessage: import("convex/server").RegisteredMutation<"public", {
694
+ messageId: string;
695
+ }, Promise<null>>;
696
+ toggleReaction: import("convex/server").RegisteredMutation<"public", {
697
+ emoji: string;
698
+ messageId: string;
699
+ }, Promise<{
700
+ added: boolean;
701
+ reactionId?: string;
702
+ }>>;
703
+ getReactions: import("convex/server").RegisteredQuery<"public", {
704
+ messageId: string;
705
+ }, Promise<{
706
+ count: number;
707
+ emoji: string;
708
+ includesMe: boolean;
709
+ users: Array<string>;
710
+ }[]>>;
711
+ setIsTyping: import("convex/server").RegisteredMutation<"public", {
712
+ threadId: string;
713
+ isTyping: boolean;
714
+ }, Promise<null>>;
715
+ getTypingUsers: import("convex/server").RegisteredQuery<"public", {
716
+ threadId: string;
717
+ }, Promise<{
718
+ updatedAt: number;
719
+ userId: string;
720
+ }[]>>;
721
+ };
722
+ /**
723
+ * Register HTTP routes for the Comments component.
724
+ *
725
+ * Provides REST-like endpoints for the comments API:
726
+ * - GET /comments/zones/:entityId - Get zone by entity ID
727
+ * - GET /comments/threads/:zoneId - Get threads in a zone
728
+ * - GET /comments/messages/:threadId - Get messages in a thread
729
+ *
730
+ * Usage:
731
+ * ```ts
732
+ * // In convex/http.ts
733
+ * import { registerRoutes } from "@your-org/comments";
734
+ * import { components } from "./_generated/api";
735
+ *
736
+ * const http = httpRouter();
737
+ * registerRoutes(http, components.comments, { pathPrefix: "/api/comments" });
738
+ * export default http;
739
+ * ```
740
+ */
741
+ export declare function registerRoutes(http: HttpRouter, component: ComponentApi, options?: {
742
+ pathPrefix?: string;
743
+ }): void;
744
+ export default Comments;
745
+ //# sourceMappingURL=index.d.ts.map