stream-chat-angular 5.0.0-v5.9 → 5.1.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 (122) hide show
  1. package/assets/i18n/en.d.ts +1 -0
  2. package/assets/version.d.ts +1 -1
  3. package/esm2020/assets/i18n/en.mjs +3 -2
  4. package/esm2020/assets/version.mjs +2 -2
  5. package/esm2020/lib/attachment-list/attachment-list.component.mjs +3 -3
  6. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +3 -3
  7. package/esm2020/lib/attachment.service.mjs +103 -7
  8. package/esm2020/lib/avatar/avatar.component.mjs +6 -9
  9. package/esm2020/lib/avatar-placeholder/avatar-placeholder.component.mjs +3 -11
  10. package/esm2020/lib/channel/channel.component.mjs +5 -6
  11. package/esm2020/lib/channel-header/channel-header.component.mjs +3 -3
  12. package/esm2020/lib/channel-list/channel-list.component.mjs +6 -7
  13. package/esm2020/lib/channel-preview/channel-preview.component.mjs +3 -3
  14. package/esm2020/lib/channel-query.mjs +77 -0
  15. package/esm2020/lib/channel.service.mjs +184 -137
  16. package/esm2020/lib/chat-client.service.mjs +33 -11
  17. package/esm2020/lib/custom-templates.service.mjs +6 -10
  18. package/esm2020/lib/icon/icon.component.mjs +3 -7
  19. package/esm2020/lib/icon-placeholder/icon-placeholder.component.mjs +4 -7
  20. package/esm2020/lib/loading-indicator/loading-indicator.component.mjs +6 -22
  21. package/esm2020/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +5 -23
  22. package/esm2020/lib/message/message.component.mjs +129 -16
  23. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +39 -14
  24. package/esm2020/lib/message-actions.service.mjs +68 -4
  25. package/esm2020/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +16 -6
  26. package/esm2020/lib/message-input/message-input.component.mjs +76 -74
  27. package/esm2020/lib/message-input/textarea/textarea.component.mjs +13 -1
  28. package/esm2020/lib/message-list/message-list.component.mjs +201 -201
  29. package/esm2020/lib/message-reactions/message-reactions.component.mjs +7 -78
  30. package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +61 -0
  31. package/esm2020/lib/modal/modal.component.mjs +1 -1
  32. package/esm2020/lib/stream-chat.module.mjs +8 -8
  33. package/esm2020/lib/thread/thread.component.mjs +3 -3
  34. package/esm2020/lib/types.mjs +1 -1
  35. package/esm2020/lib/virtualized-list.service.mjs +271 -0
  36. package/esm2020/lib/virtualized-message-list.service.mjs +73 -0
  37. package/esm2020/lib/voice-recording/voice-recording.component.mjs +4 -4
  38. package/esm2020/public-api.mjs +5 -2
  39. package/fesm2015/stream-chat-angular.mjs +3207 -2533
  40. package/fesm2015/stream-chat-angular.mjs.map +1 -1
  41. package/fesm2020/stream-chat-angular.mjs +3144 -2479
  42. package/fesm2020/stream-chat-angular.mjs.map +1 -1
  43. package/lib/attachment.service.d.ts +11 -4
  44. package/lib/avatar/avatar.component.d.ts +4 -7
  45. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -5
  46. package/lib/channel-list/channel-list.component.d.ts +1 -1
  47. package/lib/channel-query.d.ts +26 -0
  48. package/lib/channel.service.d.ts +81 -58
  49. package/lib/chat-client.service.d.ts +7 -3
  50. package/lib/custom-templates.service.d.ts +8 -12
  51. package/lib/icon/icon.component.d.ts +2 -6
  52. package/lib/icon-placeholder/icon-placeholder.component.d.ts +1 -5
  53. package/lib/loading-indicator/loading-indicator.component.d.ts +1 -10
  54. package/lib/loading-indicator-placeholder/loading-indicator-placeholder.component.d.ts +1 -11
  55. package/lib/message/message.component.d.ts +31 -9
  56. package/lib/message-actions-box/message-actions-box.component.d.ts +11 -6
  57. package/lib/message-actions.service.d.ts +3 -2
  58. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -0
  59. package/lib/message-input/message-input.component.d.ts +19 -7
  60. package/lib/message-input/textarea/textarea.component.d.ts +1 -0
  61. package/lib/message-list/message-list.component.d.ts +16 -17
  62. package/lib/message-reactions/message-reactions.component.d.ts +6 -30
  63. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +35 -0
  64. package/lib/stream-chat.module.d.ts +5 -5
  65. package/lib/types.d.ts +35 -29
  66. package/lib/virtualized-list.service.d.ts +58 -0
  67. package/lib/virtualized-message-list.service.d.ts +15 -0
  68. package/package.json +5 -5
  69. package/public-api.d.ts +4 -1
  70. package/src/assets/assets/EmojiOneColor.woff2 +0 -0
  71. package/src/assets/assets/NotoColorEmoji-flags.woff2 +0 -0
  72. package/src/assets/assets/Poweredby_100px-White_VertText.png +0 -0
  73. package/src/assets/assets/icons/stream-chat-icons.eot +0 -0
  74. package/src/assets/assets/icons/stream-chat-icons.svg +46 -0
  75. package/src/assets/assets/icons/stream-chat-icons.ttf +0 -0
  76. package/src/assets/assets/icons/stream-chat-icons.woff +0 -0
  77. package/src/assets/assets/icons/stream-chat-icons.woff2 +0 -0
  78. package/src/assets/assets/str-chat__reaction-list-sprite@1x.png +0 -0
  79. package/src/assets/assets/str-chat__reaction-list-sprite@2x.png +0 -0
  80. package/src/assets/assets/str-chat__reaction-list-sprite@3x.png +0 -0
  81. package/src/assets/i18n/en.ts +2 -1
  82. package/src/assets/styles/css/index.css +2 -2
  83. package/src/assets/styles/css/index.layout.css +2 -2
  84. package/src/assets/styles/scss/AttachmentList/AttachmentList-layout.scss +74 -12
  85. package/src/assets/styles/scss/AttachmentList/AttachmentList-theme.scss +52 -0
  86. package/src/assets/styles/scss/AttachmentPreviewList/AttachmentPreviewList-layout.scss +24 -9
  87. package/src/assets/styles/scss/AttachmentPreviewList/AttachmentPreviewList-theme.scss +29 -0
  88. package/src/assets/styles/scss/AudioRecorder/AudioRecorder-layout.scss +89 -0
  89. package/src/assets/styles/scss/AudioRecorder/AudioRecorder-theme.scss +51 -0
  90. package/src/assets/styles/scss/Autocomplete/Autocomplete-layout.scss +1 -1
  91. package/src/assets/styles/scss/Avatar/Avatar-layout.scss +46 -0
  92. package/src/assets/styles/scss/Channel/Channel-layout.scss +1 -0
  93. package/src/assets/styles/scss/Channel/Channel-theme.scss +1 -0
  94. package/src/assets/styles/scss/ChannelList/ChannelList-layout.scss +2 -2
  95. package/src/assets/styles/scss/ChannelList/ChannelList-theme.scss +4 -2
  96. package/src/assets/styles/scss/ChannelPreview/ChannelPreview-layout.scss +2 -0
  97. package/src/assets/styles/scss/ChannelPreview/ChannelPreview-theme.scss +1 -0
  98. package/src/assets/styles/scss/EditMessageForm/EditMessageForm-theme.scss +9 -9
  99. package/src/assets/styles/scss/Icon/Icon-layout.scss +87 -0
  100. package/src/assets/styles/scss/Icon/Icon-theme.scss +13 -0
  101. package/src/assets/styles/scss/ImageCarousel/ImageCarousel-layout.scss +1 -0
  102. package/src/assets/styles/scss/ImageCarousel/ImageCarousel-theme.scss +1 -0
  103. package/src/assets/styles/scss/LoadingIndicator/LoadingIndicator-layout.scss +26 -1
  104. package/src/assets/styles/scss/LoadingIndicator/LoadingIndicator-theme.scss +6 -4
  105. package/src/assets/styles/scss/Message/Message-layout.scss +45 -6
  106. package/src/assets/styles/scss/Message/Message-theme.scss +6 -0
  107. package/src/assets/styles/scss/MessageInput/MessageInput-layout.scss +33 -1
  108. package/src/assets/styles/scss/MessageInput/MessageInput-theme.scss +65 -2
  109. package/src/assets/styles/scss/MessageList/MessageList-theme.scss +2 -0
  110. package/src/assets/styles/scss/MessageReactions/MessageReactionsSelector-layout.scss +18 -0
  111. package/src/assets/styles/scss/MessageReactions/MessageReactionsSelector-theme.scss +5 -0
  112. package/src/assets/styles/scss/Modal/Modal-layout.scss +1 -0
  113. package/src/assets/styles/scss/Modal/Modal-theme.scss +6 -0
  114. package/src/assets/styles/scss/_base.scss +4 -2
  115. package/src/assets/styles/scss/_emoji-replacement.scss +4 -2
  116. package/src/assets/styles/scss/_icons.scss +24 -2
  117. package/src/assets/styles/scss/_variables.scss +2 -0
  118. package/src/assets/styles/scss/index.layout.scss +2 -0
  119. package/src/assets/styles/scss/index.scss +2 -0
  120. package/src/assets/version.ts +1 -1
  121. package/esm2020/lib/edit-message-form/edit-message-form.component.mjs +0 -83
  122. package/lib/edit-message-form/edit-message-form.component.d.ts +0 -31
