@convokitapp/vue-ui 0.7.0 → 0.8.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.
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { Conversation as Conversation$1, InboxPage, MessageListOptions, Message, SendMessageInput, MarkConversationReadOptions, ConversationPrivateState, ClearConversationUnreadOptions, ClearUnreadResult, RealtimeConnectionHandlers, RealtimeSubscription, MessageEvent, MessageDeletedEvent, ReadEvent, TypingEvent, ReadPosition, InboxSummary, MessageMedia, ConvoKitClient, InboxEntry } from '@convokitapp/sdk';
1
+ import { Conversation as Conversation$1, InboxPage, MessageListOptions, Message, SendMessageInput, EditMessageInput, MarkConversationReadOptions, ConversationPrivateState, ClearConversationUnreadOptions, ClearUnreadResult, RealtimeConnectionHandlers, RealtimeSubscription, MessageEvent, MessageDeletedEvent, ReadEvent, TypingEvent, ReadPosition, InboxSummary, MessageMedia, ConvoKitClient, InboxEntry } from '@convokitapp/sdk';
2
2
  import * as vue from 'vue';
3
3
  import { CSSProperties, HTMLAttributes, Ref, VNodeChild, PropType, MaybeRefOrGetter, TextareaHTMLAttributes } from 'vue';
4
4
 
@@ -29,6 +29,18 @@ interface ConvoKitUiClient {
29
29
  /** Complete authorized message, including related media absent from raw row events. */
30
30
  getMessage(id: string): Promise<Message>;
31
31
  sendMessage(input: SendMessageInput): Promise<Message>;
32
+ /** Replace the text of one of the caller's own messages, or clear the caption of a message with attachments with
33
+ * `text: null` (0.8.0). `revision` is the row's `Message.revision` as the user saw it; a stale value must reject
34
+ * with `code: 'REVISION_CONFLICT'` (status 409) and a deleted or inaccessible message with `code: 'MESSAGE_NOT_FOUND'`
35
+ * (status 404). Attachments are never changed. Optional: without it the room store hides the edit affordance and
36
+ * `saveEdit` rejects.
37
+ */
38
+ editMessage?(messageId: string, input: EditMessageInput): Promise<Message>;
39
+ /** Delete one of the caller's own messages for every member (0.8.0); a message that is already gone must reject
40
+ * with `code: 'MESSAGE_NOT_FOUND'`. Optional: without it the room store hides the delete affordance and
41
+ * `deleteMessage` rejects.
42
+ */
43
+ deleteMessage?(messageId: string): Promise<void>;
32
44
  /** Acknowledge through `options.throughMessageId` (the newest rendered row). Custom adapters must forward the
33
45
  * options unchanged (0.7 adds `privateStateVersion`, the version captured when the room opened; an adapter that
34
46
  * drops it acknowledges the position but never clears the caller's unread marker) and reject a missing target
@@ -107,6 +119,15 @@ interface ConversationState {
107
119
  hasLoaded: Readonly<Ref<boolean>>;
108
120
  error: Readonly<Ref<unknown>>;
109
121
  currentUserId: Readonly<Ref<string>>;
122
+ /** The row being edited as the user saw it when editing started (0.8.0); its `revision` is what `saveEdit`
123
+ * sends. Replaced by the current row on a conflict; null when not editing.
124
+ */
125
+ editingMessage: Readonly<Ref<Message | null>>;
126
+ /** Whether the adapter implements `editMessage` / `deleteMessage` (0.8.0). Without it the default rows render no
127
+ * actions and `startEditing` is a no-op.
128
+ */
129
+ canEditMessages: Readonly<Ref<boolean>>;
130
+ canDeleteMessages: Readonly<Ref<boolean>>;
110
131
  readerIdsFor(message: Message): ReadonlySet<string>;
111
132
  }
112
133
  type ConvoKitUiDensity = 'comfortable' | 'compact';
