@uzum-tech/ui 1.7.2 → 1.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.
Files changed (93) hide show
  1. package/dist/index.js +1548 -998
  2. package/dist/index.prod.js +3 -3
  3. package/es/chat/index.d.ts +4 -0
  4. package/es/chat/index.js +2 -0
  5. package/es/chat/src/Chat.d.ts +19 -6
  6. package/es/chat/src/Chat.js +53 -14
  7. package/es/chat/src/ChatListItems.d.ts +6027 -0
  8. package/es/chat/src/ChatListItems.js +187 -0
  9. package/es/chat/src/ChatMessages.d.ts +6049 -0
  10. package/es/chat/src/ChatMessages.js +308 -0
  11. package/es/chat/src/ChatParts/ChatAttachment.js +4 -3
  12. package/es/chat/src/ChatParts/MainArea.d.ts +0 -2
  13. package/es/chat/src/ChatParts/MainArea.js +108 -229
  14. package/es/chat/src/ChatParts/Sidebar.js +16 -80
  15. package/es/chat/src/interface.d.ts +6 -1
  16. package/es/chat/src/styles/index.cssr.js +3 -2
  17. package/es/locales/common/arDZ.js +2 -1
  18. package/es/locales/common/deDE.js +2 -1
  19. package/es/locales/common/enGB.js +2 -1
  20. package/es/locales/common/enUS.d.ts +1 -0
  21. package/es/locales/common/enUS.js +2 -1
  22. package/es/locales/common/eo.js +2 -1
  23. package/es/locales/common/esAR.js +2 -1
  24. package/es/locales/common/faIR.js +2 -1
  25. package/es/locales/common/frFR.js +2 -1
  26. package/es/locales/common/idID.js +2 -1
  27. package/es/locales/common/itIT.js +2 -1
  28. package/es/locales/common/jaJP.js +2 -1
  29. package/es/locales/common/koKR.js +2 -1
  30. package/es/locales/common/nbNO.js +2 -1
  31. package/es/locales/common/nlNL.js +2 -1
  32. package/es/locales/common/plPL.js +2 -1
  33. package/es/locales/common/ptBR.js +2 -1
  34. package/es/locales/common/ruRU.js +2 -1
  35. package/es/locales/common/skSK.js +2 -1
  36. package/es/locales/common/svSE.js +2 -1
  37. package/es/locales/common/thTH.js +2 -1
  38. package/es/locales/common/trTR.js +2 -1
  39. package/es/locales/common/ukUA.js +2 -1
  40. package/es/locales/common/viVN.js +2 -1
  41. package/es/locales/common/zhCN.js +2 -1
  42. package/es/locales/common/zhTW.js +2 -1
  43. package/es/version.d.ts +1 -1
  44. package/es/version.js +1 -1
  45. package/lib/chat/index.d.ts +4 -0
  46. package/lib/chat/index.js +5 -1
  47. package/lib/chat/src/Chat.d.ts +19 -6
  48. package/lib/chat/src/Chat.js +52 -13
  49. package/lib/chat/src/ChatListItems.d.ts +6027 -0
  50. package/lib/chat/src/ChatListItems.js +193 -0
  51. package/lib/chat/src/ChatMessages.d.ts +6049 -0
  52. package/lib/chat/src/ChatMessages.js +314 -0
  53. package/lib/chat/src/ChatParts/ChatAttachment.js +4 -3
  54. package/lib/chat/src/ChatParts/MainArea.d.ts +0 -2
  55. package/lib/chat/src/ChatParts/MainArea.js +107 -228
  56. package/lib/chat/src/ChatParts/Sidebar.js +17 -78
  57. package/lib/chat/src/interface.d.ts +6 -1
  58. package/lib/chat/src/styles/index.cssr.js +3 -2
  59. package/lib/locales/common/arDZ.js +2 -1
  60. package/lib/locales/common/deDE.js +2 -1
  61. package/lib/locales/common/enGB.js +2 -1
  62. package/lib/locales/common/enUS.d.ts +1 -0
  63. package/lib/locales/common/enUS.js +2 -1
  64. package/lib/locales/common/eo.js +2 -1
  65. package/lib/locales/common/esAR.js +2 -1
  66. package/lib/locales/common/faIR.js +2 -1
  67. package/lib/locales/common/frFR.js +2 -1
  68. package/lib/locales/common/idID.js +2 -1
  69. package/lib/locales/common/itIT.js +2 -1
  70. package/lib/locales/common/jaJP.js +2 -1
  71. package/lib/locales/common/koKR.js +2 -1
  72. package/lib/locales/common/nbNO.js +2 -1
  73. package/lib/locales/common/nlNL.js +2 -1
  74. package/lib/locales/common/plPL.js +2 -1
  75. package/lib/locales/common/ptBR.js +2 -1
  76. package/lib/locales/common/ruRU.js +2 -1
  77. package/lib/locales/common/skSK.js +2 -1
  78. package/lib/locales/common/svSE.js +2 -1
  79. package/lib/locales/common/thTH.js +2 -1
  80. package/lib/locales/common/trTR.js +2 -1
  81. package/lib/locales/common/ukUA.js +2 -1
  82. package/lib/locales/common/viVN.js +2 -1
  83. package/lib/locales/common/zhCN.js +2 -1
  84. package/lib/locales/common/zhTW.js +2 -1
  85. package/lib/version.d.ts +1 -1
  86. package/lib/version.js +1 -1
  87. package/package.json +1 -1
  88. package/volar.d.ts +2 -0
  89. package/web-types.json +149 -1
  90. package/es/chat/src/ChatGlobalState.d.ts +0 -13
  91. package/es/chat/src/ChatGlobalState.js +0 -32
  92. package/lib/chat/src/ChatGlobalState.d.ts +0 -13
  93. package/lib/chat/src/ChatGlobalState.js +0 -36
