233
233
class =" vac-box-footer"
234
234
:class =" { 'vac-app-box-shadow': filteredUsersTag.length }"
235
235
>
236
- <div class =" vac-icon-textarea-left" v-if =" showAudio && !imageFile" >
236
+ <div
237
+ class =" vac-icon-textarea-left"
238
+ v-if =" showAudio && !imageFile && !videoFile"
239
+ >
237
240
<div class =" vac-svg-button" @click =" recordAudio" >
238
241
<slot
239
242
v-if =" recorder.state === 'recording'"
247
250
</div >
248
251
</div >
249
252
250
- <div class =" vac-image -container" v-if = " imageFile " >
251
- <div class =" vac-svg-button vac-icon-image " @click =" resetImageFile " >
253
+ <div v-if = " imageFile " class =" vac-media -container" >
254
+ <div class =" vac-svg-button vac-icon-media " @click =" resetMediaFile " >
252
255
<slot name =" image-close-icon" >
253
256
<svg-icon name =" close" param =" image" />
254
257
</slot >
255
258
</div >
256
- <div class =" vac-image-file" >
257
- <img ref =" imageFile" :src =" imageFile" @load =" onImgLoad" />
259
+ <div class =" vac-media-file" >
260
+ <img ref =" mediaFile" :src =" imageFile" @load =" onMediaLoad" />
261
+ </div >
262
+ </div >
263
+
264
+ <div v-else-if =" videoFile" class =" vac-media-container" >
265
+ <div class =" vac-svg-button vac-icon-media" @click =" resetMediaFile" >
266
+ <slot name =" image-close-icon" >
267
+ <svg-icon name =" close" param =" image" />
268
+ </slot >
269
+ </div >
270
+ <div ref =" mediaFile" class =" vac-media-file" >
271
+ <video width =" 100%" height =" 100%" controls >
272
+ <source :src =" videoFile" type =" video/mp4" />
273
+ <source :src =" videoFile" type =" video/ogg" />
274
+ <source :src =" videoFile" type =" video/webm" />
275
+ </video >
258
276
</div >
259
277
</div >
260
278
281
299
</div >
282
300
283
301
<textarea
284
- v-show =" !file || imageFile"
302
+ v-show =" !file || imageFile || videoFile "
285
303
ref =" roomTextarea"
286
304
:placeholder =" textMessages.TYPE_MESSAGE"
287
305
class =" vac-textarea"
288
306
:class =" {
289
307
'vac-textarea-outline': editedMessage._id
290
308
}"
291
309
:style =" {
292
- 'min-height': `${imageDimensions ? imageDimensions .height : 20}px`,
310
+ 'min-height': `${mediaDimensions ? mediaDimensions .height : 20}px`,
293
311
'padding-left': `${
294
- imageDimensions ? imageDimensions .width - 10 : 12
312
+ mediaDimensions ? mediaDimensions .width - 10 : 12
295
313
}px`
296
314
}"
297
315
v-model =" message"
312
330
</div >
313
331
314
332
<emoji-picker
315
- v-if =" showEmojis && (!file || imageFile)"
333
+ v-if =" showEmojis && (!file || imageFile || videoFile )"
316
334
:emoji-opened =" emojiOpened"
317
335
:position-top =" true"
318
336
@add-emoji =" addEmoji"
@@ -438,7 +456,8 @@ export default {
438
456
loadingMoreMessages: false ,
439
457
file: null ,
440
458
imageFile: null ,
441
- imageDimensions: null ,
459
+ videoFile: null ,
460
+ mediaDimensions: null ,
442
461
menuOpened: false ,
443
462
emojiOpened: false ,
444
463
hideOptions: true ,
@@ -679,13 +698,13 @@ export default {
679
698
this .filteredUsersTag = []
680
699
this .textareaCursorPosition = null
681
700
},
682
- onImgLoad () {
683
- let height = this .$refs .imageFile . height
701
+ onMediaLoad () {
702
+ let height = this .$refs .mediaFile . clientHeight
684
703
if (height < 30 ) height = 30
685
704
686
- this .imageDimensions = {
687
- height: this .$refs .imageFile . height - 10 ,
688
- width: this .$refs .imageFile . width + 26
705
+ this .mediaDimensions = {
706
+ height: this .$refs .mediaFile . clientHeight - 10 ,
707
+ width: this .$refs .mediaFile . clientWidth + 26
689
708
}
690
709
},
691
710
async recordAudio () {
@@ -778,15 +797,17 @@ export default {
778
797
this .editedMessage = {}
779
798
this .messageReply = null
780
799
this .file = null
781
- this .imageDimensions = null
800
+ this .mediaDimensions = null
782
801
this .imageFile = null
802
+ this .videoFile = null
783
803
this .emojiOpened = false
784
804
this .preventKeyboardFromClosing ()
785
805
setTimeout (() => this .focusTextarea (disableMobileFocus), 0 )
786
806
},
787
- resetImageFile () {
788
- this .imageDimensions = null
807
+ resetMediaFile () {
808
+ this .mediaDimensions = null
789
809
this .imageFile = null
810
+ this .videoFile = null
790
811
this .editedMessage .file = null
791
812
this .file = null
792
813
this .focusTextarea ()
@@ -880,7 +901,14 @@ export default {
880
901
this .resetMessage ()
881
902
this .editedMessage = { ... message }
882
903
this .file = message .file
883
- if (this .isImageCheck (this .file )) this .imageFile = message .file .url
904
+
905
+ if (this .isImageCheck (this .file )) {
906
+ this .imageFile = message .file .url
907
+ } else if (this .isVideoCheck (this .file )) {
908
+ this .videoFile = message .file .url
909
+ setTimeout (() => this .onMediaLoad (), 50 )
910
+ }
911
+
884
912
this .message = message .content
885
913
886
914
setTimeout (() => this .resizeTextarea (), 0 )
@@ -920,7 +948,7 @@ export default {
920
948
this .$refs .file .click ()
921
949
},
922
950
async onFileChange (files ) {
923
- this .resetImageFile ()
951
+ this .resetMediaFile ()
924
952
const file = files[0 ]
925
953
const fileURL = URL .createObjectURL (file)
926
954
const blobFile = await fetch (fileURL).then (res => res .blob ())
@@ -934,15 +962,28 @@ export default {
934
962
extension: file .name .substring (typeIndex + 1 ),
935
963
localUrl: fileURL
936
964
}
937
- if (this .isImageCheck (this .file )) this .imageFile = fileURL
938
- else this .message = file .name
965
+
966
+ if (this .isImageCheck (this .file )) {
967
+ this .imageFile = fileURL
968
+ } else if (this .isVideoCheck (this .file )) {
969
+ this .videoFile = fileURL
970
+ setTimeout (() => this .onMediaLoad (), 50 )
971
+ } else {
972
+ this .message = file .name
973
+ }
939
974
},
940
975
isImageCheck (file ) {
941
976
if (! file) return
942
977
const imageTypes = IMAGE_TYPES
943
978
const { type } = file
944
979
return imageTypes .some (t => type .toLowerCase ().includes (t))
945
980
},
981
+ isVideoCheck (file ) {
982
+ if (! file) return
983
+ const videoTypes = [' video/mp4' , ' video/ogg' , ' video/webm' ]
984
+ const { type } = file
985
+ return videoTypes .some (t => type .toLowerCase ().includes (t))
986
+ },
946
987
openFile ({ message, action }) {
947
988
this .$emit (' open-file' , { message, action })
948
989
},
@@ -1202,6 +1243,7 @@ export default {
1202
1243
.vac-image-reply {
1203
1244
max-height : 100px ;
1204
1245
margin-right : 10px ;
1246
+ border-radius : 4px ;
1205
1247
}
1206
1248
}
1207
1249
@@ -1271,14 +1313,14 @@ export default {
1271
1313
}
1272
1314
}
1273
1315
1274
- .vac-image -container {
1316
+ .vac-media -container {
1275
1317
position : absolute ;
1276
1318
max-width : 25% ;
1277
1319
left : 16px ;
1278
1320
top : 18px ;
1279
1321
}
1280
1322
1281
- .vac-image -file {
1323
+ .vac-media -file {
1282
1324
display : flex ;
1283
1325
justify-content : center ;
1284
1326
flex-direction : column ;
@@ -1290,9 +1332,16 @@ export default {
1290
1332
max-width : 150px ;
1291
1333
max-height : 100% ;
1292
1334
}
1335
+
1336
+ video {
1337
+ border-radius : 15px ;
1338
+ width : 100% ;
1339
+ max-width : 250px ;
1340
+ max-height : 100% ;
1341
+ }
1293
1342
}
1294
1343
1295
- .vac-icon-image {
1344
+ .vac-icon-media {
1296
1345
position : absolute ;
1297
1346
top : 6px ;
1298
1347
left : 6px ;
@@ -1433,13 +1482,16 @@ export default {
1433
1482
}
1434
1483
}
1435
1484
1436
- .vac-image -container {
1485
+ .vac-media -container {
1437
1486
top : 10px ;
1438
1487
left : 10px ;
1439
1488
}
1440
1489
1441
- .vac-image-file img {
1442
- transform : scale (0.97 );
1490
+ .vac-media-file {
1491
+ img ,
1492
+ video {
1493
+ transform : scale (0.97 );
1494
+ }
1443
1495
}
1444
1496
1445
1497
.vac-room-footer {
0 commit comments