@@ -135,6 +156,20 @@ interface MessageSlotProps {
135
156
  isCurrentUser: boolean;
136
157
  sender: Conversation$1['participants'][number] | undefined;
137
158
  readerIds: ReadonlySet<string>;
159
+ /** `message.revision > 0` (0.8.0): the content changed after the send; never derived from `updatedAt`. */
160
+ isEdited: boolean;
161
+ /** Whether the default row would offer the action (0.8.0): the view has the callback and the row is the viewer's
162
+ * own, confirmed and not read-only (or `canEditMessage` says so).
163
+ */
164
+ canEdit: boolean;
165
+ canDelete: boolean;
166
+ /** Ask the view to start editing this message (`onEditMessage`); present while `canEdit`. */
167
+ edit?: () => void;
168
+ /** Ask the view to delete this message (`onDeleteMessage`) after `confirmDelete` when the view has one, otherwise
169
+ * at once (a custom row owns its own confirmation); resolves to whether the deletion was accepted. Present while
170
+ * `canDelete`.
171
+ */
172
+ remove?: () => Promise<boolean>;
138
173
  }
139
174
  interface MediaSlotProps {
140
175
  media: MessageMedia;
@@ -146,8 +181,13 @@ interface ComposerSlotProps {
146
181
  value: string;
147
182
  setValue: (value: string) => void;
148
183
  isSending: boolean;
184
+ /** Sends the draft, or saves the edit in progress while `editing` is present (0.8.0). */
149
185
  send: () => void;
150
186
  addAttachment?: () => void;
187
+ /** The message being edited (0.8.0); present while the view is in edit mode. The field already holds its text. */
188
+ editing?: Message;
189
+ /** Leave edit mode and restore the unsent draft (0.8.0); present while `editing` is. */
190
+ cancelEdit?: () => void;
151
191
  }
152
192
  interface TypingSlotProps {
153
193
  userIds: ReadonlySet<string>;
@@ -217,6 +257,21 @@ interface ConversationController extends ConversationState {
217
257
  text?: string;
218
258
  media?: MessageMedia[];
219
259
  }): Promise<Message | null>;
260
+ /** Enter edit mode on one of the caller's own confirmed messages (0.8.0); a no-op for other rows, for a `READ`
261
+ * role and for adapters without `editMessage`. Sends nothing (no typing update either).
262
+ */
263
+ startEditing(messageId: string): void;
264
+ /** Leave edit mode without a request. */
265
+ cancelEditing(): void;
266
+ /** Save the edit in progress with the snapshot's revision; resolves true when the server accepted it. A stale
267
+ * revision reloads the row, refreshes `editingMessage` and reports `REVISION_CONFLICT` through `error` (edit mode
268
+ * and draft kept); see the README for the other outcomes. Rejects when the adapter lacks `editMessage`.
269
+ */
270
+ saveEdit(text: string): Promise<boolean>;
271
+ /** Delete one of the caller's own confirmed messages; resolves true once the row is gone (accepted, or already
272
+ * unknown to the server). No optimistic removal. Rejects when the adapter lacks `deleteMessage`.
273
+ */
274
+ deleteMessage(messageId: string): Promise<boolean>;
220
275
  /** Acknowledge through the newest rendered message now; no request is sent while nothing is rendered. */
221
276
  markRead(): Promise<void>;
222
277
  /** Automatic acknowledgements pause while hidden and resume when the view becomes visible again. */
@@ -242,6 +297,27 @@ interface ConversationViewProps extends ConvoKitAppearanceProps {
242
297
  onTypingChange?: (isTyping: boolean) => void | Promise<void>;
243
298
  onAddAttachment?: () => void;
244
299
  onAttachmentClick?: (media: MessageMedia, message: Message) => void;
300
+ /** The message being edited (0.8.0), or null. Entering edit mode stashes the unsent draft and prefills the field
301
+ * with the message text without a typing update; the composer then saves instead of sending.
302
+ */
303
+ editingMessage?: Message | null;
304
+ /** Start editing a message (0.8.0): set `editingMessage` in response. Without it rows offer no edit action. */
305
+ onEditMessage?: (message: Message) => void;
306
+ /** Save the edit in progress (0.8.0); the composer's submit calls it instead of `onSendMessage` while
307
+ * `editingMessage` is set. `false` keeps edit mode and the draft (like `onSendMessage`); any other result
308
+ * restores the stashed unsent draft. Clear `editingMessage` when the edit is done.
309
+ */
310
+ onSaveEdit?: (message: Message, text: string) => boolean | void | Promise<boolean | void>;
311
+ /** Leave edit mode (0.8.0): clear `editingMessage` in response; the view restores the unsent draft. */
312
+ onCancelEdit?: () => void;
313
+ /** Delete a message after confirmation (0.8.0); `false` means it was not accepted. Without it rows offer no
314
+ * delete action.
315
+ */
316
+ onDeleteMessage?: (message: Message) => boolean | void | Promise<boolean | void>;
317
+ /** Replaces the default row eligibility (own confirmed rows while the viewer's role is not `READ`). */
318
+ canEditMessage?: (message: Message) => boolean;
319
+ /** Replaces the inline "Delete this message?" prompt (and confirms `remove()` from custom rows). */
320
+ confirmDelete?: (message: Message) => boolean | Promise<boolean>;
245
321
  isInitialLoading?: boolean;
246
322
  isLoadingOlder?: boolean;
247
323
  isSending?: boolean;
@@ -321,6 +397,34 @@ declare const ConversationView: vue.DefineComponent<vue.ExtractPropTypes<{
321
397
  readonly type: PropType<(media: MessageMedia, message: Message) => void>;
322
398
  readonly default: undefined;
323
399
  };
400
+ readonly editingMessage: {
401
+ readonly type: PropType<Message | null>;
402
+ readonly default: null;
403
+ };
404
+ readonly onEditMessage: {
405
+ readonly type: PropType<(message: Message) => void>;
406
+ readonly default: undefined;
407
+ };
408
+ readonly onSaveEdit: {
409
+ readonly type: PropType<(message: Message, text: string) => boolean | void | Promise<boolean | void>>;
410
+ readonly default: undefined;
411
+ };
412
+ readonly onCancelEdit: {
413
+ readonly type: PropType<() => void>;
414
+ readonly default: undefined;
415
+ };
416
+ readonly onDeleteMessage: {
417
+ readonly type: PropType<(message: Message) => boolean | void | Promise<boolean | void>>;
418
+ readonly default: undefined;
419
+ };
420
+ readonly canEditMessage: {
421
+ readonly type: PropType<(message: Message) => boolean>;
422
+ readonly default: undefined;
423
+ };
424
+ readonly confirmDelete: {
425
+ readonly type: PropType<(message: Message) => boolean | Promise<boolean>>;
426
+ readonly default: undefined;
427
+ };
324
428
  readonly isInitialLoading: {
325
429
  readonly type: BooleanConstructor;
326
430
  readonly default: false;
@@ -411,7 +515,7 @@ declare const ConversationView: vue.DefineComponent<vue.ExtractPropTypes<{
411
515
  };
412
516
  }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
413
517
  [key: string]: any;
414
- }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("load-older" | "attachment-click" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue")[], "load-older" | "attachment-click" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
518
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("load-older" | "attachment-click" | "edit-message" | "delete-message" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue" | "save-edit" | "cancel-edit")[], "load-older" | "attachment-click" | "edit-message" | "delete-message" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue" | "save-edit" | "cancel-edit", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
415
519
  readonly conversation: {
416
520
  readonly type: PropType<Conversation$1>;
417
521
  readonly required: true;
@@ -468,6 +572,34 @@ declare const ConversationView: vue.DefineComponent<vue.ExtractPropTypes<{
468
572
  readonly type: PropType<(media: MessageMedia, message: Message) => void>;
469
573
  readonly default: undefined;
470
574
  };
575
+ readonly editingMessage: {
576
+ readonly type: PropType<Message | null>;
577
+ readonly default: null;
578
+ };
579
+ readonly onEditMessage: {
580
+ readonly type: PropType<(message: Message) => void>;
581
+ readonly default: undefined;
582
+ };
583
+ readonly onSaveEdit: {
584
+ readonly type: PropType<(message: Message, text: string) => boolean | void | Promise<boolean | void>>;
585
+ readonly default: undefined;
586
+ };
587
+ readonly onCancelEdit: {
588
+ readonly type: PropType<() => void>;
589
+ readonly default: undefined;
590
+ };
591
+ readonly onDeleteMessage: {
592
+ readonly type: PropType<(message: Message) => boolean | void | Promise<boolean | void>>;
593
+ readonly default: undefined;
594
+ };
595
+ readonly canEditMessage: {
596
+ readonly type: PropType<(message: Message) => boolean>;
597
+ readonly default: undefined;
598
+ };
599
+ readonly confirmDelete: {
600
+ readonly type: PropType<(message: Message) => boolean | Promise<boolean>>;
601
+ readonly default: undefined;
602
+ };
471
603
  readonly isInitialLoading: {
472
604
  readonly type: BooleanConstructor;
473
605
  readonly default: false;
@@ -559,12 +691,16 @@ declare const ConversationView: vue.DefineComponent<vue.ExtractPropTypes<{
559
691
  }>> & Readonly<{
560
692
  "onLoad-older"?: (...args: any[]) => any;
561
693
  "onAttachment-click"?: (...args: any[]) => any;
694
+ "onEdit-message"?: (...args: any[]) => any;
695
+ "onDelete-message"?: (...args: any[]) => any;
562
696
  onBack?: (...args: any[]) => any;
563
697
  onRefresh?: (...args: any[]) => any;
564
698
  "onSend-message"?: (...args: any[]) => any;
565
699
  "onTyping-change"?: (...args: any[]) => any;
566
700
  "onAdd-attachment"?: (...args: any[]) => any;
567
701
  "onUpdate:modelValue"?: (...args: any[]) => any;
702
+ "onSave-edit"?: (...args: any[]) => any;
703
+ "onCancel-edit"?: (...args: any[]) => any;
568
704
  }>, {
569
705
  readonly typingUserIds: ReadonlySet<string>;
570
706
  readonly readAtByUserId: ReadonlyMap<string, Date>;
@@ -573,9 +709,14 @@ declare const ConversationView: vue.DefineComponent<vue.ExtractPropTypes<{
573
709
  readonly isLoadingOlder: boolean;
574
710
  readonly isSending: boolean;
575
711
  readonly hasOlderMessages: boolean;
712
+ readonly editingMessage: Message | null;
576
713
  readonly readersResolver: (message: Message) => ReadonlySet<string>;
577
714
  readonly onLoadOlder: () => void | Promise<void>;
578
715
  readonly onAttachmentClick: (media: MessageMedia, message: Message) => void;
716
+ readonly onEditMessage: (message: Message) => void;
717
+ readonly onDeleteMessage: (message: Message) => boolean | void | Promise<boolean | void>;
718
+ readonly canEditMessage: (message: Message) => boolean;
719
+ readonly confirmDelete: (message: Message) => boolean | Promise<boolean>;
579
720
  readonly paginationThreshold: number;
580
721
  readonly stickToBottom: boolean;
581
722
  readonly formatTime: (date: Date) => string;
@@ -588,6 +729,8 @@ declare const ConversationView: vue.DefineComponent<vue.ExtractPropTypes<{
588
729
  readonly onRefresh: () => void | Promise<void>;
589
730
  readonly onTypingChange: (isTyping: boolean) => void | Promise<void>;
590
731
  readonly onAddAttachment: () => void;
732
+ readonly onSaveEdit: (message: Message, text: string) => boolean | void | Promise<boolean | void>;
733
+ readonly onCancelEdit: () => void;
591
734
  readonly displayNameForUser: (userId: string) => string | null | undefined;
592
735
  readonly reverseMessages: boolean;
593
736
  readonly composerPlaceholder: string;
@@ -597,7 +740,7 @@ declare const ConversationView: vue.DefineComponent<vue.ExtractPropTypes<{
597
740
  readonly defaultDraft: string;
598
741
  readonly onDraftChange: (value: string) => void;
599
742
  }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
600
- interface ConversationProps extends Omit<ConversationViewProps, 'conversation' | 'messages' | 'currentUserId' | 'onSendMessage' | 'typingUserIds' | 'readAtByUserId' | 'readPositionByUserId' | 'onRefresh' | 'onLoadOlder' | 'onTypingChange' | 'isInitialLoading' | 'isLoadingOlder' | 'isSending' | 'hasOlderMessages' | 'error'>, Omit<UseConversationOptions, 'client' | 'conversationId'> {
743
+ interface ConversationProps extends Omit<ConversationViewProps, 'conversation' | 'messages' | 'currentUserId' | 'onSendMessage' | 'typingUserIds' | 'readAtByUserId' | 'readPositionByUserId' | 'onRefresh' | 'onLoadOlder' | 'onTypingChange' | 'isInitialLoading' | 'isLoadingOlder' | 'isSending' | 'hasOlderMessages' | 'error' | 'editingMessage' | 'onEditMessage' | 'onSaveEdit' | 'onCancelEdit' | 'onDeleteMessage'>, Omit<UseConversationOptions, 'client' | 'conversationId'> {
601
744
  client: ConvoKitUiClient;
602
745
  conversationId: string;
603
746
  onControllerChange?: (controller: ConversationController) => void;
@@ -620,6 +763,26 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
620
763
  type: PropType<(text: string) => boolean | void | Promise<boolean | void>>;
621
764
  default: undefined;
622
765
  };
766
+ editingMessage: {
767
+ type: PropType<Message | null>;
768
+ default: undefined;
769
+ };
770
+ onEditMessage: {
771
+ type: PropType<(message: Message) => void>;
772
+ default: undefined;
773
+ };
774
+ onSaveEdit: {
775
+ type: PropType<(message: Message, text: string) => boolean | void | Promise<boolean | void>>;
776
+ default: undefined;
777
+ };
778
+ onCancelEdit: {
779
+ type: PropType<() => void>;
780
+ default: undefined;
781
+ };
782
+ onDeleteMessage: {
783
+ type: PropType<(message: Message) => boolean | void | Promise<boolean | void>>;
784
+ default: undefined;
785
+ };
623
786
  client: {
624
787
  type: PropType<ConvoKitUiClient>;
625
788
  required: true;
@@ -692,6 +855,14 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
692
855
  readonly type: PropType<(media: MessageMedia, message: Message) => void>;
693
856
  readonly default: undefined;
694
857
  };
858
+ canEditMessage: {
859
+ readonly type: PropType<(message: Message) => boolean>;
860
+ readonly default: undefined;
861
+ };
862
+ confirmDelete: {
863
+ readonly type: PropType<(message: Message) => boolean | Promise<boolean>>;
864
+ readonly default: undefined;
865
+ };
695
866
  isInitialLoading: {
696
867
  readonly type: BooleanConstructor;
697
868
  readonly default: false;
@@ -782,7 +953,7 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
782
953
  };
783
954
  }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
784
955
  [key: string]: any;
785
- }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("load-older" | "attachment-click" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue" | "controller-change")[], "load-older" | "attachment-click" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue" | "controller-change", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
956
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("load-older" | "attachment-click" | "edit-message" | "delete-message" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue" | "save-edit" | "cancel-edit" | "controller-change")[], "load-older" | "attachment-click" | "edit-message" | "delete-message" | "send-message" | "typing-change" | "back" | "refresh" | "add-attachment" | "update:modelValue" | "save-edit" | "cancel-edit" | "controller-change", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
786
957
  conversation: {
787
958
  type: PropType<Conversation$1>;
788
959
  default: undefined;
@@ -799,6 +970,26 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
799
970
  type: PropType<(text: string) => boolean | void | Promise<boolean | void>>;
800
971
  default: undefined;
801
972
  };
973
+ editingMessage: {
974
+ type: PropType<Message | null>;
975
+ default: undefined;
976
+ };
977
+ onEditMessage: {
978
+ type: PropType<(message: Message) => void>;
979
+ default: undefined;
980
+ };
981
+ onSaveEdit: {
982
+ type: PropType<(message: Message, text: string) => boolean | void | Promise<boolean | void>>;
983
+ default: undefined;
984
+ };
985
+ onCancelEdit: {
986
+ type: PropType<() => void>;
987
+ default: undefined;
988
+ };
989
+ onDeleteMessage: {
990
+ type: PropType<(message: Message) => boolean | void | Promise<boolean | void>>;
991
+ default: undefined;
992
+ };
802
993
  client: {
803
994
  type: PropType<ConvoKitUiClient>;
804
995
  required: true;
@@ -871,6 +1062,14 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
871
1062
  readonly type: PropType<(media: MessageMedia, message: Message) => void>;
872
1063
  readonly default: undefined;
873
1064
  };
1065
+ canEditMessage: {
1066
+ readonly type: PropType<(message: Message) => boolean>;
1067
+ readonly default: undefined;
1068
+ };
1069
+ confirmDelete: {
1070
+ readonly type: PropType<(message: Message) => boolean | Promise<boolean>>;
1071
+ readonly default: undefined;
1072
+ };
874
1073
  isInitialLoading: {
875
1074
  readonly type: BooleanConstructor;
876
1075
  readonly default: false;
@@ -962,12 +1161,16 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
962
1161
  }>> & Readonly<{
963
1162
  "onLoad-older"?: (...args: any[]) => any;
964
1163
  "onAttachment-click"?: (...args: any[]) => any;
1164
+ "onEdit-message"?: (...args: any[]) => any;
1165
+ "onDelete-message"?: (...args: any[]) => any;
965
1166
  onBack?: (...args: any[]) => any;
966
1167
  onRefresh?: (...args: any[]) => any;
967
1168
  "onSend-message"?: (...args: any[]) => any;
968
1169
  "onTyping-change"?: (...args: any[]) => any;
969
1170
  "onAdd-attachment"?: (...args: any[]) => any;
970
1171
  "onUpdate:modelValue"?: (...args: any[]) => any;
1172
+ "onSave-edit"?: (...args: any[]) => any;
1173
+ "onCancel-edit"?: (...args: any[]) => any;
971
1174
  "onController-change"?: (...args: any[]) => any;
972
1175
  }>, {
973
1176
  messages: readonly Message[];
@@ -980,9 +1183,14 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
980
1183
  isSending: boolean;
981
1184
  hasOlderMessages: boolean;
982
1185
  currentUserId: string;
1186
+ editingMessage: Message | null;
983
1187
  readersResolver: (message: Message) => ReadonlySet<string>;
984
1188
  onLoadOlder: () => void | Promise<void>;
985
1189
  onAttachmentClick: (media: MessageMedia, message: Message) => void;
1190
+ onEditMessage: (message: Message) => void;
1191
+ onDeleteMessage: (message: Message) => boolean | void | Promise<boolean | void>;
1192
+ canEditMessage: (message: Message) => boolean;
1193
+ confirmDelete: (message: Message) => boolean | Promise<boolean>;
986
1194
  paginationThreshold: number;
987
1195
  stickToBottom: boolean;
988
1196
  formatTime: (date: Date) => string;
@@ -996,6 +1204,8 @@ declare const Conversation: vue.DefineComponent<vue.ExtractPropTypes<{
996
1204
  onRefresh: () => void | Promise<void>;
997
1205
  onTypingChange: (isTyping: boolean) => void | Promise<void>;
998
1206
  onAddAttachment: () => void;
1207
+ onSaveEdit: (message: Message, text: string) => boolean | void | Promise<boolean | void>;
1208
+ onCancelEdit: () => void;
999
1209
  displayNameForUser: (userId: string) => string | null | undefined;
1000
1210
  reverseMessages: boolean;
1001
1211
  composerPlaceholder: string;
@@ -1508,6 +1718,18 @@ interface MessageListViewProps extends ConvoKitAppearanceProps {
1508
1718
  isLoadingOlder?: boolean;
1509
1719
  error?: unknown;
1510
1720
  onAttachmentClick?: (media: MessageMedia, message: Message) => void;
1721
+ /** Start editing a message (0.8.0). Without it no row offers an edit action and the markup is unchanged. */
1722
+ onEditMessage?: (message: Message) => void;
1723
+ /** Delete a message after confirmation (0.8.0); `false` means the deletion was not accepted. Without it no row
1724
+ * offers a delete action.
1725
+ */
1726
+ onDeleteMessage?: (message: Message) => boolean | void | Promise<boolean | void>;
1727
+ /** Replaces the default eligibility (the viewer's own confirmed rows while the viewer's role is not `READ`) for
1728
+ * both actions; pending rows are never eligible.
1729
+ */
1730
+ canEditMessage?: (message: Message) => boolean;
1731
+ /** Replaces the row's inline "Delete this message?" prompt (and confirms `remove()` from custom rows). */
1732
+ confirmDelete?: (message: Message) => boolean | Promise<boolean>;
1511
1733
  scrollElement?: Ref<HTMLElement | null>;
1512
1734
  paginationThreshold?: number;
1513
1735
  reverse?: boolean;
@@ -1563,6 +1785,22 @@ declare const MessageListView: vue.DefineComponent<vue.ExtractPropTypes<{
1563
1785
  type: PropType<(media: MessageMedia, message: Message) => void>;
1564
1786
  default: undefined;
1565
1787
  };
1788
+ onEditMessage: {
1789
+ type: PropType<(message: Message) => void>;
1790
+ default: undefined;
1791
+ };
1792
+ onDeleteMessage: {
1793
+ type: PropType<(message: Message) => boolean | void | Promise<boolean | void>>;
1794
+ default: undefined;
1795
+ };
1796
+ canEditMessage: {
1797
+ type: PropType<(message: Message) => boolean>;
1798
+ default: undefined;
1799
+ };
1800
+ confirmDelete: {
1801
+ type: PropType<(message: Message) => boolean | Promise<boolean>>;
1802
+ default: undefined;
1803
+ };
1566
1804
  scrollElement: {
1567
1805
  type: PropType<Ref<HTMLElement | null>>;
1568
1806
  default: undefined;
@@ -1605,7 +1843,7 @@ declare const MessageListView: vue.DefineComponent<vue.ExtractPropTypes<{
1605
1843
  };
1606
1844
  }>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
1607
1845
  [key: string]: any;
1608
- }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("load-older" | "attachment-click")[], "load-older" | "attachment-click", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
1846
+ }>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("load-older" | "attachment-click" | "edit-message" | "delete-message")[], "load-older" | "attachment-click" | "edit-message" | "delete-message", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
1609
1847
  conversation: {
1610
1848
  type: PropType<Conversation$1>;
1611
1849
  required: true;
@@ -1650,6 +1888,22 @@ declare const MessageListView: vue.DefineComponent<vue.ExtractPropTypes<{
1650
1888
  type: PropType<(media: MessageMedia, message: Message) => void>;
1651
1889
  default: undefined;
1652
1890
  };
1891
+ onEditMessage: {
1892
+ type: PropType<(message: Message) => void>;
1893
+ default: undefined;
1894
+ };
1895
+ onDeleteMessage: {
1896
+ type: PropType<(message: Message) => boolean | void | Promise<boolean | void>>;
1897
+ default: undefined;
1898
+ };
1899
+ canEditMessage: {
1900
+ type: PropType<(message: Message) => boolean>;
1901
+ default: undefined;
1902
+ };
1903
+ confirmDelete: {
1904
+ type: PropType<(message: Message) => boolean | Promise<boolean>>;
1905
+ default: undefined;
1906
+ };
1653
1907
  scrollElement: {
1654
1908
  type: PropType<Ref<HTMLElement | null>>;
1655
1909
  default: undefined;
@@ -1693,6 +1947,8 @@ declare const MessageListView: vue.DefineComponent<vue.ExtractPropTypes<{
1693
1947
  }>> & Readonly<{
1694
1948
  "onLoad-older"?: (...args: any[]) => any;
1695
1949
  "onAttachment-click"?: (...args: any[]) => any;
1950
+ "onEdit-message"?: (...args: any[]) => any;
1951
+ "onDelete-message"?: (...args: any[]) => any;
1696
1952
  }>, {
1697
1953
  reverse: boolean;
1698
1954
  readAtByUserId: ReadonlyMap<string, Date>;
@@ -1702,6 +1958,10 @@ declare const MessageListView: vue.DefineComponent<vue.ExtractPropTypes<{
1702
1958
  readersResolver: (message: Message) => ReadonlySet<string>;
1703
1959
  onLoadOlder: () => void | Promise<void>;
1704
1960
  onAttachmentClick: (media: MessageMedia, message: Message) => void;
1961
+ onEditMessage: (message: Message) => void;
1962
+ onDeleteMessage: (message: Message) => boolean | void | Promise<boolean | void>;
1963
+ canEditMessage: (message: Message) => boolean;
1964
+ confirmDelete: (message: Message) => boolean | Promise<boolean>;
1705
1965
  scrollElement: Ref<HTMLElement | null, HTMLElement | null>;
1706
1966
  paginationThreshold: number;
1707
1967
  stickToBottom: boolean;