@aochuang/client-sdk 1.0.342 → 1.0.344

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 (140) hide show
  1. package/components/index.js +6 -1
  2. package/components/session-select/session-select-item.vue +8 -9
  3. package/components/wechat-chat-control/calling/calling.vue +0 -3
  4. package/components/wechat-chat-control/voice/voice.vue +0 -4
  5. package/components/wework-chat-control/company-card/company-card.vue +1 -1
  6. package/components/wework-chat-control/file-url/file-url.vue +2 -5
  7. package/components/wework-chat-control/image/image.vue +137 -2
  8. package/components/wework-chat-control/index.js +6 -6
  9. package/components/wework-chat-control/text/text.vue +22 -3
  10. package/components/wework-chat-control/util.js +12 -6
  11. package/components/wework-chat-control/video/video.vue +10 -2
  12. package/components/wework-chat-control/voice/voice.vue +1 -1
  13. package/components/wework-chat-control/wework-chat-control-config-item.vue +24 -0
  14. package/components/wework-chat-control/wework-chat-control-config-msg.vue +25 -0
  15. package/{uni-components/chat-control/chat-control-config.vue → components/wework-chat-control/wework-chat-control-config.vue} +16 -13
  16. package/components/wework-chat-panel/chat-panel-chat-status/chat-panel-chat-status.vue +73 -0
  17. package/components/wework-chat-panel/chat-panel-item.vue +12 -35
  18. package/components/wework-chat-panel/chat-panel.vue +95 -12
  19. package/package.json +10 -3
  20. package/services/client-chat/client-chat-wechat/client-chat.js +8 -20
  21. package/services/client-chat/client-chat-wework/client-chat-concats.js +81 -17
  22. package/services/client-chat/client-chat-wework/client-chat-message.js +5 -5
  23. package/services/client-chat/client-chat-wework/client-chat-session.js +50 -2
  24. package/services/client-chat/client-chat-wework/client-chat-socket.js +9 -1
  25. package/services/client-chat/client-chat-wework/client-chat.js +278 -11
  26. package/services/client-chat/client-chat-wework/utils.js +5 -5
  27. package/components/wework-chat-panel/chat-panel-controls/company-card/company-card.vue +0 -35
  28. package/components/wework-chat-panel/chat-panel-controls/expression/expression.vue +0 -36
  29. package/components/wework-chat-panel/chat-panel-controls/file-url/file-url.vue +0 -35
  30. package/components/wework-chat-panel/chat-panel-controls/image/image.vue +0 -36
  31. package/components/wework-chat-panel/chat-panel-controls/index.js +0 -35
  32. package/components/wework-chat-panel/chat-panel-controls/jx-sys-text/jx-sys-text.vue +0 -28
  33. package/components/wework-chat-panel/chat-panel-controls/link/link.vue +0 -35
  34. package/components/wework-chat-panel/chat-panel-controls/location/location.vue +0 -35
  35. package/components/wework-chat-panel/chat-panel-controls/text/text.vue +0 -43
  36. package/components/wework-chat-panel/chat-panel-controls/unkonw/unkonw.vue +0 -39
  37. package/components/wework-chat-panel/chat-panel-controls/video/video.vue +0 -37
  38. package/components/wework-chat-panel/chat-panel-controls/voice/voice.vue +0 -35
  39. package/uni-common/account-portray/account-portray.vue +0 -51
  40. package/uni-common/account-select/account-select-item.vue +0 -172
  41. package/uni-common/account-select/account-select.vue +0 -252
  42. package/uni-common/all-friend-avatar/all-friend-avatar.vue +0 -49
  43. package/uni-common/friend-avatar/default.svg +0 -1
  44. package/uni-common/friend-avatar/friend-avatar.vue +0 -27
  45. package/uni-common/friend-avatar/index.js +0 -3
  46. package/uni-common/friend-loader/friend-loader.vue +0 -53
  47. package/uni-common/friend-portray/friend-portray.vue +0 -56
  48. package/uni-common/group-avatar/default.svg +0 -1
  49. package/uni-common/group-avatar/group-avatar.vue +0 -18
  50. package/uni-common/group-avatar/index.js +0 -3
  51. package/uni-common/room-avatar/default.svg +0 -6
  52. package/uni-common/room-avatar/index.js +0 -3
  53. package/uni-common/room-avatar/room-avatar.vue +0 -27
  54. package/uni-common/room-loader/room-loader.vue +0 -53
  55. package/uni-common/room-portray/room-portray.vue +0 -56
  56. package/uni-components/chat-control/calling/calling.vue +0 -91
  57. package/uni-components/chat-control/calling/phone-fill.svg +0 -1
  58. package/uni-components/chat-control/calling/vidicon-fill.svg +0 -1
  59. package/uni-components/chat-control/channel-video/channel-video.vue +0 -89
  60. package/uni-components/chat-control/channel-video-card/channel-video-card.vue +0 -105
  61. package/uni-components/chat-control/channel-video-live/channel-video-live.vue +0 -92
  62. package/uni-components/chat-control/chat-control-config-item/chat-control-config-item.vue +0 -20
  63. package/uni-components/chat-control/chat-control-config-item/index.js +0 -3
  64. package/uni-components/chat-control/chat-control-config-msg/chat-control-config-msg-app.vue +0 -25
  65. package/uni-components/chat-control/chat-control-config-msg/chat-control-config-msg-h5.vue +0 -21
  66. package/uni-components/chat-control/chat-control.vue +0 -218
  67. package/uni-components/chat-control/company-card/company-card.vue +0 -123
  68. package/uni-components/chat-control/const.js +0 -28
  69. package/uni-components/chat-control/expression/expression.vue +0 -41
  70. package/uni-components/chat-control/image/image.vue +0 -68
  71. package/uni-components/chat-control/index.js +0 -89
  72. package/uni-components/chat-control/location/location.vue +0 -110
  73. package/uni-components/chat-control/member-change/member-change.vue +0 -32
  74. package/uni-components/chat-control/quote-message/quote-message.vue +0 -216
  75. package/uni-components/chat-control/real-time-position/real-time-position.vue +0 -62
  76. package/uni-components/chat-control/redpacket/red-envelope.svg +0 -1
  77. package/uni-components/chat-control/redpacket/redpacket.vue +0 -75
  78. package/uni-components/chat-control/share-card/share-card.vue +0 -101
  79. package/uni-components/chat-control/system/system.vue +0 -69
  80. package/uni-components/chat-control/system-batch-message/system-batch-message.vue +0 -30
  81. package/uni-components/chat-control/system-text/system-text.vue +0 -32
  82. package/uni-components/chat-control/text/text.vue +0 -67
  83. package/uni-components/chat-control/text-with-at/text-with-at.vue +0 -51
  84. package/uni-components/chat-control/transfer/red-transfer.svg +0 -1
  85. package/uni-components/chat-control/transfer/transfer.vue +0 -80
  86. package/uni-components/chat-control/unkonw/unkonw.vue +0 -37
  87. package/uni-components/chat-control/url/icons/file-excel-line.svg +0 -1
  88. package/uni-components/chat-control/url/icons/file-info-line.svg +0 -1
  89. package/uni-components/chat-control/url/icons/file-music-line.svg +0 -1
  90. package/uni-components/chat-control/url/icons/file-pdf-line.svg +0 -1
  91. package/uni-components/chat-control/url/icons/file-ppt-line.svg +0 -1
  92. package/uni-components/chat-control/url/icons/file-settings-line.svg +0 -1
  93. package/uni-components/chat-control/url/icons/file-text-line.svg +0 -1
  94. package/uni-components/chat-control/url/icons/file-unknow-line.svg +0 -1
  95. package/uni-components/chat-control/url/icons/file-word-line.svg +0 -1
  96. package/uni-components/chat-control/url/icons/file-zip-line.svg +0 -1
  97. package/uni-components/chat-control/url/icons/index.js +0 -24
  98. package/uni-components/chat-control/url/miniprogram.svg +0 -1
  99. package/uni-components/chat-control/url/url-miniprogram.vue +0 -116
  100. package/uni-components/chat-control/url/url.vue +0 -306
  101. package/uni-components/chat-control/url-new/icons/file-excel-line.svg +0 -1
  102. package/uni-components/chat-control/url-new/icons/file-info-line.svg +0 -1
  103. package/uni-components/chat-control/url-new/icons/file-music-line.svg +0 -1
  104. package/uni-components/chat-control/url-new/icons/file-pdf-line.svg +0 -1
  105. package/uni-components/chat-control/url-new/icons/file-ppt-line.svg +0 -1
  106. package/uni-components/chat-control/url-new/icons/file-settings-line.svg +0 -1
  107. package/uni-components/chat-control/url-new/icons/file-text-line.svg +0 -1
  108. package/uni-components/chat-control/url-new/icons/file-unknow-line.svg +0 -1
  109. package/uni-components/chat-control/url-new/icons/file-word-line.svg +0 -1
  110. package/uni-components/chat-control/url-new/icons/file-zip-line.svg +0 -1
  111. package/uni-components/chat-control/url-new/icons/index.js +0 -24
  112. package/uni-components/chat-control/url-new/url-new.vue +0 -110
  113. package/uni-components/chat-control/utils.js +0 -12
  114. package/uni-components/chat-control/video/video.vue +0 -156
  115. package/uni-components/chat-control/voice/voice.vue +0 -166
  116. package/uni-components/chat-editor/chat-editor-chartlet/chat-editor-chartlet-collect.vue +0 -84
  117. package/uni-components/chat-editor/chat-editor-chartlet/chat-editor-chartlet-system.vue +0 -28
  118. package/uni-components/chat-editor/chat-editor-chartlet/chat-editor-chartlet.vue +0 -85
  119. package/uni-components/chat-editor/chat-editor-func/chat-editor-func.vue +0 -157
  120. package/uni-components/chat-editor/chat-editor-func-at/chat-editor-func-at-panel.vue +0 -158
  121. package/uni-components/chat-editor/chat-editor-func-at/chat-editor-func-at.vue +0 -61
  122. package/uni-components/chat-editor/chat-editor-func-button/chat-editor-func-button.vue +0 -58
  123. package/uni-components/chat-editor/chat-editor-func-file/chat-editor-func-file.vue +0 -54
  124. package/uni-components/chat-editor/chat-editor-func-image/chat-editor-func-image.vue +0 -42
  125. package/uni-components/chat-editor/chat-editor-func-video/chat-editor-func-video.vue +0 -42
  126. package/uni-components/chat-editor/chat-editor-func-voice/chat-editor-func-voice.vue +0 -25
  127. package/uni-components/chat-editor/chat-editor-message-send/chat-editor-message-send.vue +0 -158
  128. package/uni-components/chat-editor/chat-editor-quote/chat-editor-quote.vue +0 -75
  129. package/uni-components/chat-editor/chat-editor.vue +0 -257
  130. package/uni-components/chat-editor/index.js +0 -10
  131. package/uni-components/chat-editor/util.js +0 -65
  132. package/uni-components/chat-panel/chat-panel-chats-box.vue +0 -238
  133. package/uni-components/chat-panel/chat-panel-chats-forward/chat-panel-chats-forward.vue +0 -273
  134. package/uni-components/chat-panel/chat-panel-chats-item.vue +0 -578
  135. package/uni-components/chat-panel/chat-panel-chats-status/chat-panel-chats-status.vue +0 -71
  136. package/uni-components/chat-panel/chat-panel-chats.vue +0 -368
  137. package/uni-components/chat-panel/chat-panel.vue +0 -227
  138. package/uni-components/contacts-group-select/contacts-group-select-item.vue +0 -85
  139. package/uni-components/contacts-group-select/contacts-group-select-panel.vue +0 -119
  140. package/uni-components/contacts-group-select/contacts-group-select.vue +0 -150
