13
13
</chat-header >
14
14
15
15
<div class =" message-list" >
16
- <div
16
+ <transition-group
17
17
v-if =" messages"
18
+ name =" fade-message"
18
19
class =" message-container chat-scroller"
19
20
ref =" MessageContainer"
20
21
:class =" { 'quiet-loading': isLoading }"
29
30
:previous-message =" index > 0 ? messages[index - 1] : {}"
30
31
:members =" members"
31
32
:message =" message"
32
- >
33
- </messager-item >
33
+ />
34
34
<!-- End of message Item -->
35
- </div >
35
+ </transition-group >
36
36
</div >
37
37
38
38
<!-- Message Box toolbar -->
@@ -122,6 +122,12 @@ export default {
122
122
this .$emit (" opened" , this .channel .sid );
123
123
},
124
124
immediate: true
125
+ },
126
+ isFocused (value ) {
127
+ const len = this .messages .length ;
128
+ if (value && len > 0 ) {
129
+ this .setLastConsumedIndex (this .messages [0 ].index );
130
+ }
125
131
}
126
132
},
127
133
computed: {
@@ -150,11 +156,6 @@ export default {
150
156
created () {
151
157
this .getDescription ();
152
158
},
153
- mounted () {
154
- setTimeout (() => {
155
- this .scrollToBottom ();
156
- });
157
- },
158
159
beforeDestroy () {
159
160
this .removeActiveChannelListeners ();
160
161
},
@@ -232,15 +233,6 @@ export default {
232
233
}
233
234
},
234
235
235
- scrollToBottom (behavior ) {
236
- this .$nextTick (() => {
237
- const el = this .$refs .MessageContainer ;
238
- if (el) {
239
- el .scrollTo ({ top: el .scrollHeight , behavior });
240
- }
241
- });
242
- },
243
-
244
236
removeActiveChannelListeners () {
245
237
if (this .channel ) {
246
238
this .channel .removeListener (" messageAdded" , this .addMessage );
@@ -249,16 +241,10 @@ export default {
249
241
},
250
242
251
243
getMessages () {
252
- this .getMessagesFunc ();
253
- },
254
-
255
- getMessagesFunc () {
256
244
this .channel .getMessages (30 ).then (page => {
257
- this .messages = page .items || [];
258
- this .scrollToBottom ();
259
- const lastIndex = this .messages .length - 1 ;
260
- if (lastIndex >= 0 && this .isFocused ) {
261
- this .setLastConsumedIndex (this .messages [lastIndex].index );
245
+ this .messages = page .items .reverse () || [];
246
+ if (this .isFocused && this .messages .length ) {
247
+ this .setLastConsumedIndex (this .messages [0 ].index );
262
248
}
263
249
this .channel .on (" messageAdded" , this .addMessage );
264
250
this .channel .on (" memberUpdated" , this .updateMembers );
@@ -281,9 +267,8 @@ export default {
281
267
},
282
268
283
269
addMessage (message ) {
284
- this .messages .push (message);
270
+ this .messages .unshift (message);
285
271
this .setLastConsumedIndex (message .index );
286
- this .scrollToBottom (" smooth" );
287
272
},
288
273
289
274
setLastConsumedIndex (index ) {
@@ -349,6 +334,8 @@ export default {
349
334
display : block ;
350
335
width : 100% ;
351
336
height : 100% ;
337
+ display : flex ;
338
+ flex-direction : column-reverse ;
352
339
overflow-x : hidden ;
353
340
overflow-y : scroll ;
354
341
}
@@ -374,6 +361,7 @@ export default {
374
361
white-space : pre-wrap ;
375
362
width : 100% ;
376
363
border : 0 ;
364
+ resize : none ;
377
365
378
366
& :focus {
379
367
outline : none ;
@@ -403,4 +391,17 @@ export default {
403
391
width : 220px !important ;
404
392
border : 2px solid #ccc ;
405
393
}
394
+
395
+ .fade-message-enter {
396
+ opacity : 0 ;
397
+ }
398
+
399
+ .fade-message-enter-active {
400
+ transition : opacity 0.5s ;
401
+ }
402
+
403
+ .fade-message-leave-active {
404
+ transition : opacity 0.2s ;
405
+ opacity : 0 ;
406
+ }
406
407
</style >
0 commit comments