@@ -0,0 +1,58 @@
1
+ import { BehaviorSubject, Observable, Subject } from 'rxjs';
2
+ import { VirtualizedListQueryDirection, VirtualizedListQueryState, VirtualizedListScrollPosition, VirtualizedListVerticalItemPosition } from './types';
3
+ /**
4
+ * The `VirtualizedListService` removes items from a list that are not currently displayed. This is a high-level overview of how it works:
5
+ * - Create a new instance for each list that needs virtualization
6
+ * - Input: Provide a reactive stream that emits all items in the list
7
+ * - Input: Provide a reactive stream that emit the current scroll position (top, middle or bottom)
8
+ * - Input: maximum number of items that are allowed in the list (in practice the service can make the virtualized list half this number, you should take this into account when choosing the value)
9
+ * - Output: The service will emit the current list of displayed items via the virtualized items reactive stream
10
+ * - For simplicity, the service won't track the height of the items, nor it needs an exact scroll location -> this is how removing items work:
11
+ * - If scroll location is bottom/top items around the current bottom/top item will be emitted in the virtualized items stream
12
+ * - If scroll location is middle, the service won't remove items, if new items are received, those will be appended to the virtualized list (this means that in theory the list can grow very big if a lot of new items are received while the user is scrolled somewhere, this is a trade-off for the simplicity of no height tracking)
13
+ * - Since there is no height tracking, you should make sure to provide a maximum number that is big enough to fill the biggest expected screen size twice
14
+ * - If the user scrolls to the bottom/top and there are no more local items to show, the service will trigger a query to load more items
15
+ * - Input: you should provide the page size to use, in order for the service to determine if loading is necessary
16
+ *
17
+ * The `VirtualizedMessageListService` provides an implementation for the message list component.
18
+ */
19
+ export declare abstract class VirtualizedListService<T> {
20
+ private allItems$;
21
+ private scrollPosition$;
22
+ readonly jumpToItem$?: Observable<{
23
+ item: Partial<T> | undefined;
24
+ position?: VirtualizedListVerticalItemPosition | undefined;
25
+ }> | undefined;
26
+ readonly pageSize: number;
27
+ readonly maxItemCount: number;
28
+ /**
29
+ * The items that should be currently displayed, a subset of all items
30
+ */
31
+ virtualizedItems$: Observable<T[]>;
32
+ /**
33
+ * The result of the last query used to load more items
34
+ */
35
+ queryState$: Observable<VirtualizedListQueryState>;
36
+ protected queryStateSubject: BehaviorSubject<VirtualizedListQueryState>;
37
+ protected bufferOnTop: number;
38
+ protected bufferOnBottom: number;
39
+ protected loadFromBuffer$: Subject<void>;
40
+ private virtualizedItemsSubject;
41
+ private subscriptions;
42
+ constructor(allItems$: Observable<T[]>, scrollPosition$: Observable<VirtualizedListScrollPosition>, jumpToItem$?: Observable<{
43
+ item: Partial<T> | undefined;
44
+ position?: VirtualizedListVerticalItemPosition | undefined;
45
+ }> | undefined, pageSize?: number, maxItemCount?: number);
46
+ /**
47
+ * The current value of virtualized items
48
+ */
49
+ get virtualizedItems(): T[];
50
+ /**
51
+ * Remove all subscriptions, call this once you're done using an instance of this service
52
+ */
53
+ dispose(): void;
54
+ protected loadMoreFromBuffer(_: VirtualizedListQueryDirection): void;
55
+ private loadMore;
56
+ protected abstract isEqual: (t1: T, t2: T) => boolean;
57
+ protected abstract query: (direction: VirtualizedListQueryDirection) => Promise<unknown>;
58
+ }
@@ -0,0 +1,15 @@
1
+ import { ChannelService } from './channel.service';
2
+ import { VirtualizedListQueryDirection, VirtualizedListScrollPosition, StreamMessage } from './types';
3
+ import { Observable } from 'rxjs';
4
+ import { VirtualizedListService } from './virtualized-list.service';
5
+ /**
6
+ * The `VirtualizedMessageListService` removes messages from the message list that are currently not in view
7
+ */
8
+ export declare class VirtualizedMessageListService extends VirtualizedListService<StreamMessage> {
9
+ readonly mode: 'thread' | 'main';
10
+ private channelService;
11
+ constructor(mode: 'thread' | 'main', scrollPosition$: Observable<VirtualizedListScrollPosition>, channelService: ChannelService);
12
+ protected loadMoreFromBuffer(direction: VirtualizedListQueryDirection): void;
13
+ protected isEqual: (t1: StreamMessage, t2: StreamMessage) => boolean;
14
+ protected query: (direction: VirtualizedListQueryDirection) => Promise<void> | Promise<import("stream-chat").QueryChannelAPIResponse<import("./types").DefaultStreamChatGenerics>>;
15
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stream-chat-angular",
3
- "version": "5.0.0-v5.9",
3
+ "version": "5.1.0",
4
4
  "description": "Angular components to create chat conversations or livestream style chat",
5
5
  "author": "GetStream",
6
6
  "homepage": "https://getstream.io/chat/",
@@ -9,12 +9,12 @@
9
9
  "url": "https://github.com/GetStream/stream-chat-angular.git"
10
10
  },
