<template> <div v-if="content.msgtype==='m.text'" v-html="parseMessage(content.body)"/> <div v-else-if="content.msgtype==='m.notice'" class="notice" v-html="parseMessage(content.body)"/> <div v-else-if="content.msgtype==='m.image'" class="image"> <img :src="getSource(content.url)" :alt="content.body" :class="`${compact?'compact':''}`"/><br> {{content.body}} </div> <div v-else-if="content.msgtype==='m.file'" :class="`file ${compact?'compact':''}`"> <a :href="getSource(content.url)" target="_blank"> <div class="fileContent"> <icon title="file" ic="./sym/ic_attach_file_white.svg" class="download" /> <div class="filename"> {{content.filename || getSource(content.url)}} </div> </div> </a> <div class="text"> {{content.body}} </div> </div> <div v-else-if="content.msgtype==='m.audio'" :class="`audio ${compact?'compact':''}`"> <audio controls :class="`${compact?'compact':''}`"> <source :src="getSource(content.url)" :type="content.mimetype"> your browser doesn't support audio </audio><br> {{content.body}} </div> <div v-else-if="content.msgtype==='m.video'" :class="`video ${compact?'compact':''}`"> <video controls :class="`${compact?'compact':''}`"> <source :src="getSource(content.url)" :type="content.mimetype"> your browser doesn't support video </video><br> {{content.body}} </div> <div v-else class="italic">unsupported message type {{content.msgtype}}</div> </template> <script> import {getMediaUrl} from '@/lib/getMxc'; import {parseMessage} from '@/lib/eventUtils'; import Icon from '@/components/icon'; export default { name: 'eventContent', components: {Icon}, props: { content: Object, compact: { type: Boolean, default: false } }, methods: { getSource(url){ return url.includes('mxc')?getMediaUrl(url):url; }, parseMessage } } </script> <style scoped lang="scss"> .file{ max-width: 30rem; .fileContent{ position: relative; background-color: #1d1d1d; padding: 0.5rem; border-radius: 0.5rem; min-height: 3rem; .filename{ display: inline-block; position: relative; margin-left: 4rem; top: 0; height: 100%; } .download{ position: absolute; } } .compact{ max-width: 20rem; } } .image{ width: 100%; img{ max-width: 100%; height: auto; max-height: 35rem; border-radius: 0.5rem; } .compact{ max-width: 8rem; max-height: 8rem; } } .video{ width: 100%; video{ max-width: 100%; height: auto; max-height: 35rem; border-radius: 0.5rem; } .compact{ max-width: 8rem; max-height: 8rem; } } .audio{ audio{ max-width: 100%; } .compact{ max-width: 16rem; max-height: 8rem; } } .italic{ font-style: italic; } </style>