@@ -1,368 +0,0 @@
1
- <template>
2
- <scroll-view
3
- id="chatPanelChats"
4
- class="bi-chat-panel-chats"
5
- scroll-y="true"
6
- :scroll-into-view="scrollIntoMessageId"
7
- @scrolltoupper="handleScrollTop"
8
- @scrolltolower="handleScrollBottom"
9
- >
10
- <template v-if="reloading">
11
- <view class="bi-chat-panel-chats__reloading">
12
- <uv-loading-icon></uv-loading-icon>
13
- </view>
14
- </template>
15
- <template v-else>
16
- <template v-if="!isEmpty">
17
- <template v-if="loading">
18
- <view class="bi-chat-panel-chats__loading">
19
- <view class="bi-chat-panel-chats__loading-icon">
20
- <uv-loading-icon size="18px"></uv-loading-icon>
21
- </view>
22
- <view class="bi-chat-panel-chats__loading-text">
23
- 数据加载中...
24
- </view>
25
- </view>
26
- </template>
27
- <view v-else class="bi-chat-panel-chats__loadmore" @click="handleLoadMoreClick">
28
- 点击加载更多消息
29
- </view>
30
- <template v-for="day in messageData">
31
- <template
32
- v-for="milliseconds in day"
33
- >
34
- <template
35
- v-for="message in milliseconds"
36
- >
37
- <chat-panel-chats-item
38
- :id="`message-${message.id}`"
39
- :key="message.id"
40
- :data="message"
41
- :fetch-user-method="fetchUserMethod"
42
- @more-action-click="handleMoreActionClick"
43
- >
44
- <template slot="chat-append" slot-scope="scope">
45
- <slot name="chat-append" v-bind="scope"></slot>
46
- </template>
47
- <template slot="chat-prefix" slot-scope="scope">
48
- <slot name="chat-prefix" v-bind="scope"></slot>
49
- </template>
50
- </chat-panel-chats-item>
51
- </template>
52
- </template>
53
- </template>
54
- </template>
55
- <template v-else>
56
- <view class="bi-chat-panel-chats__empty">
57
- <view class="bi-chat-panel-chats__empty-icon">
58
- <bi-icon name="message-line" size="48px" color="#aaa"></bi-icon>
59
- </view>
60
- <view class="bi-chat-panel-chats__empty-text">暂无聊天数据</view>
61
- </view>
62
- </template>
63
- </template>
64
- </scroll-view>
65
- </template>
66
-
67
- <script>
68
- import ChatPanelChatsItem from './chat-panel-chats-item.vue'
69
- import { isEmptyObject } from '../../utils/util.js'
70
- import { unique } from '../../utils/string.js'
71
- import { formatDate } from '../../utils/date.js'
72
-
73
- export default {
74
- name: 'BiChatPanelChats',
75
- components: {
76
- ChatPanelChatsItem
77
- },
78
- props: {
79
- /**
80
- * {
81
- * day: { // 按照天分组,这样的好处是就不用做排序了,用浏览器的机制
82
- * milliseconds: [ // 按照毫秒分组,一般不可能毫秒级还有多条消息,这里用数组只是防止真的存在
83
- * // 消息数据
84
- * ...
85
- * ]
86
- * },
87
- * }
88
- */
89
- data: {
90
- type: Object
91
- },
92
- queryMethod: {
93
- type: Function
94
- },
95
- autoLoad: {
96
- type: Boolean,
97
- default: true
98
- },
99
- fetchUserMethod: {
100
- type: Function,
101
- required: true
102
- }
103
- },
104
- data () {
105
- return {
106
- loading: false,
107
- reloading: false,
108
- messageData: this.data || {},
109
- scrollIntoMessageId: null
110
- }
111
- },
112
- computed: {
113
- isEmpty () {
114
- return isEmptyObject(this.messageData)
115
- }
116
- },
117
- watch: {
118
- data () {
119
- this.messageData = this.data || {}
120
- }
121
- },
122
- mounted () {
123
- if (this.autoLoad) {
124
- this.reload()
125
- }
126
- this.selectorQuery = uni.createSelectorQuery().in(this)
127
- },
128
- methods: {
129
- handleDataChange () {
130
- this._dataChangeTimer = setTimeout(() => {
131
- this.checkScrollTop()
132
- })
133
- },
134
- handleScrollTop () {
135
- this.loadMoreData()
136
- },
137
- handleScrollBottom (evt) {
138
- // console.log(evt)
139
- },
140
- scrollToMessage (messageId) {
141
- this.scrollIntoMessageId = 'message-' + messageId
142
- },
143
- /**
144
- * 获取根DOM节点相关信息
145
- */
146
- getRootElInfo () {
147
- return Promise.all([
148
- new Promise((resolve) => {
149
- this.selectorQuery.select('#chatPanelChats').boundingClientRect(res => {
150
- resolve(res)
151
- }).exec()
152
- }),
153
- new Promise((resolve) => {
154
- this.selectorQuery.select('#chatPanelChats').scrollOffset((res) => {
155
- resolve(res)
156
- }).exec()
157
- })
158
- ]).then(rs => {
159
- return rs.reduce((rs1, v) => {
160
- rs1 = Object.assign({}, rs1, v)
161
- return rs1
162
- }, {})
163
- })
164
- },
165
- /**
166
- * 检查滚动的位置
167
- * 如果消息发生了改变,并且当前滚动的距离不足一个窗口高度,那么自动滚动到最底部,否则不改变滚动距离
168
- */
169
- checkScrollToBottom () {
170
- this.$nextTick(() => {
171
- this.getRootElInfo().then(rs => {
172
- // 如果用户已经滚动了一些距离,那么就不定位到最新的消息上
173
- if (rs.scrollHeight - rs.scrollTop - rs.height >= rs.height) {
174
- return
175
- }
176
- const lastMessage = this.getLastMessage()
177
- if (!lastMessage) {
178
- return
179
- }
180
- this.scrollToMessage(lastMessage.id)
181
- })
182
- })
183
- },
184
- scrollToBottom () {
185
- this.$nextTick(() => {
186
- this.getRootElInfo().then(rs => {
187
- const lastMessage = this.getLastMessage()
188
- if (!lastMessage) {
189
- return
190
- }
191
- this.scrollToMessage(lastMessage.id)
192
- })
193
- })
194
- },
195
- /**
196
- * 获取最后一条消息
197
- */
198
- getLastMessage () {
199
- const lastDayKey = Object.keys(this.messageData || {}).pop()
200
- if (!lastDayKey) {
201
- return
202
- }
203
- const lastMillisecondsKey = Object.keys(this.messageData[lastDayKey] || {}).pop()
204
- if (!lastMillisecondsKey) {
205
- return
206
- }
207
- return this.messageData[lastDayKey][lastMillisecondsKey][this.messageData[lastDayKey][lastMillisecondsKey].length - 1]
208
- },
209
- /**
210
- * 获取第一一条消息
211
- */
212
- getFristMessage () {
213
- const firstDayKey = Object.keys(this.messageData || {}).shift()
214
- if (!firstDayKey) {
215
- return
216
- }
217
- const firstMillisecondsKey = Object.keys(this.messageData[firstDayKey] || {}).shift()
218
- if (!firstMillisecondsKey) {
219
- return
220
- }
221
- return this.messageData[firstDayKey][firstMillisecondsKey][0]
222
- },
223
- getSortField (time) {
224
- const step = 1000 * 60 * 60 * 24
225
- const day = Math.floor(time / step)
226
- const milliseconds = time - (day * step)
227
- return {
228
- day: day, // Math.abs(day - 1000000),
229
- milliseconds: milliseconds // Math.abs(milliseconds - 86400000)
230
- }
231
- },
232
- addMessageItem (data) {
233
- const sortField = 'wechatTime'
234
- if (!data || !data.id || !data[sortField]) {
235
- throw new Error('缺少必须参数')
236
- }
237
- if (this.messageData[data.id]) {
238
- return
239
- }
240
- const sortFields = this.getSortField(data[sortField])
241
- if (!this.messageData[sortFields.day]) {
242
- this.$set(this.messageData, sortFields.day, {})
243
- }
244
- if (!this.messageData[sortFields.day][sortFields.milliseconds]) {
245
- this.$set(this.messageData[sortFields.day], sortFields.milliseconds, [])
246
- }
247
- if (this.messageData[sortFields.day][sortFields.milliseconds].some(v => v.id === data.id)) {
248
- return
249
- }
250
- this.messageData[sortFields.day][sortFields.milliseconds].push(data)
251
- },
252
- loadData (params) {
253
- if (!this.queryMethod) {
254
- return Promise.reject('缺少queryMethod方法')
255
- }
256
- const endTime = Date.now()
257
- const startTime = endTime - (1 * 1000 * 60 * 60 * 24 * 30)
258
- return this.queryMethod(Object.assign({
259
- bigWechatTime: endTime,
260
- smallWechatTime: startTime,
261
- pageSize: 20,
262
- upward: true
263
- }, params), { initLoaded: !this.getFristMessage() }).then(rs => {
264
- this.$nextTick(() => {
265
- // 如果外面没有传data过来,例如搜索消息的场景,那么组件内部构造messageData
266
- if (!this.data) {
267
- if (rs && rs.length) {
268
- rs.forEach(v => {
269
- this.addMessageItem(v)
270
- })
271
- } else {
272
- if (params && params.bigWechatTime && params.smallWechatTime) {
273
- this.addMessageItem({
274
- id: unique(),
275
- msgType: '_EMPTY_',
276
- wechatTime: params.smallWechatTime - 1,
277
- createTime: params.smallWechatTime - 1,
278
- content: `${formatDate(params.smallWechatTime)}至${formatDate(params.bigWechatTime)}没有数据`
279
- })
280
- }
281
- }
282
- }
283
- })
284
- })
285
- },
286
- loadMoreData () {
287
- if (this.loading || this.reloading) {
288
- return
289
- }
290
- const firstMessage = this.getFristMessage()
291
- const startTime = firstMessage ? firstMessage.wechatTime - 1000 * 60 * 60 * 24 * 15 : null
292
- const endTime = firstMessage ? firstMessage.wechatTime : null
293
- this.loading = true
294
- this.loadData({
295
- bigWechatTime: endTime,
296
- smallWechatTime: startTime,
297
- pageSize: 20,
298
- upward: true
299
- }).finally(() => {
300
- this.loading = false
301
- })
302
- },
303
- reload () {
304
- this.reloading = true
305
- this.messageData = {}
306
- this.loadData().finally(() => {
307
- this.reloading = false
308
- })
309
- },
310
- handleLoadMoreClick () {
311
- this.loadMoreData()
312
- },
313
- handleMoreActionClick (evt) {
314
- this.$emit('more-action-click', evt)
315
- }
316
- },
317
- beforeDestroy () {
318
- clearTimeout(this._dataChangeTimer)
319
- }
320
- }
321
- </script>
322
-
323
- <style lang="less">
324
- .bi-chat-panel-chats{
325
- height: 100%;
326
- }
327
- .bi-chat-panel-chats__loading{
328
- display: flex;
329
- flex-direction: row;
330
- align-items: center;
331
- justify-content: center;
332
- color: #999;
333
- height: 32px;
334
- line-height: 32px;
335
- }
336
- .bi-chat-panel-chats__loading-icon {
337
- margin-right: 6px;
338
- }
339
- .bi-chat-panel-chats__reloading{
340
- position: absolute;
341
- left: 50%;
342
- top: 50%;
343
- transform: translate(-50%, -50%);
344
- }
345
- .bi-chat-panel-chats__empty{
346
- height: 100%;
347
- display: flex;
348
- flex-direction: column;
349
- align-items: center;
350
- justify-content: center;
351
- }
352
- .bi-chat-panel-chats__empty-text{
353
- color: #999;
354
- margin-top: 3px;
355
- }
356
- .bi-chat-panel-chats__loadmore{
357
- display: flex;
358
- flex-direction: row;
359
- align-items: center;
360
- justify-content: center;
361
- color: #999;
362
- height: 32px;
363
- line-height: 32px;
364
- &:hover {
365
- color: #244ac0;
366
- }
367
- }
368
- </style>
@@ -1,227 +0,0 @@
1
- <template>
2
- <view class="bi-chat-panel" :class="{'is-selectable': selectable}">
3
- <view class="bi-chat-panel__main">
4
- <chat-panel-chats
5
- ref="chatPanelChats"
6
- :data="data"
7
- :auto-load="autoLoad"
8
- :query-method="queryMethod"
9
- :fetch-user-method="fetchUserMethod"
10
- @more-action-click="handleMoreActionClick"
11
- >
12
- <template slot="chat-append" slot-scope="{ data }">
13
- <chat-panel-chats-status :data="data"></chat-panel-chats-status>
14
- </template>
15
- <template slot="chat-prefix" slot-scope="{ data }">
16
- <template v-if="selectable">
17
- <div class="bi-chat-panel__checkbox" :class="{'is-checked': checkMsgMap[data[keyField]]}" @click="handleMsgCheckboxChange(data)"></div>
18
- </template>
19
- </template>
20
- </chat-panel-chats>
21
- </view>
22
- <view class="bi-chat-panel__toolbar">
23
- <template v-if="selectable">
24
- <slot name="selection" :total="checkTotal" :unselect="handleUnSelectMethod" :get-selection-data="handleGetSelectionDataMethod"></slot>
25
- </template>
26
- </view>
27
- <uv-action-sheet
28
- ref="chatActionSheet"
29
- :actions="chatActionSheetOptions"
30
- @select="handleChatActionSheetSelect"
31
- ></uv-action-sheet>
32
- </view>
33
- </template>
34
-
35
- <script>
36
- import ChatPanelChats from './chat-panel-chats.vue'
37
- import ChatPanelChatsStatus from './chat-panel-chats-status/chat-panel-chats-status.vue'
38
- import { copyText } from '../../utils/string'
39
- import { MESSAGE_TYPE } from '../chat-control'
40
- import { toJson } from '../../utils/data'
41
-
42
- export default {
43
- name: 'BiChatPanel',
44
- components: {
45
- ChatPanelChats,
46
- ChatPanelChatsStatus
47
- },
48
- props: {
49
- keyField: {
50
- type: String,
51
- default: 'id'
52
- },
53
- /**
54
- * {
55
- * day: { // 按照天分组,这样的好处是就不用做排序了,用浏览器的机制
56
- * milliseconds: [ // 按照毫秒分组,一般不可能毫秒级还有多条消息,这里用数组只是防止真的存在
57
- * // 消息数据
58
- * ...
59
- * ]
60
- * },
61
- * }
62
- */
63
- data: {
64
- type: Object
65
- },
66
- selectable: {
67
- type: Boolean,
68
- default: false
69
- },
70
- autoLoad: {
71
- type: Boolean,
72
- default: true
73
- },
74
- queryMethod: {
75
- type: Function
76
- },
77
- fetchUserMethod: {
78
- type: Function,
79
- required: true
80
- },
81
- actionSheetOptionsMethod: {
82
- type: Function
83
- }
84
- },
85
- data () {
86
- return {
87
- currentChat: null,
88
- checkMsgMap: {},
89
- chatActionSheetOptions: []
90
- }
91
- },
92
- computed: {
93
- checkTotal () {
94
- return Object.keys(this.checkMsgMap).length
95
- }
96
- },
97
- watch: {
98
- selectable () {
99
- if (!this.selectable) {
100
- this.checkMsgMap = {}
101
- }
102
- }
103
- },
104
- methods: {
105
- handleChatClassMethod () {
106
- return {
107
- 'is-selectable': this.selectable
108
- }
109
- },
110
- handleUnSelectMethod () {
111
- this.checkMsgMap = {}
112
- },
113
- handleGetSelectionDataMethod () {
114
- return Object.keys(this.checkMsgMap).map(key => {
115
- return this.checkMsgMap[key]
116
- })
117
- },
118
- handleMsgCheckboxChange (msg) {
119
- const nextChecked = !this.checkMsgMap[msg[this.keyField]]
120
- if (nextChecked) {
121
- this.$set(this.checkMsgMap, msg[this.keyField], msg)
122
- } else {
123
- this.$delete(this.checkMsgMap, msg[this.keyField])
124
- }
125
- },
126
- handleMoreActionClick ({ data }) {
127
- this.currentChat = data
128
- if (this.actionSheetOptionsMethod) {
129
- this.chatActionSheetOptions = (this.actionSheetOptionsMethod({
130
- item: data
131
- }) || []).reduce((rs, v) => {
132
- const text = typeof v.text === 'function' ? v.text() : v.text
133
- const disabled = typeof v.disabled === 'function' ? v.disabled() : v.disabled
134
- const visible = typeof v.visible === 'function' ? v.visible() : v.visible
135
- if (visible !== false) {
136
- rs.push({
137
- name: text,
138
- disabled,
139
- click: v.click
140
- })
141
- }
142
- return rs
143
- }, [])
144
- }
145
- this.$refs.chatActionSheet.open()
146
- },
147
- handleChatActionSheetSelect (item) {
148
- if (item.click) {
149
- item.click()
150
- }
151
- },
152
- scrollToMessage (messageId) {
153
- this.$refs.chatPanelChats.scrollToMessage(messageId)
154
- },
155
- checkScrollToBottom () {
156
- this.$refs.chatPanelChats.checkScrollToBottom()
157
- },
158
- scrollToBottom () {
159
- this.$refs.chatPanelChats.scrollToBottom()
160
- },
161
- reload () {
162
- this.$refs.chatPanelChats.reload()
163
- },
164
- copyMessage (msg) {
165
- if (msg.msgType === MESSAGE_TYPE.QUOTE_MESSAGE) {
166
- const quoteContent = toJson(msg.content) || {}
167
- copyText(quoteContent.content).then(() => {
168
- this.$success('复制成功')
169
- })
170
- } else if (msg.msgType === MESSAGE_TYPE.TEXT_WITH_AT) {
171
- const atContent = toJson(msg.content) || {}
172
- copyText(atContent.text).then(() => {
173
- this.$success('复制成功')
174
- })
175
- } else {
176
- copyText(msg.content).then(() => {
177
- this.$success('复制成功')
178
- })
179
- }
180
- }
181
- }
182
- }
183
- </script>
184
-
185
- <style lang="less">
186
- .bi-chat-panel{
187
- height: 100%;
188
- display: flex;
189
- flex-direction: column;
190
- &.is-selectable {
191
- /deep/ .bi-chat-panel-chats-item{
192
- padding-left: 30px;
193
- position: relative;
194
- }
195
- }
196
- }
197
- .bi-chat-panel__main{
198
- flex: 1;
199
- min-height: 0;
200
- }
201
- .bi-chat-panel__checkbox{
202
- width: 16px;
203
- height: 16px;
204
- border: 1px solid #eee;
205
- border-radius: 3px;
206
- background-color: #fff;
207
- position: absolute;
208
- left: 12px;
209
- top: 50%;
210
- transform: translateY(-50%);
211
- &.is-checked{
212
- background-color: #3c9cff;
213
- &:after {
214
- content: '';
215
- position: absolute;
216
- width: 4px;
217
- height: 6px;
218
- border: 2px solid #fff;
219
- border-left: 0;
220
- border-top: 0;
221
- left: 5px;
222
- top: 2px;
223
- transform: rotate(45deg);
224
- }
225
- }
226
- }
227
- </style>
@@ -1,85 +0,0 @@
1
- <template>
2
- <view
3
- class="bi-contacts-group-select-item"
4
- :class="{'is-selected': selected}"
5
- @click="handleRoomGroupClick"
6
- >
7
- <view class="bi-contacts-group-select-item__icon">
8
- <bi-avatar :name="data.groupName"></bi-avatar>
9
- </view>
10
- <view class="bi-contacts-group-select-item__text">{{ data.groupName }}</view>
11
- <view class="bi-contacts-group-select-item__count">{{ data.num }}</view>
12
- </view>
13
- </template>
14
-
15
- <script>
16
- import BiAvatar from '@aochuang/common/uni-components/avatar/avatar.vue'
17
-
18
- export default {
19
- name: 'BiContactsGroupSelectItem',
20
- components: {
21
- BiAvatar
22
- },
23
- props: {
24
- data: {
25
- type: Object,
26
- required: true
27
- },
28
- selected: {
29
- type: Boolean,
30
- default: false
31
- },
32
- type: {
33
- type: String,
34
- validator (value) {
35
- return ['room', 'friend'].includes(value)
36
- }
37
- }
38
- },
39
- methods: {
40
- handleRoomGroupClick () {
41
- this.$emit('click')
42
- }
43
- }
44
- }
45
- </script>
46
-
47
- <style lang="less">
48
- .bi-contacts-group-select-item{
49
- display: flex;
50
- flex-direction: row;
51
- align-items: center;
52
- padding: 6px 30px 6px 12px;
53
- position: relative;
54
- &:after {
55
- content: '';
56
- width: 8px;
57
- height: 8px;
58
- border: 1px solid #ccc;
59
- transform: translateY(-50%) rotate(45deg);
60
- border-left: 0;
61
- border-bottom: 0;
62
- position: absolute;
63
- right: 16px;
64
- top: 50%;
65
- }
66
- &:active {
67
- background-color: rgba(0,0,0,.1);
68
- }
69
- &.is-selected {
70
- background: #3c9cff;
71
- color: #fff;
72
- &:after {
73
- border-right-color: #fff;
74
- border-bottom-color: #fff;
75
- }
76
- }
77
- }
78
- .bi-contacts-group-select-item__icon{
79
- margin-right: 8px;
80
- }
81
- .bi-contacts-group-select-item__text{
82
- flex: 1;
83
- min-width: 0;
84
- }
85
- </style>