@@ -0,0 +1,308 @@
1
+ import { h, defineComponent, computed, Fragment } from 'vue';
2
+ import { MessageStatus } from './interface';
3
+ import ChatAttachmentComponent from './ChatParts/ChatAttachment';
4
+ import { UIcon } from '../../icon';
5
+ import { USkeleton } from '../../skeleton';
6
+ import style from './styles/index.cssr';
7
+ import { chatLight } from '../styles';
8
+ import { useConfig, useTheme, useThemeClass, useLocale } from '../../_mixins';
9
+ import { CheckmarkDoneSharp, Refresh, MdTime } from '../../_internal/icons';
10
+ const statusIconMapper = {
11
+ [MessageStatus.READ]: CheckmarkDoneSharp,
12
+ [MessageStatus.PENDING]: MdTime,
13
+ [MessageStatus.RETRY]: Refresh,
14
+ [MessageStatus.UNREAD]: CheckmarkDoneSharp
15
+ };
16
+ export const chatMessagesProps = Object.assign(Object.assign({}, useTheme.props), { messages: {
17
+ type: Array,
18
+ default: () => []
19
+ }, loading: {
20
+ type: Boolean,
21
+ default: false
22
+ }, loadingCount: {
23
+ type: Number,
24
+ default: 5
25
+ }, typingChatIds: {
26
+ type: Array,
27
+ default: () => []
28
+ }, selectedChatId: {
29
+ type: [String, Number, Symbol],
30
+ default: undefined
31
+ }, typingText: {
32
+ type: String,
33
+ default: undefined
34
+ }, retryText: {
35
+ type: String,
36
+ default: undefined
37
+ }, uploadProps: {
38
+ type: Object,
39
+ default: undefined
40
+ }, showUnreadNotification: {
41
+ type: Boolean,
42
+ default: false
43
+ }, unreadNotificationText: {
44
+ type: String,
45
+ default: undefined
46
+ }, unreadNotificationCount: {
47
+ type: Number,
48
+ default: undefined
49
+ }, onMessageRetry: {
50
+ type: Function,
51
+ default: undefined
52
+ } });
53
+ export default defineComponent({
54
+ name: 'ChatMessages',
55
+ props: chatMessagesProps,
56
+ emits: ['message-retry'],
57
+ setup(props, { slots, emit }) {
58
+ const { mergedClsPrefixRef } = useConfig(props);
59
+ const themeRef = useTheme('Chat', '-chat', style, chatLight, props, mergedClsPrefixRef);
60
+ const { localeRef } = useLocale('Chat');
61
+ const cssVarsRef = computed(() => {
62
+ const { common: { cubicBezierEaseInOut, brandPrimary500, staticGreen, staticRed, textPrimary, textSecondary, textTertiary }, self: { backgroundColor, borderColor, mainBackgroundColor, headerBackgroundColor, headerBorderColor, headerTitleColor, messageBubbleBackgroundColorOwn, messageBubbleBackgroundColorOther, messageBubbleTextColorOwn, messageBubbleTextColorOther, messageTimeColor, messageStatusColor, attachmentBackgroundColorOwn, attachmentBackgroundColorOther, unreadNotificationBackgroundColor, unreadNotificationTextColor, typingIndicatorColor, dateSeparatorColor, dateSeparatorBackgroundColor, borderRadius, errorColor } } = themeRef.value;
63
+ return {
64
+ '--u-bezier': cubicBezierEaseInOut,
65
+ '--u-color-primary': brandPrimary500,
66
+ '--u-color-success': staticGreen,
67
+ '--u-color-error': errorColor || staticRed,
68
+ '--u-text-color-base': textPrimary,
69
+ '--u-text-color-secondary': textSecondary,
70
+ '--u-text-color-disabled': textTertiary,
71
+ '--u-background-color': backgroundColor,
72
+ '--u-border-color': borderColor,
73
+ '--u-main-background-color': mainBackgroundColor,
74
+ '--u-header-background-color': headerBackgroundColor,
75
+ '--u-header-border-color': headerBorderColor,
76
+ '--u-header-title-color': headerTitleColor,
77
+ '--u-message-bubble-background-color-own': messageBubbleBackgroundColorOwn,
78
+ '--u-message-bubble-background-color-other': messageBubbleBackgroundColorOther,
79
+ '--u-message-bubble-text-color-own': messageBubbleTextColorOwn,
80
+ '--u-message-bubble-text-color-other': messageBubbleTextColorOther,
81
+ '--u-message-time-color': messageTimeColor,
82
+ '--u-message-status-color': messageStatusColor,
83
+ '--u-attachment-background-color-own': attachmentBackgroundColorOwn,
84
+ '--u-attachment-background-color-other': attachmentBackgroundColorOther,
85
+ '--u-unread-notification-background-color': unreadNotificationBackgroundColor,
86
+ '--u-unread-notification-text-color': unreadNotificationTextColor,
87
+ '--u-typing-indicator-color': typingIndicatorColor,
88
+ '--u-date-separator-color': dateSeparatorColor,
89
+ '--u-date-separator-background-color': dateSeparatorBackgroundColor,
90
+ '--u-border-radius': borderRadius
91
+ };
92
+ });
93
+ const themeClassHandle = useThemeClass('chat-messages', computed(() => ''), cssVarsRef, props);
94
+ const mergedTypingTextRef = computed(() => { var _a; return (_a = props.typingText) !== null && _a !== void 0 ? _a : localeRef.value.typingText; });
95
+ const mergedRetryTextRef = computed(() => { var _a; return (_a = props.retryText) !== null && _a !== void 0 ? _a : localeRef.value.retryText; });
96
+ const mergedUnreadNotificationTextRef = computed(() => { var _a; return (_a = props.unreadNotificationText) !== null && _a !== void 0 ? _a : localeRef.value.unreadNotificationText; });
97
+ const unreadMessagesCount = computed(() => {
98
+ if (!props.messages)
99
+ return 0;
100
+ return props.messages.filter((msg) => !msg.isOwn && msg.status === MessageStatus.UNREAD).length;
101
+ });
102
+ const handleMessageRetry = (message) => {
103
+ var _a;
104
+ emit('message-retry', message);
105
+ (_a = props.onMessageRetry) === null || _a === void 0 ? void 0 : _a.call(props, message);
106
+ };
107
+ const renderDateSeparator = (date) => {
108
+ return (h("div", { class: `${mergedClsPrefixRef.value}-chat-main__date-separator` },
109
+ h("span", null, date)));
110
+ };
111
+ const renderUnreadNotification = () => {
112
+ var _a;
113
+ const count = (_a = props.unreadNotificationCount) !== null && _a !== void 0 ? _a : unreadMessagesCount.value;
114
+ return (h("div", { class: `${mergedClsPrefixRef.value}-chat-main__unread-notification` },
115
+ h("span", null,
116
+ count,
117
+ " ",
118
+ mergedUnreadNotificationTextRef.value)));
119
+ };
120
+ const renderMessage = (message) => {
121
+ const isOwn = message.isOwn;
122
+ const attachments = message.attachment
123
+ ? Array.isArray(message.attachment)
124
+ ? message.attachment
125
+ : [message.attachment]
126
+ : [];
127
+ return (h("div", { key: message.id, class: [
128
+ `${mergedClsPrefixRef.value}-chat-main__message`,
129
+ isOwn
130
+ ? `${mergedClsPrefixRef.value}-chat-main__message--own`
131
+ : `${mergedClsPrefixRef.value}-chat-main__message--other`
132
+ ] },
133
+ h("div", { class: `${mergedClsPrefixRef.value}-chat-main__message-wrapper` },
134
+ message.content || attachments.length > 1 ? (h("div", { class: [
135
+ `${mergedClsPrefixRef.value}-chat-main__message-bubble`,
136
+ isOwn
137
+ ? `${mergedClsPrefixRef.value}-chat-main__message-bubble--own`
138
+ : `${mergedClsPrefixRef.value}-chat-main__message-bubble--other`
139
+ ] },
140
+ attachments.length > 0 && (h(ChatAttachmentComponent, { message: message, attachments: attachments, uploadProps: props.uploadProps, withPadding: true }, {
141
+ default: slots.messageAttachment,
142
+ 'upload-file-title': slots.messageAttachmentTitle,
143
+ 'upload-file-subtitle': slots.messageAttachmentSubtitle
144
+ })),
145
+ message.content && (h("div", { class: `${mergedClsPrefixRef.value}-chat-main__message-text` }, message.content)))) : attachments.length === 1 ? (h(ChatAttachmentComponent, { message: message, attachments: attachments, uploadProps: props.uploadProps }, {
146
+ default: slots.messageAttachment,
147
+ 'upload-file-title': slots.messageAttachmentTitle,
148
+ 'upload-file-subtitle': slots.messageAttachmentSubtitle
149
+ })) : null,
150
+ h("div", { class: [
151
+ `${mergedClsPrefixRef.value}-chat-main__message-meta`,
152
+ isOwn
153
+ ? `${mergedClsPrefixRef.value}-chat-main__message-meta--own`
154
+ : `${mergedClsPrefixRef.value}-chat-main__message-meta--other`,
155
+ message.status === MessageStatus.RETRY &&
156
+ `${mergedClsPrefixRef.value}-chat-main__message-meta--retry`
157
+ ] }, message.status === MessageStatus.RETRY ? (h("div", { class: `${mergedClsPrefixRef.value}-chat-main__message-retry`, onClick: () => {
158
+ handleMessageRetry(message);
159
+ }, style: { cursor: 'pointer' } },
160
+ h(UIcon, { size: 16, component: statusIconMapper[MessageStatus.RETRY], class: `${mergedClsPrefixRef.value}-chat-main__message-retry-icon` }),
161
+ h("span", { class: `${mergedClsPrefixRef.value}-chat-main__message-retry-text` }, mergedRetryTextRef.value))) : (h(Fragment, null,
162
+ h("span", { class: `${mergedClsPrefixRef.value}-chat-main__message-time` }, message.timestamp),
163
+ isOwn && message.status && (h("div", { class: `${mergedClsPrefixRef.value}-chat-main__message-status` }, slots.messageStatus
164
+ ? slots.messageStatus(message)
165
+ : statusIconMapper[message.status] && (h(UIcon, { size: 16, component: statusIconMapper[message.status], class: [
166
+ `${mergedClsPrefixRef.value}-chat-main__message-status-icon`,
167
+ `${mergedClsPrefixRef.value}-chat-main__message-status-icon--${String(message.status)}`
168
+ ] }))))))))));
169
+ };
170
+ const renderTypingIndicator = () => {
171
+ return (h("div", { class: [
172
+ `${mergedClsPrefixRef.value}-chat-main__message`,
173
+ `${mergedClsPrefixRef.value}-chat-main__message--other`
174
+ ] },
175
+ h("div", { class: `${mergedClsPrefixRef.value}-chat-main__message-wrapper` },
176
+ h("div", { class: [
177
+ `${mergedClsPrefixRef.value}-chat-main__message-bubble`,
178
+ `${mergedClsPrefixRef.value}-chat-main__message-bubble--other`,
179
+ `${mergedClsPrefixRef.value}-chat-main__message-bubble--typing`
180
+ ] }),
181
+ h("div", { class: [
182
+ `${mergedClsPrefixRef.value}-chat-main__message-meta`,
183
+ `${mergedClsPrefixRef.value}-chat-main__message-meta--other`
184
+ ] },
185
+ h("span", { class: `${mergedClsPrefixRef.value}-chat-main__message-time` }, mergedTypingTextRef.value)))));
186
+ };
187
+ const renderSkeletonMessage = (isOwn, index) => {
188
+ return (h("div", { key: `skeleton-${index}`, class: [
189
+ `${mergedClsPrefixRef.value}-chat-main__message`,
190
+ isOwn
191
+ ? `${mergedClsPrefixRef.value}-chat-main__message--own`
192
+ : `${mergedClsPrefixRef.value}-chat-main__message--other`
193
+ ] },
194
+ h("div", { class: `${mergedClsPrefixRef.value}-chat-main__message-wrapper` },
195
+ h("div", { class: [
196
+ `${mergedClsPrefixRef.value}-chat-main__message-bubble`,
197
+ isOwn
198
+ ? `${mergedClsPrefixRef.value}-chat-main__message-bubble--own`
199
+ : `${mergedClsPrefixRef.value}-chat-main__message-bubble--other`
200
+ ] },
201
+ h("div", { class: `${mergedClsPrefixRef.value}-chat-main__message-text` },
202
+ h("div", { style: { width: '376px', height: '20px' } }))),
203
+ h("div", { class: [
204
+ `${mergedClsPrefixRef.value}-chat-main__message-meta`,
205
+ isOwn
206
+ ? `${mergedClsPrefixRef.value}-chat-main__message-meta--own`
207
+ : `${mergedClsPrefixRef.value}-chat-main__message-meta--other`
208
+ ] },
209
+ h(USkeleton, { style: { width: '36px', height: '20px', borderRadius: '4px' } })))));
210
+ };
211
+ return {
212
+ mergedClsPrefixRef,
213
+ renderMessage,
214
+ renderTypingIndicator,
215
+ renderSkeletonMessage,
216
+ renderDateSeparator,
217
+ renderUnreadNotification,
218
+ cssVars: cssVarsRef,
219
+ themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass,
220
+ onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender
221
+ };
222
+ },
223
+ render() {
224
+ var _a, _b, _c;
225
+ (_a = this.onRender) === null || _a === void 0 ? void 0 : _a.call(this);
226
+ const { mergedClsPrefixRef, renderMessage, renderTypingIndicator, renderSkeletonMessage, renderDateSeparator, renderUnreadNotification } = this;
227
+ if (this.loading) {
228
+ return (h("div", { class: [`${mergedClsPrefixRef}-chat`, this.themeClass], style: this.cssVars },
229
+ h("div", { class: `${mergedClsPrefixRef}-chat-main`, style: {
230
+ border: 'none',
231
+ borderRadius: '0',
232
+ padding: '0',
233
+ background: 'transparent'
234
+ } },
235
+ h("div", { class: `${mergedClsPrefixRef}-chat-main__messages` }, Array.from({ length: this.loadingCount || 5 }).map((_, index) => {
236
+ const isOwn = index % 2 === 0;
237
+ return renderSkeletonMessage(isOwn, index);
238
+ })))));
239
+ }
240
+ const messagesWithDates = [];
241
+ let currentDate = '';
242
+ let unreadNotificationInserted = false;
243
+ (_b = this.messages) === null || _b === void 0 ? void 0 : _b.forEach((message, index) => {
244
+ const messageDate = message.date || '';
245
+ if (messageDate !== currentDate) {
246
+ messagesWithDates.push({
247
+ type: 'date-separator',
248
+ date: messageDate,
249
+ id: `date-${String(index)}`
250
+ });
251
+ currentDate = messageDate;
252
+ }
253
+ if (!unreadNotificationInserted &&
254
+ !message.isOwn &&
255
+ message.status === MessageStatus.UNREAD &&
256
+ this.showUnreadNotification) {
257
+ messagesWithDates.push({
258
+ type: 'unread-notification',
259
+ id: 'unread-notification'
260
+ });
261
+ unreadNotificationInserted = true;
262
+ }
263
+ messagesWithDates.push(Object.assign({ type: 'message' }, message));
264
+ });
265
+ if (!unreadNotificationInserted && this.showUnreadNotification) {
266
+ const unreadCount = this.unreadNotificationCount || 0;
267
+ let incomingMessagesFound = 0;
268
+ let insertIndex = messagesWithDates.length;
269
+ for (let i = messagesWithDates.length - 1; i >= 0; i--) {
270
+ const item = messagesWithDates[i];
271
+ if (item.type === 'message') {
272
+ const message = item;
273
+ if (!message.isOwn) {
274
+ incomingMessagesFound++;
275
+ if (incomingMessagesFound === unreadCount) {
276
+ insertIndex = i;
277
+ break;
278
+ }
279
+ }
280
+ }
281
+ }
282
+ messagesWithDates.splice(insertIndex, 0, {
283
+ type: 'unread-notification',
284
+ id: 'unread-notification'
285
+ });
286
+ }
287
+ const isTyping = this.selectedChatId && ((_c = this.typingChatIds) === null || _c === void 0 ? void 0 : _c.includes(this.selectedChatId));
288
+ return (h("div", { class: [`${mergedClsPrefixRef}-chat`, this.themeClass], style: this.cssVars },
289
+ h("div", { class: `${mergedClsPrefixRef}-chat-main`, style: {
290
+ border: 'none',
291
+ borderRadius: '0',
292
+ padding: '0',
293
+ background: 'transparent'
294
+ } },
295
+ h("div", { class: `${mergedClsPrefixRef}-chat-main__messages-container` },
296
+ messagesWithDates.map((item) => {
297
+ var _a;
298
+ if (item.type === 'date-separator') {
299
+ return renderDateSeparator((_a = item.date) !== null && _a !== void 0 ? _a : '');
300
+ }
301
+ if (item.type === 'unread-notification') {
302
+ return renderUnreadNotification();
303
+ }
304
+ return renderMessage(item);
305
+ }),
306
+ isTyping && renderTypingIndicator()))));
307
+ }
308
+ });
@@ -47,8 +47,8 @@ export default defineComponent({
47
47
  gap: '2px',
48
48
  marginTop: '0'
49
49
  }
50
- : undefined, showRemoveButton: false, showDownloadButton: props.attachments.some((att) => att.status === 'finished'), showRetryButton: props.attachments.some((att) => att.status === 'error') }, props.uploadProps),
51
- h(UUploadFileList, null, {
50
+ : undefined, showRemoveButton: false, showDownloadButton: props.attachments.some((att) => att.status === 'finished'), showRetryButton: props.attachments.some((att) => att.status === 'error') }, props.uploadProps), {
51
+ default: () => (h(UUploadFileList, null, {
52
52
  'upload-file-title': slots['upload-file-title']
53
53
  ? ({ file }) => { var _a; return (_a = slots['upload-file-title']) === null || _a === void 0 ? void 0 : _a.call(slots, file); }
54
54
  : undefined,
@@ -59,7 +59,8 @@ export default defineComponent({
59
59
  const att = props.attachments.find((a) => a.name === file.name);
60
60
  return (h("span", { style: { fontSize: '12px', color: '#999' } }, (att === null || att === void 0 ? void 0 : att.size) || ((_a = file.file) === null || _a === void 0 ? void 0 : _a.size)));
61
61
  }
62
- })));
62
+ }))
63
+ }));
63
64
  if (props.withPadding) {
64
65
  return h("div", { style: { padding: '2px' } }, uploadComponent);
65
66
  }
@@ -2,8 +2,6 @@ declare const _default: import("vue").DefineComponent<{}, {
2
2
  renderHeader: () => JSX.Element;
3
3
  renderMessages: () => JSX.Element;
4
4
  renderFooter: () => JSX.Element;
5
- renderUnreadNotification: () => JSX.Element | null;
6
- showUnreadNotification: import("vue").ComputedRef<boolean>;
7
5
  messagesBodyRef: import("vue").Ref<HTMLElement | {
8
6
  $el: HTMLElement;
9
7
  } | undefined>;