11
11
  "peerDependencies": {
12
- "@angular/common": "^15.0.0 || ^16.0.0 || ^17.0.0",
13
- "@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0",
12
+ "@angular/common": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
13
+ "@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
14
14
  "@floating-ui/dom": "^1.6.3",
15
15
  "@ngx-translate/core": "^14.0.0 || ^15.0.0",
16
16
  "angular-mentions": "^1.4.0",
17
- "ngx-float-ui": "^15.0.0|| ^16.0.0 || ^17.0.0",
17
+ "ngx-float-ui": "^15.0.0|| ^16.0.0 || ^17.0.0 || ^18.0.0 || ^18.0.1-rc.0",
18
18
  "rxjs": "^7.4.0",
19
19
  "stream-chat": "^8.26.0"
20
20
  },
@@ -24,7 +24,7 @@
24
24
  "emoji-regex": "^10.3.0",
25
25
  "pretty-bytes": "^6.1.1",
26
26
  "tslib": "^2.3.0",
27
- "uuidv4": "^6.2.13"
27
+ "uuid": "^9.0.1"
28
28
  },
29
29
  "module": "fesm2015/stream-chat-angular.mjs",
30
30
  "es2020": "fesm2020/stream-chat-angular.mjs",
package/public-api.d.ts CHANGED
@@ -19,7 +19,6 @@ export * from './lib/message/message.component';
19
19
  export * from './lib/parse-date';
