@mobilon-dev/chotto 0.3.85 → 0.3.87

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 (151) hide show
  1. package/dist/chotto.css +1 -1
  2. package/dist/components/1_atoms/ButtonContextMenu/ButtonContextMenu.vue2.js +15 -13
  3. package/dist/components/1_atoms/ContactContextMenu/ContactContextMenu.vue2.js +4 -2
  4. package/dist/components/1_atoms/ContextMenu/ContextMenu.vue.js +43 -39
  5. package/dist/components/1_atoms/EmojiGlyph/EmojiGlyph.vue.js +7 -5
  6. package/dist/components/1_atoms/LoadingIndicator/LoadingIndicator.vue.js +19 -18
  7. package/dist/components/1_atoms/Tooltip/Tooltip.vue.js +2 -2
  8. package/dist/components/1_atoms/Tooltip/Tooltip.vue2.js +83 -72
  9. package/dist/components/2_blocks/CommunicationPanel/CommunicationPanel.vue.js +174 -165
  10. package/dist/components/2_blocks/CommunicationPanel/composables/useCommunicationActions.js +21 -18
  11. package/dist/components/2_blocks/CommunicationPanel/composables/useCommunicationMenu.js +32 -27
  12. package/dist/components/2_blocks/CommunicationPanel/composables/useCommunicationSubMenu.js +44 -35
  13. package/dist/components/2_blocks/FeedSearch/FeedSearch.vue2.js +11 -10
  14. package/dist/components/2_chatinput_elements/ButtonCommandsSelector/ButtonCommandsSelector.vue2.js +4 -2
  15. package/dist/components/2_chatinput_elements/ButtonEmojiPicker/ButtonEmojiPicker.vue2.js +18 -16
  16. package/dist/components/2_chatinput_elements/ButtonTemplateSelector/ButtonTemplateSelector.vue2.js +16 -14
  17. package/dist/components/2_chatinput_elements/ButtonWabaTemplateSelector/ButtonWabaTemplateSelector.vue.js +4 -2
  18. package/dist/components/2_chatinput_elements/FilePreview/FilePreview.vue2.js +4 -2
  19. package/dist/components/2_chatinput_elements/FileUploader/FileUploader.vue2.js +4 -2
  20. package/dist/components/2_chatinput_elements/StickerPicker/StickerPicker.vue2.js +4 -2
  21. package/dist/components/2_chatinput_elements/TemplateSelector/TemplateSelector.vue.js +4 -2
  22. package/dist/components/2_chatinput_elements/TextFormatToolbar/TextFormatToolbar.vue2.js +4 -3
  23. package/dist/components/2_chatinput_elements/WABAAttachmentSection/WABAAttachmentSection.vue2.js +4 -2
  24. package/dist/components/2_chatlist_elements/ChatItem/ChatItem.vue2.js +3 -2
  25. package/dist/components/2_elements/AudioRecorder/AudioRecorder.vue2.js +4 -2
  26. package/dist/components/2_elements/ChannelSelector/ChannelSelector.vue.js +3 -2
  27. package/dist/components/2_elements/ThemeMode/ThemeMode.vue.js +7 -5
  28. package/dist/components/2_elements/VideoRecorder/VideoRecorder.vue2.js +4 -2
  29. package/dist/components/2_feed_elements/AudioMessage/AudioMessage.vue.js +1 -1
  30. package/dist/components/2_feed_elements/AudioMessage/AudioMessage.vue2.js +387 -340
  31. package/dist/components/2_feed_elements/BaseEditMessage/BaseEditMessage.vue.js +7 -0
  32. package/dist/components/2_feed_elements/BaseEditMessage/BaseEditMessage.vue2.js +34 -0
  33. package/dist/components/2_feed_elements/CallMessage/CallMessage.vue.js +2 -2
  34. package/dist/components/2_feed_elements/CallMessage/CallMessage.vue2.js +388 -352
  35. package/dist/components/2_feed_elements/DeletedMessageContent/DeletedMessageContent.vue.js +7 -0
  36. package/dist/components/2_feed_elements/DeletedMessageContent/DeletedMessageContent.vue2.js +63 -0
  37. package/dist/components/2_feed_elements/DeletedMessageContent/icons/DeletedMessageIcon.vue.js +21 -0
  38. package/dist/components/2_feed_elements/EditTextMessage/EditTextMessage.vue.js +7 -0
  39. package/dist/components/2_feed_elements/EditTextMessage/EditTextMessage.vue2.js +35 -0
  40. package/dist/components/2_feed_elements/FileMessage/FileMessage.vue.js +2 -2
  41. package/dist/components/2_feed_elements/FileMessage/FileMessage.vue2.js +204 -157
  42. package/dist/components/2_feed_elements/ImageMessage/ImageMessage.vue.js +3 -3
  43. package/dist/components/2_feed_elements/ImageMessage/ImageMessage.vue2.js +273 -226
  44. package/dist/components/2_feed_elements/MessageKeyboard/MessageKeyboard.vue2.js +9 -7
  45. package/dist/components/2_feed_elements/MessageReactions/MessageReactions.vue.js +2 -2
  46. package/dist/components/2_feed_elements/MessageReactions/MessageReactions.vue2.js +141 -117
  47. package/dist/components/2_feed_elements/MessageReactions/icons/DeleteIcon.vue.js +32 -0
  48. package/dist/components/2_feed_elements/MessageReactions/icons/EditIcon.vue.js +32 -0
  49. package/dist/components/2_feed_elements/MessageReactions/icons/MessageActionsIcon.vue.js +21 -0
  50. package/dist/components/2_feed_elements/MissedCallMessage/MissedCallMessage.vue.js +4 -4
  51. package/dist/components/2_feed_elements/MissedCallMessage/MissedCallMessage.vue2.js +102 -66
  52. package/dist/components/2_feed_elements/ReplyAudioMessage/ReplyAudioMessage.vue2.js +11 -9
  53. package/dist/components/2_feed_elements/ReplyFileMessage/ReplyFileMessage.vue2.js +14 -12
  54. package/dist/components/2_feed_elements/ReplyImageMessage/ReplyImageMessage.vue2.js +11 -9
  55. package/dist/components/2_feed_elements/ReplyStickerMessage/ReplyStickerMessage.vue2.js +13 -11
  56. package/dist/components/2_feed_elements/ReplyTextMessage/ReplyTextMessage.vue2.js +11 -9
  57. package/dist/components/2_feed_elements/ReplyVideoMessage/ReplyVideoMessage.vue2.js +4 -2
  58. package/dist/components/2_feed_elements/StickerMessage/StickerMessage.vue.js +2 -2
  59. package/dist/components/2_feed_elements/StickerMessage/StickerMessage.vue2.js +255 -210
  60. package/dist/components/2_feed_elements/TextMessage/TextMessage.vue.js +1 -1
  61. package/dist/components/2_feed_elements/TextMessage/TextMessage.vue2.js +241 -140
  62. package/dist/components/2_feed_elements/VideoMessage/VideoMessage.vue.js +3 -3
  63. package/dist/components/2_feed_elements/VideoMessage/VideoMessage.vue2.js +245 -200
  64. package/dist/components/2_modals/ConfirmDeleteMessage/ConfirmDeleteMessage.vue.js +7 -0
  65. package/dist/components/2_modals/ConfirmDeleteMessage/ConfirmDeleteMessage.vue3.js +58 -0
  66. package/dist/components/3_compounds/ChatInput/ChatInput.vue.js +2 -2
  67. package/dist/components/3_compounds/ChatInput/ChatInput.vue2.js +5 -4
  68. package/dist/components/3_compounds/ChatList/ChatListHeader.vue.js +8 -8
  69. package/dist/components/3_compounds/ChatList/icons/LogoIcon.vue.js +12 -13
  70. package/dist/components/3_compounds/Feed/Feed.vue.js +2 -2
  71. package/dist/components/3_compounds/Feed/Feed.vue2.js +187 -163
  72. package/dist/components/3_compounds/Feed/composables/useFeedComponents.js +41 -26
  73. package/dist/components/3_compounds/Feed/composables/useFeedReply.js +16 -11
  74. package/dist/components/3_compounds/Feed/utils/getDefaultMessageMenuActions.js +31 -0
  75. package/dist/hooks/messages/buildEditPayload.js +10 -0
  76. package/dist/hooks/messages/calculateMessageMenuPosition.js +70 -0
  77. package/dist/hooks/messages/getDeletedOriginalText.js +26 -0
  78. package/dist/hooks/messages/getEditTooltipLines.js +28 -0
  79. package/dist/hooks/messages/useMessageActions.js +94 -19
  80. package/dist/hooks/messages/useMessageMenuActions.js +18 -0
  81. package/dist/hooks/messages/useStartEdit.js +30 -0
  82. package/dist/hooks/messages/useStartReply.js +16 -14
  83. package/dist/hooks/modals/useConfirmDeleteMessage.js +24 -0
  84. package/dist/hooks/useMessageDraft.js +46 -66
  85. package/dist/hooks/validators/messages/messageValidator.js +29 -35
  86. package/dist/index.js +220 -194
  87. package/dist/locale/en.js +6 -1
  88. package/dist/locale/ru.js +6 -1
  89. package/dist/themes/dark.css +1 -1
  90. package/dist/themes/default.css +1 -1
  91. package/dist/themes/glass.css +1 -1
  92. package/dist/themes/green.css +1 -1
  93. package/dist/themes/mobilon1.css +1 -1
  94. package/dist/types/apps/data/messages.d.ts +0 -321
  95. package/dist/types/components/1_atoms/ContextMenu/ContextMenu.vue.d.ts +0 -2
  96. package/dist/types/components/1_atoms/ContextMenu/stories/ContextMenu.stories.d.ts +1 -0
  97. package/dist/types/components/1_atoms/ContextMenu/styles/types.d.ts +18 -0
  98. package/dist/types/components/1_atoms/LoadingIndicator/styles/types.d.ts +0 -2
  99. package/dist/types/components/1_atoms/Tooltip/Tooltip.vue.d.ts +12 -1
  100. package/dist/types/components/2_blocks/CommunicationPanel/CommunicationPanel.vue.d.ts +2 -0
  101. package/dist/types/components/2_blocks/CommunicationPanel/composables/useCommunicationActions.d.ts +3 -1
  102. package/dist/types/components/2_blocks/CommunicationPanel/composables/useCommunicationMenu.d.ts +3 -0
  103. package/dist/types/components/2_blocks/CommunicationPanel/composables/useCommunicationSubMenu.d.ts +4 -2
  104. package/dist/types/components/2_blocks/CommunicationPanel/stories/CommunicationPanel.stories.d.ts +1 -0
  105. package/dist/types/components/2_feed_elements/BaseEditMessage/BaseEditMessage.vue.d.ts +23 -0
  106. package/dist/types/components/2_feed_elements/BaseEditMessage/stories/BaseEditMessage.stories.d.ts +6 -0
  107. package/dist/types/components/2_feed_elements/DeletedMessageContent/DeletedMessageContent.vue.d.ts +31 -0
  108. package/dist/types/components/2_feed_elements/DeletedMessageContent/icons/DeletedMessageIcon.vue.d.ts +2 -0
  109. package/dist/types/components/2_feed_elements/DeletedMessageContent/styles/types.d.ts +35 -0
  110. package/dist/types/components/2_feed_elements/EditTextMessage/EditTextMessage.vue.d.ts +13 -0
  111. package/dist/types/components/2_feed_elements/EditTextMessage/stories/EditTextMessage.stories.d.ts +7 -0
  112. package/dist/types/components/2_feed_elements/FeedKeyboard/FeedKeyboard.vue.d.ts +1 -1
  113. package/dist/types/components/2_feed_elements/MessageKeyboard/MessageKeyboard.vue.d.ts +1 -1
  114. package/dist/types/components/2_feed_elements/MessageReactions/MessageReactions.vue.d.ts +35 -0
  115. package/dist/types/components/2_feed_elements/MessageReactions/icons/DeleteIcon.vue.d.ts +2 -0
  116. package/dist/types/components/2_feed_elements/MessageReactions/icons/EditIcon.vue.d.ts +2 -0
  117. package/dist/types/components/2_feed_elements/MessageReactions/icons/MessageActionsIcon.vue.d.ts +2 -0
  118. package/dist/types/components/2_feed_elements/TextMessage/TextMessage.vue.d.ts +11 -3
  119. package/dist/types/components/2_feed_elements/TextMessage/stories/TextMessage.stories.d.ts +1 -0
  120. package/dist/types/components/2_feed_elements/TextMessage/styles/types.d.ts +22 -0
  121. package/dist/types/components/2_feed_elements/VideoMessage/stories/VideoMessage.stories.d.ts +2 -2
  122. package/dist/types/components/2_feed_elements/types/components.d.ts +1 -2
  123. package/dist/types/components/2_feed_elements/types/messages.d.ts +116 -9
  124. package/dist/types/components/2_modals/ConfirmDeleteMessage/ConfirmDeleteMessage.vue.d.ts +22 -0
  125. package/dist/types/components/2_modals/ConfirmDeleteMessage/stories/ConfirmDeleteMessage.stories.d.ts +37 -0
  126. package/dist/types/components/2_modals/ConfirmDeleteMessage/styles/types.d.ts +97 -0
  127. package/dist/types/components/3_compounds/ChatInput/types/IInputMessage.d.ts +2 -1
  128. package/dist/types/components/3_compounds/ChatList/styles/types.d.ts +2 -2
  129. package/dist/types/components/3_compounds/Feed/Feed.vue.d.ts +20 -3
  130. package/dist/types/components/3_compounds/Feed/composables/useFeedComponents.d.ts +6 -2
  131. package/dist/types/components/3_compounds/Feed/composables/useFeedGrouping.d.ts +0 -1
  132. package/dist/types/components/3_compounds/Feed/composables/useFeedReply.d.ts +7 -1
  133. package/dist/types/components/3_compounds/Feed/utils/getDefaultMessageMenuActions.d.ts +3 -0
  134. package/dist/types/components/3_compounds/SideBar/SideBar.vue.d.ts +2 -2
  135. package/dist/types/components/index.d.ts +4 -0
  136. package/dist/types/hooks/messages/buildEditPayload.d.ts +7 -0
  137. package/dist/types/hooks/messages/calculateMessageMenuPosition.d.ts +16 -0
  138. package/dist/types/hooks/messages/getDeletedOriginalText.d.ts +28 -0
  139. package/dist/types/hooks/messages/getEditTooltipLines.d.ts +17 -0
  140. package/dist/types/hooks/messages/index.d.ts +6 -0
  141. package/dist/types/hooks/messages/useMessageActions.d.ts +33 -39
  142. package/dist/types/hooks/messages/useMessageMenuActions.d.ts +10 -0
  143. package/dist/types/hooks/messages/useStartEdit.d.ts +6 -0
  144. package/dist/types/hooks/modals/index.d.ts +1 -0
  145. package/dist/types/hooks/modals/useConfirmDeleteMessage.d.ts +2 -0
  146. package/dist/types/hooks/useMessageDraft.d.ts +10 -1
  147. package/dist/types/hooks/validators/messages/types.d.ts +0 -6
  148. package/dist/types/locale/en.d.ts +5 -0
  149. package/dist/types/locale/ru.d.ts +5 -0
  150. package/dist/types/main.d.ts +1 -0
  151. package/package.json +1 -1