20
20
  export * from './lib/list-users';
21
21
  export * from './lib/message-input/message-input.component';
22
- export * from './lib/edit-message-form/edit-message-form.component';
23
22
  export * from './lib/message-bounce-prompt/message-bounce-prompt.component';
24
23
  export * from './lib/message-input/textarea/textarea.component';
25
24
  export * from './lib/message-input/autocomplete-textarea/autocomplete-textarea.component';
@@ -58,3 +57,7 @@ export * from './lib/message-actions.service';
58
57
  export * from './lib/voice-recording/voice-recording.component';
59
58
  export * from './lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component';
60
59
  export * from './lib/is-on-separate-date';
60
+ export * from './lib/message-reactions-selector/message-reactions-selector.component';
61
+ export * from './lib/channel-query';
62
+ export * from './lib/virtualized-list.service';
63
+ export * from './lib/virtualized-message-list.service';
@@ -0,0 +1,46 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>Copyright (C) 2024 by original authors @ fontello.com</metadata>
5
+ <defs>
6
+ <font id="stream-chat-icons" horiz-adv-x="1000" >
7
+ <font-face font-family="stream-chat-icons" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
8
+ <missing-glyph horiz-adv-x="1000" />
9
+ <glyph glyph-name="action" unicode="&#xe800;" d="M500 517c46 0 83 37 83 83 0 46-37 83-83 83-46 0-83-37-83-83 0-46 37-83 83-83z m0-84c-46 0-83-37-83-83 0-46 37-83 83-83 46 0 83 37 83 83 0 46-37 83-83 83z m0-250c-46 0-83-37-83-83 0-46 37-83 83-83 46 0 83 37 83 83 0 46-37 83-83 83z" horiz-adv-x="1000" />
10
+
11
+ <glyph glyph-name="arrow-down" unicode="&#xe801;" d="M309 504l191-190 191 190 59-58-250-250-250 250 59 58z" horiz-adv-x="1000" />
12
+
13
+ <glyph glyph-name="arrow-left" unicode="&#xe802;" d="M654 541l-58 59-250-250 250-250 58 59-190 191 190 191z" horiz-adv-x="1000" />
14
+
15
+ <glyph glyph-name="arrow-right" unicode="&#xe803;" d="M404 600l-58-59 191-191-191-191 58-59 250 250-250 250z" horiz-adv-x="1000" />
16
+
17
+ <glyph glyph-name="close" unicode="&#xe804;" d="M792 583l-59 59-233-233-233 233-59-59 233-233-233-233 59-59 233 233 233-233 59 59-233 233 233 233z" horiz-adv-x="1000" />
18
+
19
+ <glyph glyph-name="arrow-up" unicode="&#xe805;" d="M691 196l-191 191-191-191-59 58 250 250 250-250-59-58z" horiz-adv-x="1000" />
20
+
21
+ <glyph glyph-name="chat-bubble" unicode="&#xe806;" d="M779 670h-558c-39 0-70-32-70-70v-629l139 140h489c39 0 70 32 70 70v419c0 38-31 70-70 70z m0-489h-489l-69-70v489h558v-419z" horiz-adv-x="1000" />
22
+
23
+ <glyph glyph-name="pause" unicode="&#xe807;" d="M250 58h167v584h-167v-584z m333 584v-584h167v584h-167z" horiz-adv-x="1000" />
24
+
25
+ <glyph glyph-name="download" unicode="&#xe808;" d="M806 432c-28 143-154 251-306 251-120 0-225-68-277-168-125-13-223-120-223-248 0-138 112-250 250-250h542c115 0 208 93 208 208 0 110-85 199-194 207z m-14-332h-542c-92 0-167 75-167 167 0 85 64 156 149 165l44 5 21 39c40 77 117 124 203 124 109 0 203-77 225-185l12-62 64-5c65-4 116-58 116-123 0-69-57-125-125-125z m-232 333h-120v-125h-107l167-166 167 166h-107v125z" horiz-adv-x="1000" />
26
+
27
+ <glyph glyph-name="delivered" unicode="&#xe809;" d="M375 175l-175 175-58-58 233-234 500 500-58 59-442-442z" horiz-adv-x="1000" />
28
+
29
+ <glyph glyph-name="play" unicode="&#xe80a;" d="M271 642v-584l458 292-458 292z" horiz-adv-x="1000" />
30
+
31
+ <glyph glyph-name="reaction" unicode="&#xe80b;" d="M500 767c-230 0-417-187-417-417 0-230 187-417 417-417 230 0 417 187 417 417 0 230-187 417-417 417z m0-750c-184 0-333 149-333 333 0 184 149 333 333 333 184 0 333-149 333-333 0-184-149-333-333-333z m146 375c34 0 62 28 62 62 0 35-28 63-62 63-35 0-63-28-63-63 0-34 28-62 63-62z m-292 0c35 0 63 28 63 62 0 35-28 63-63 63-34 0-62-28-62-63 0-34 28-62 62-62z m146-271c97 0 180 61 213 146h-426c33-85 116-146 213-146z" horiz-adv-x="1000" />
32
+
33
+ <glyph glyph-name="error" unicode="&#xe80c;" d="M500 767c-230 0-417-187-417-417 0-230 187-417 417-417 230 0 417 187 417 417 0 230-187 417-417 417z m42-625h-84v83h84v-83z m0 166h-84v250h84v-250z" horiz-adv-x="1000" />
34
+
35
+ <glyph glyph-name="read" unicode="&#xe80d;" d="M749 571l-59 58-264-264 58-58 265 264z m176 58l-441-440-174 173-58-58 232-233 500 500-59 58z m-909-325l233-233 58 58-232 233-59-58z" horiz-adv-x="1000" />
36
+
37
+ <glyph glyph-name="retry" unicode="&#xe80e;" d="M735 585c-60 61-143 98-235 98-184 0-333-149-333-333 0-184 149-333 333-333 155 0 285 106 322 250h-87c-34-97-126-167-235-167-138 0-250 112-250 250 0 138 112 250 250 250 69 0 131-29 176-74l-134-134h291v291l-98-98z" horiz-adv-x="1000" />
38
+
39
+ <glyph glyph-name="reply-in-thread" unicode="&#xe80f;" d="M417 496v167l-292-292 292-292v171c208 0 354-67 458-212-42 208-167 416-458 458z" horiz-adv-x="1000" />
40
+
41
+ <glyph glyph-name="send" unicode="&#xe810;" d="M167-67l833 417-833 417 0-324 595-93-595-93 0-324z" horiz-adv-x="1000" />
42
+
43
+ <glyph glyph-name="attach" unicode="&#xe811;" d="M542 558h-84v-166h-166v-84h166v-166h84v166h166v84h-166v166z m-42 209c-230 0-417-187-417-417 0-230 187-417 417-417 230 0 417 187 417 417 0 230-187 417-417 417z m0-750c-184 0-333 149-333 333 0 184 149 333 333 333 184 0 333-149 333-333 0-184-149-333-333-333z" horiz-adv-x="1000" />
44
+ </font>
45
+ </defs>
46
+ </svg>
@@ -53,7 +53,7 @@ export const en = {
53
53
  'Pick your emoji': 'Pick your emoji',
54
54
  Pin: 'Pin',
55
55
  'Pinned by': 'Pinned by',
56
- Reply: 'Reply',
56
+ Reply: 'Quote Reply',
57
57
  'Reply to Message': 'Reply to Message',
58
58
  Search: 'Search',
59
59
  'Searching...': 'Searching...',
@@ -119,5 +119,6 @@ export const en = {
119
119
  'Send Anyway': 'Send Anyway',
120
120
  Edited: 'Edited',
121
121
  'Error playing audio': 'Error playing audio',
122
+ 'Copy text': 'Copy text',
122
123
  },
123
124
  };