@@ -1,4 +1,3 @@
1
- import { IAction } from '@types';
2
1
  export interface Reply {
3
2
  messageId: string;
4
3
  type: string;
@@ -9,6 +8,72 @@ export interface Reply {
9
8
  callDuration?: string;
10
9
  isMissedCall?: boolean;
11
10
  }
11
+ /** Сообщение в режиме редактирования (превью над инпутом) */
12
+ export interface Edit {
13
+ messageId: string;
14
+ type: string;
15
+ text?: string;
16
+ }
17
+ /**
18
+ * Одна запись в истории правки сообщения
19
+ */
20
+ export interface MessageEditRecord {
21
+ /** Текст сообщения после этой правки */
22
+ text?: string;
23
+ /** Кто изменил */
24
+ editedBy?: string;
25
+ /** Когда изменили (уже отформатированная строка, напр. «20.07.2026 в 11:08») */
26
+ editedAt?: string;
27
+ }
28
+ /**
29
+ * Снимок правки для метки «изменено» и тултипа.
30
+ * При отправке заполняется сразу; при наведении хост может обновить через fetchEditInfo.
31
+ */
32
+ export interface MessageEditInfo {
33
+ /** Оригинальный текст до первой правки */
34
+ originalText?: string;
35
+ /** Кто изменил (последняя правка; для обратной совместимости) */
36
+ editedBy?: string;
37
+ /** Когда изменили (последняя правка; для обратной совместимости) */
38
+ editedAt?: string;
39
+ /** История правок от старых к новым */
40
+ history?: MessageEditRecord[];
41
+ }
42
+ /**
43
+ * Данные удаления для тултипа «Сообщение удалено»:
44
+ * текст + «Имя, дата в время».
45
+ */
46
+ export interface MessageDeleteInfo {
47
+ /** Кто удалил */
48
+ deletedBy?: string;
49
+ /** Когда удалили (уже отформатированная строка, напр. «20.07.26 в 11:08») */
50
+ deletedAt?: string;
51
+ }
52
+ /** Контекст сообщения для условий пунктов меню */
53
+ export type MessageMenuActionContext = {
54
+ messageId?: string;
55
+ position?: string;
56
+ type?: string;
57
+ deleted?: boolean;
58
+ /** Можно ли ещё редактировать (окно не истекло); `false` — пункт «Редактировать» disabled */
59
+ canEdit?: boolean;
60
+ /** Можно ли ещё удалить (окно не истекло); `false` — пункт «Удалить» disabled */
61
+ canDelete?: boolean;
62
+ };
63
+ /** Пункт контекстного меню сообщения (задаётся пропом Feed) */
64
+ export interface IFeedMessageMenuAction {
65
+ action?: string;
66
+ title?: string;
67
+ /** URL или Vue-компонент иконки */
68
+ icon?: string | object;
69
+ prime?: string;
70
+ /** Недоступен: флаг или функция от сообщения */
71
+ disabled?: boolean | ((message: MessageMenuActionContext) => boolean);
72
+ /** Красный пункт (например, «Удалить») */
73
+ danger?: boolean;
74
+ /** Разделитель между группами пунктов */
75
+ separator?: boolean;
76
+ }
12
77
  export interface ILinkPreview {
13
78
  title: string;
14
79
  imageUrl: string;
@@ -84,7 +149,6 @@ export interface IAudioMessage {
84
149
  avatar?: string;
85
150
  header?: string;
86
151
  subText?: string;
87
- actions?: IAction[];
88
152
  views?: number;
89
153
  text?: string;
90
154
  /** Транскрипт со статусом и HTML */
@@ -105,6 +169,12 @@ export interface IAudioMessage {
105
169
  backgroundColor?: string;
106
170
  hasMessengerAccount?: boolean;
107
171
  isVoiceMessage?: boolean;
172
+ deleted?: boolean;
173
+ deletion?: MessageDeleteInfo;
174
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
175
+ canEdit?: boolean;
176
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
177
+ canDelete?: boolean;
108
178
  }
109
179
  /** Реплика в JSON из meta.transcript (ответ API) */
110
180
  export interface ICallTranscriptReply {
@@ -144,7 +214,6 @@ export interface ICallMessage {
144
214
  header?: string;
145
215
  subText?: string;
146
216
  text?: string;
147
- actions?: IAction[];
148
217
  views?: number;
149
218
  /** Транскрипт со статусом и HTML */
150
219
  transcript?: IAudioRecognitionPayload;
@@ -153,6 +222,12 @@ export interface ICallMessage {
153
222
  reactions?: MessageReactions;
154
223
  backgroundColor?: string;
155
224
  hasMessengerAccount?: boolean;
225
+ deleted?: boolean;
226
+ deletion?: MessageDeleteInfo;
227
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
228
+ canEdit?: boolean;
229
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
230
+ canDelete?: boolean;
156
231
  }
157
232
  export interface IDateMessage {
158
233
  messageId?: string;
@@ -170,7 +245,6 @@ export interface IFileMessage {
170
245
  avatar?: string;
171
246
  header?: string;
172
247
  subText?: string;
173
- actions?: IAction[];
174
248
  views?: number;
175
249
  text?: string;
176
250
  reply?: Reply;
@@ -181,6 +255,12 @@ export interface IFileMessage {
181
255
  direction?: string;
182
256
  backgroundColor?: string;
183
257
  hasMessengerAccount?: boolean;
258
+ deleted?: boolean;
259
+ deletion?: MessageDeleteInfo;
260
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
261
+ canEdit?: boolean;
262
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
263
+ canDelete?: boolean;
184
264
  }
185
265
  export interface IImageMessage {
186
266
  messageId: string;
@@ -193,7 +273,6 @@ export interface IImageMessage {
193
273
  avatar?: string;
194
274
  header?: string;
195
275
  subText?: string;
196
- actions?: IAction[];
197
276
  views?: number;
198
277
  text?: string;
199
278
  reply?: Reply;
@@ -203,6 +282,12 @@ export interface IImageMessage {
203
282
  reactions?: MessageReactions;
204
283
  backgroundColor?: string;
205
284
  hasMessengerAccount?: boolean;
285
+ deleted?: boolean;
286
+ deletion?: MessageDeleteInfo;
287
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
288
+ canEdit?: boolean;
289
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
290
+ canDelete?: boolean;
206
291
  }
207
292
  export interface ISystemMessage {
208
293
  messageId: string;
@@ -226,15 +311,22 @@ export interface ITextMessage {
226
311
  avatar?: string;
227
312
  header?: string;
228
313
  subText?: string;
229
- actions?: IAction[];
230
314
  views?: number;
231
315
  reply?: Reply;
316
+ /** Данные правки: наличие поля показывает метку «изменено» */
317
+ edited?: MessageEditInfo;
232
318
  linkPreview?: ILinkPreview;
233
319
  embed?: object;
234
320
  keyboard?: IKeyBoard[];
235
321
  reactions?: MessageReactions;
236
322
  backgroundColor?: string;
237
323
  hasMessengerAccount?: boolean;
324
+ deleted?: boolean;
325
+ deletion?: MessageDeleteInfo;
326
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
327
+ canEdit?: boolean;
328
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
329
+ canDelete?: boolean;
238
330
  }
239
331
  export interface ITypingMessage {
240
332
  avatar?: string;
@@ -252,7 +344,6 @@ export interface IVideoMessage {
252
344
  avatar?: string;
253
345
  header?: string;
254
346
  subText?: string;
255
- actions?: IAction[];
256
347
  views?: number;
257
348
  text?: string;
258
349
  reply?: Reply;
@@ -262,6 +353,12 @@ export interface IVideoMessage {
262
353
  reactions?: MessageReactions;
263
354
  backgroundColor?: string;
264
355
  hasMessengerAccount?: boolean;
356
+ deleted?: boolean;
357
+ deletion?: MessageDeleteInfo;
358
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
359
+ canEdit?: boolean;
360
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
361
+ canDelete?: boolean;
265
362
  }
266
363
  export interface IStickerMessage {
267
364
  messageId: string;
@@ -275,7 +372,6 @@ export interface IStickerMessage {
275
372
  avatar?: string;
276
373
  header?: string;
277
374
  subText?: string;
278
- actions?: IAction[];
279
375
  views?: number;
280
376
  text?: string;
281
377
  reply?: Reply;
@@ -285,6 +381,12 @@ export interface IStickerMessage {
285
381
  reactions?: MessageReactions;
286
382
  backgroundColor?: string;
287
383
  hasMessengerAccount?: boolean;
384
+ deleted?: boolean;
385
+ deletion?: MessageDeleteInfo;
386
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
387
+ canEdit?: boolean;
388
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
389
+ canDelete?: boolean;
288
390
  }
289
391
  export interface IMissedCallMessage {
290
392
  messageId: string;
@@ -293,7 +395,12 @@ export interface IMissedCallMessage {
293
395
  avatar?: string;
294
396
  header?: string;
295
397
  subText?: string;
296
- actions?: IAction[];
297
398
  backgroundColor?: string;
298
399
  hasMessengerAccount?: boolean;
400
+ deleted?: boolean;
401
+ deletion?: MessageDeleteInfo;
402
+ /** Можно ли ещё редактировать (если `false` — пункт меню disabled) */
403
+ canEdit?: boolean;
404
+ /** Можно ли ещё удалить (если `false` — пункт меню disabled) */
405
+ canDelete?: boolean;
299
406
  }
@@ -0,0 +1,22 @@
1
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
2
+ theme: {
3
+ type: StringConstructor;
4
+ required: false;
5
+ default: string;
6
+ };
7
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
8
+ cancel: () => any;
9
+ confirm: () => any;
10
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
11
+ theme: {
12
+ type: StringConstructor;
13
+ required: false;
14
+ default: string;
15
+ };
16
+ }>> & Readonly<{
17
+ onCancel?: (() => any) | undefined;
18
+ onConfirm?: (() => any) | undefined;
19
+ }>, {
20
+ theme: string;
21
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
22
+ export default _default;
@@ -0,0 +1,37 @@
1
+ import type { StoryObj } from '@storybook/vue3-vite';
2
+ declare const meta: {
3
+ title: string;
4
+ component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
5
+ theme: {
6
+ type: StringConstructor;
7
+ required: false;
8
+ default: string;
9
+ };
10
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
11
+ cancel: () => any;
12
+ confirm: () => any;
13
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
14
+ theme: {
15
+ type: StringConstructor;
16
+ required: false;
17
+ default: string;
18
+ };
19
+ }>> & Readonly<{
20
+ onCancel?: (() => any) | undefined;
21
+ onConfirm?: (() => any) | undefined;
22
+ }>, {
23
+ theme: string;
24
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
25
+ args: {
26
+ theme: string;
27
+ };
28
+ argTypes: {
29
+ theme: {
30
+ control: "select";
31
+ options: string[];
32
+ };
33
+ };
34
+ };
35
+ export default meta;
36
+ type Story = StoryObj<typeof meta>;
37
+ export declare const Default: Story;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * CSS переменные для компонента ConfirmDeleteMessage
3
+ */
4
+ export interface ConfirmDeleteMessageThemeCSSVariables {
5
+ /** Позиционирование оверлея */
6
+ '--chotto-confirmdeletemessage-backdrop-position': string;
7
+ /** Фон оверлея */
8
+ '--chotto-confirmdeletemessage-backdrop-bg': string;
9
+ /** Фильтр оверлея */
10
+ '--chotto-confirmdeletemessage-backdrop-filter': string;
11
+ /** Отображение оверлея */
12
+ '--chotto-confirmdeletemessage-backdrop-display': string;
13
+ /** Выравнивание по горизонтали */
14
+ '--chotto-confirmdeletemessage-backdrop-justify': string;
15
+ /** Выравнивание по вертикали */
16
+ '--chotto-confirmdeletemessage-backdrop-align': string;
17
+ /** Z-index оверлея */
18
+ '--chotto-confirmdeletemessage-backdrop-z-index': string;
19
+ /** Ширина диалога */
20
+ '--chotto-confirmdeletemessage-width': string;
21
+ /** Высота диалога */
22
+ '--chotto-confirmdeletemessage-height': string;
23
+ /** Внутренние отступы диалога */
24
+ '--chotto-confirmdeletemessage-padding': string;
25
+ /** Фон диалога */
26
+ '--chotto-confirmdeletemessage-background': string;
27
+ /** Граница диалога */
28
+ '--chotto-confirmdeletemessage-border': string;
29
+ /** Тень диалога */
30
+ '--chotto-confirmdeletemessage-box-shadow': string;
31
+ /** Радиус границы диалога */
32
+ '--chotto-confirmdeletemessage-border-radius': string;
33
+ /** Отображение диалога */
34
+ '--chotto-confirmdeletemessage-display': string;
35
+ /** Направление flex диалога */
36
+ '--chotto-confirmdeletemessage-flex-direction': string;
37
+ /** Выравнивание элементов по горизонтали */
38
+ '--chotto-confirmdeletemessage-align-items': string;
39
+ /** Выравнивание содержимого по вертикали */
40
+ '--chotto-confirmdeletemessage-justify-content': string;
41
+ /** Максимальная ширина диалога */
42
+ '--chotto-confirmdeletemessage-max-width': string;
43
+ /** Отступы заголовка */
44
+ '--chotto-confirmdeletemessage-title-margin': string;
45
+ /** Ширина заголовка */
46
+ '--chotto-confirmdeletemessage-title-width': string;
47
+ /** Выравнивание текста заголовка */
48
+ '--chotto-confirmdeletemessage-title-text-align': string;
49
+ /** Семейство шрифтов заголовка */
50
+ '--chotto-confirmdeletemessage-title-font-family': string;
51
+ /** Жирность шрифта заголовка */
52
+ '--chotto-confirmdeletemessage-title-font-weight': string;
53
+ /** Размер шрифта заголовка */
54
+ '--chotto-confirmdeletemessage-title-font-size': string;
55
+ /** Высота строки заголовка */
56
+ '--chotto-confirmdeletemessage-title-line-height': string;
57
+ /** Цвет заголовка */
58
+ '--chotto-confirmdeletemessage-title-color': string;
59
+ /** Отображение блока кнопок */
60
+ '--chotto-confirmdeletemessage-actions-display': string;
61
+ /** Выравнивание кнопок по вертикали */
62
+ '--chotto-confirmdeletemessage-actions-align-items': string;
63
+ /** Выравнивание кнопок по горизонтали */
64
+ '--chotto-confirmdeletemessage-actions-justify-content': string;
65
+ /** Отступ между кнопками */
66
+ '--chotto-confirmdeletemessage-actions-gap': string;
67
+ /** Ширина кнопки */
68
+ '--chotto-confirmdeletemessage-btn-width': string;
69
+ /** Высота кнопки */
70
+ '--chotto-confirmdeletemessage-btn-height': string;
71
+ /** Семейство шрифтов кнопки */
72
+ '--chotto-confirmdeletemessage-btn-font-family': string;
73
+ /** Жирность шрифта кнопки */
74
+ '--chotto-confirmdeletemessage-btn-font-weight': string;
75
+ /** Размер шрифта кнопки */
76
+ '--chotto-confirmdeletemessage-btn-font-size': string;
77
+ /** Курсор кнопки */
78
+ '--chotto-confirmdeletemessage-btn-cursor': string;
79
+ /** Фон кнопки */
80
+ '--chotto-confirmdeletemessage-btn-background': string;
81
+ /** Цвет текста кнопки удаления */
82
+ '--chotto-confirmdeletemessage-btn-delete-color': string;
83
+ /** Граница кнопки удаления */
84
+ '--chotto-confirmdeletemessage-btn-delete-border': string;
85
+ /** Радиус границы кнопки удаления */
86
+ '--chotto-confirmdeletemessage-btn-delete-border-radius': string;
87
+ /** Цвет текста кнопки отмены */
88
+ '--chotto-confirmdeletemessage-btn-cancel-color': string;
89
+ /** Граница кнопки отмены */
90
+ '--chotto-confirmdeletemessage-btn-cancel-border': string;
91
+ /** Переход появления/скрытия */
92
+ '--chotto-confirmdeletemessage-transition': string;
93
+ /** Начальная прозрачность */
94
+ '--chotto-confirmdeletemessage-enter-opacity': string;
95
+ /** Конечная прозрачность */
96
+ '--chotto-confirmdeletemessage-enter-to-opacity': string;
97
+ }
@@ -1,4 +1,4 @@
1
- import { Reply } from "@/types";
1
+ import { Edit, Reply } from "@/types";
2
2
  export interface IInputMessage {
3
3
  type: string;
4
4
  text?: string;
@@ -6,4 +6,5 @@ export interface IInputMessage {
6
6
  filename?: string;
7
7
  size?: string;
8
8
  reply?: Reply;
9
+ edit?: Edit;
9
10
  }
@@ -88,8 +88,8 @@ export interface ChatListThemeCSSVariables {
88
88
  '--chotto-chatlist-title-logo-width': string;
89
89
  /** Высота логотипа заголовка */
90
90
  '--chotto-chatlist-title-logo-height': string;
91
- /** Отступ слева логотипа заголовка */
92
- '--chotto-chatlist-title-logo-margin-left': string;
91
+ /** Отступ справа логотипа заголовка */
92
+ '--chotto-chatlist-title-logo-margin-right': string;
93
93
  /** Коэффициент сжатия логотипа заголовка */
94
94
  '--chotto-chatlist-title-logo-flex-shrink': string;
95
95
  /** Отображение бейджа beta заголовка */
@@ -1,4 +1,4 @@
1
- import { IFeedObject, IFeedTyping, IFeedUnreadButton, IFeedKeyboard } from '@/types';
1
+ import { IFeedObject, IFeedTyping, IFeedUnreadButton, IFeedKeyboard, IFeedMessageMenuAction } from '@/types';
2
2
  declare var __VLS_1: {}, __VLS_47: {};
3
3
  type __VLS_Slots = {} & {
4
4
  prepend?: (props: typeof __VLS_1) => any;
@@ -104,6 +104,14 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
104
104
  required: false;
105
105
  default: undefined;
106
106
  };
107
+ /**
108
+ * Пункты контекстного меню сообщений (с иконками).
109
+ * По умолчанию: Ответить, Редактировать, разделитель, Удалить (красный).
110
+ */
111
+ messageMenuActions: {
112
+ type: () => IFeedMessageMenuAction[];
113
+ default: () => IFeedMessageMenuAction[];
114
+ };
107
115
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
108
116
  loadMore: (...args: any[]) => void;
109
117
  smsInvite: (...args: any[]) => void;
@@ -214,6 +222,14 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
214
222
  required: false;
215
223
  default: undefined;
216
224
  };
225
+ /**
226
+ * Пункты контекстного меню сообщений (с иконками).
227
+ * По умолчанию: Ответить, Редактировать, разделитель, Удалить (красный).
228
+ */
229
+ messageMenuActions: {
230
+ type: () => IFeedMessageMenuAction[];
231
+ default: () => IFeedMessageMenuAction[];
232
+ };
217
233
  }>> & Readonly<{
218
234
  onLoadMore?: ((...args: any[]) => any) | undefined;
219
235
  onSmsInvite?: ((...args: any[]) => any) | undefined;
@@ -227,6 +243,7 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
227
243
  onDelimiterRead?: ((...args: any[]) => any) | undefined;
228
244
  }>, {
229
245
  typing: boolean | IFeedTyping;
246
+ messageMenuActions: IFeedMessageMenuAction[];
230
247
  chatBackground: string;
231
248
  currentUserId: string | number | undefined;
232
249
  reactionUserNames: Record<string, string>;
@@ -238,9 +255,9 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
238
255
  buttonParams: IFeedUnreadButton;
239
256
  scrollToBottom: boolean;
240
257
  scrollTo: string;
241
- keyboardAlign: "left" | "right" | "center";
258
+ keyboardAlign: "center" | "left" | "right";
242
259
  feedKeyboards: IFeedKeyboard[];
243
- feedKeyboardAlign: "left" | "right" | "center";
260
+ feedKeyboardAlign: "center" | "left" | "right";
244
261
  isLoadingMore: boolean;
245
262
  callMessageOnCallback: ((message: IFeedObject) => void) | undefined;
246
263
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -1,6 +1,10 @@
1
1
  /**
2
- * Композабл для маппинга типов сообщений на компоненты
2
+ * Композабл для маппинга типов сообщений на компоненты.
3
+ * Удалённые сообщения ленты всегда рендерятся как TextMessage.
3
4
  */
4
5
  export declare function useFeedComponents(): {
5
- componentsMap: (type: string) => unknown;
6
+ componentsMap: (object: {
7
+ type?: string;
8
+ deleted?: boolean;
9
+ } | string) => unknown;
6
10
  };
@@ -21,7 +21,6 @@ export declare function useFeedGrouping({ objects }: UseFeedGroupingOptions): {
21
21
  filename?: string;
22
22
  avatar?: string;
23
23
  subtext?: string;
24
- actions?: import("@/types").IAction[];
25
24
  views?: number;
26
25
  callDuration?: string;
27
26
  isMissedCall?: boolean;
@@ -4,7 +4,7 @@ interface UseFeedReplyOptions {
4
4
  emit: (event: 'messageAction' | 'clickRepliedMessage', payload: IFeedObject | string) => void;
5
5
  }
6
6
  /**
7
- * Композабл для обработки ответов на сообщения
7
+ * Композабл для обработки ответов и редактирования сообщений
8
8
  */
9
9
  export declare function useFeedReply({ enableDoubleClickReply, emit }: UseFeedReplyOptions): {
10
10
  getMessage: () => {
@@ -26,6 +26,11 @@ export declare function useFeedReply({ enableDoubleClickReply, emit }: UseFeedRe
26
26
  callDuration?: string | undefined;
27
27
  isMissedCall?: boolean | undefined;
28
28
  } | undefined;
29
+ edit?: {
30
+ messageId: string;
31
+ type: string;
32
+ text?: string | undefined;
33
+ } | undefined;
29
34
  forceSend: boolean;
30
35
  isRecording: boolean;
31
36
  };
@@ -33,5 +38,6 @@ export declare function useFeedReply({ enableDoubleClickReply, emit }: UseFeedRe
33
38
  handleClickReplied: (messageId: string) => void;
34
39
  feedObjectDoubleClick: (event: MouseEvent, object: IFeedObject) => void;
35
40
  handleResetReply: () => void;
41
+ handleResetEdit: () => void;
36
42
  };
37
43
  export {};
@@ -0,0 +1,3 @@
1
+ import type { IFeedMessageMenuAction } from '@/types';
2
+ /** Пункты меню сообщения по умолчанию: Ответить, Редактировать | Удалить */
3
+ export declare function getDefaultMessageMenuActions(): IFeedMessageMenuAction[];
@@ -1,8 +1,8 @@
1
1
  declare const _default: import("vue").DefineComponent<{}, {
2
2
  $emit: (event: "selectItem" | "settingsClick", ...args: any[]) => void;
3
3
  sidebarItems: unknown[];
4
- horizontal: boolean;
5
4
  menuActions: unknown[];
5
+ horizontal: boolean;
6
6
  showSettings: boolean;
7
7
  settingsButtonMode: string;
8
8
  showSettingsIndicator: boolean;
@@ -11,8 +11,8 @@ declare const _default: import("vue").DefineComponent<{}, {
11
11
  settingsIndicatorTooltipAutoShowMs: number;
12
12
  $props: {
13
13
  readonly sidebarItems?: unknown[] | undefined;
14
- readonly horizontal?: boolean | undefined;
15
14
  readonly menuActions?: unknown[] | undefined;
15
+ readonly horizontal?: boolean | undefined;
16
16
  readonly showSettings?: boolean | undefined;
17
17
  readonly settingsButtonMode?: string | undefined;
18
18
  readonly showSettingsIndicator?: boolean | undefined;
@@ -49,11 +49,14 @@ export { default as UserProfile } from './2_elements/UserProfile/UserProfile.vue
49
49
  export { default as VideoRecorder } from './2_elements/VideoRecorder/VideoRecorder.vue';
50
50
  export { default as AudioMessage } from './2_feed_elements/AudioMessage/AudioMessage.vue';
51
51
  export { default as BaseReplyMessage } from './2_feed_elements/BaseReplyMessage/BaseReplyMessage.vue';
52
+ export { default as BaseEditMessage } from './2_feed_elements/BaseEditMessage/BaseEditMessage.vue';
52
53
  export { default as CallMessage } from './2_feed_elements/CallMessage/CallMessage.vue';
53
54
  export { default as DateMessage } from './2_feed_elements/DateMessage/DateMessage.vue';
55
+ export { default as DeletedMessageContent } from './2_feed_elements/DeletedMessageContent/DeletedMessageContent.vue';
54
56
  export { default as MissedCallMessage } from './2_feed_elements/MissedCallMessage/MissedCallMessage.vue';
55
57
  export { default as DateMessageSticky } from './2_feed_elements/DateMessageSticky/DateMessageSticky.vue';
56
58
  export { default as DelimiterMessage } from './2_feed_elements/DelimiterMessage/DelimiterMessage.vue';
59
+ export { default as EditTextMessage } from './2_feed_elements/EditTextMessage/EditTextMessage.vue';
57
60
  export { default as FeedKeyboard } from './2_feed_elements/FeedKeyboard/FeedKeyboard.vue';
58
61
  export { default as FileMessage } from './2_feed_elements/FileMessage/FileMessage.vue';
59
62
  export { default as ImageMessage } from './2_feed_elements/ImageMessage/ImageMessage.vue';
@@ -76,6 +79,7 @@ export { default as VideoMessage } from './2_feed_elements/VideoMessage/VideoMes
76
79
  export { default as Modal } from './2_modals/Modal/Modal.vue';
77
80
  export { default as ModalFullscreen } from './2_modals/ModalFullscreen/ModalFullscreen.vue';
78
81
  export { default as ModalNoFooter } from './2_modals/ModalNoFooter/ModalNoFooter.vue';
82
+ export { default as ConfirmDeleteMessage } from './2_modals/ConfirmDeleteMessage/ConfirmDeleteMessage.vue';
79
83
  export { default as SelectUser } from './2_modals/SelectUser/SelectUser.vue';
80
84
  export { default as ChatInput } from './3_compounds/ChatInput/ChatInput.vue';
81
85
  export { default as ChatListHeader } from './3_compounds/ChatList/ChatListHeader.vue';
@@ -0,0 +1,7 @@
1
+ import type { Edit } from '@/types';
2
+ export interface EditMessageSource {
3
+ messageId: string | number;
4
+ type?: string;
5
+ text?: string;
6
+ }
7
+ export declare function buildEditPayload(message: EditMessageSource, fallbackType?: string): Edit;
@@ -0,0 +1,16 @@
1
+ export type MenuTriggerRect = Pick<DOMRect, 'top' | 'right' | 'bottom' | 'left' | 'width' | 'height'>;
2
+ /**
3
+ * Границы приложения для встроек: .base__container / .base / .chat-app / [data-theme],
4
+ * пересечённые с viewport.
5
+ */
6
+ export declare function findAppBoundsRect(element: HTMLElement | null): DOMRect;
7
+ /**
8
+ * Позиция контекстного меню рядом с кнопкой «три точки» (position: fixed).
9
+ * Не выходит за границы приложения (важно для встроек).
10
+ */
11
+ export declare function calculateMessageMenuPosition(menuElement: HTMLElement | null, options: {
12
+ triggerRect: MenuTriggerRect | null;
13
+ boundsElement: HTMLElement | null;
14
+ estimatedWidth?: number;
15
+ estimatedHeight?: number;
16
+ }): Promise<Record<string, string>>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Текст и мета для тултипа удалённого сообщения
3
+ * (текст + «Имя, дата в время»).
4
+ */
5
+ export type DeletedTooltipLines = {
6
+ original: string;
7
+ meta: string;
8
+ };
9
+ /**
10
+ * Строки тултипа для «Сообщение удалено»:
11
+ * original — исходный текст/подпись;
12
+ * meta — «Имя, дата в время».
13
+ */
14
+ export declare function getDeletedTooltipLines(message: {
15
+ text?: string;
16
+ filename?: string;
17
+ alt?: string;
18
+ deletion?: {
19
+ deletedBy?: string;
20
+ deletedAt?: string;
21
+ } | null;
22
+ }): DeletedTooltipLines;
23
+ /** @deprecated используйте getDeletedTooltipLines().original */
24
+ export declare function getDeletedOriginalText(message: {
25
+ text?: string;
26
+ filename?: string;
27
+ alt?: string;
28
+ }): string;
@@ -0,0 +1,17 @@
1
+ import type { MessageEditInfo } from '@/types';
2
+ export type EditTooltipEntry = {
3
+ text: string;
4
+ meta: string;
5
+ };
6
+ export type EditTooltipLines = {
7
+ /** Оригинальный текст до первой правки */
8
+ original?: string;
9
+ /** Правки: текст версии и «Имя, дата в время» */
10
+ edits: EditTooltipEntry[];
11
+ };
12
+ /**
13
+ * Строки тултипа для метки «изменено»:
14
+ * original — текст до первой правки;
15
+ * edits — для каждой правки: текст версии + «Имя, дата в время».
16
+ */
17
+ export declare function getEditTooltipLines(edited?: MessageEditInfo | null): EditTooltipLines;
@@ -1,6 +1,12 @@
1
1
  export * from './useMessageActions';
2
+ export * from './calculateMessageMenuPosition';
3
+ export * from './useMessageMenuActions';
2
4
  export * from './useMessageLinks';
3
5
  export * from './useChannelAccentColor';
4
6
  export * from './useSubtextTooltip';
5
7
  export * from './useStartReply';
8
+ export * from './useStartEdit';
6
9
  export * from './buildReplyPayload';
10
+ export * from './buildEditPayload';
11
+ export * from './getEditTooltipLines';
12
+ export * from './getDeletedOriginalText';