thelounge/client/components/Message.vue

109 lines
3.1 KiB
Vue
Raw Normal View History

<template>
<div
:id="'msg-' + message.id"
:class="['msg', message.type, {self: message.self, highlight: message.highlight}]"
:data-from="message.from && message.from.nick"
>
2019-07-17 09:33:59 +00:00
<span :aria-label="message.time | localetime" class="time tooltipped tooltipped-e"
>{{ messageTime }}
</span>
<template v-if="message.type === 'unhandled'">
<span class="from">[{{ message.command }}]</span>
<span class="content">
2019-07-17 09:33:59 +00:00
<span v-for="(param, id) in message.params" :key="id">{{ param }} </span>
</span>
</template>
2018-07-09 10:44:12 +00:00
<template v-else-if="isAction()">
<span class="from"><span class="only-copy">*** </span></span>
2019-07-17 09:33:59 +00:00
<Component :is="messageComponent" :network="network" :message="message" />
2018-07-09 10:44:12 +00:00
</template>
2018-07-13 10:49:09 +00:00
<template v-else-if="message.type === 'action'">
<span class="from"><span class="only-copy">* </span></span>
<span class="content" dir="auto">
2019-11-23 14:26:20 +00:00
<Username :user="message.from" dir="auto" />&#32;<ParsedMessage
:message="message"
/>
<LinkPreview
v-for="preview in message.previews"
:key="preview.link"
2018-07-29 17:57:14 +00:00
:keep-scroll-position="keepScrollPosition"
:link="preview"
/>
</span>
</template>
2018-07-09 10:44:12 +00:00
<template v-else>
2019-07-17 09:33:59 +00:00
<span v-if="message.type === 'message'" class="from">
<template v-if="message.from && message.from.nick">
<span class="only-copy">&lt;</span>
2019-11-23 14:26:20 +00:00
<Username :user="message.from" />
<span class="only-copy">&gt; </span>
</template>
</span>
2019-10-22 16:44:05 +00:00
<span v-else-if="message.type === 'plugin'" class="from">
<template v-if="message.from && message.from.nick">
<span class="only-copy">[</span>
2019-10-22 17:38:13 +00:00
{{ message.from.nick }}
2019-10-22 16:44:05 +00:00
<span class="only-copy">] </span>
</template>
</span>
2019-07-17 09:33:59 +00:00
<span v-else class="from">
<template v-if="message.from && message.from.nick">
<span class="only-copy">-</span>
2019-11-23 14:26:20 +00:00
<Username :user="message.from" />
<span class="only-copy">- </span>
</template>
</span>
<span class="content" dir="auto">
2019-07-17 09:33:59 +00:00
<ParsedMessage :network="network" :message="message" />
2018-07-10 11:57:11 +00:00
<LinkPreview
v-for="preview in message.previews"
:key="preview.link"
2018-07-29 17:57:14 +00:00
:keep-scroll-position="keepScrollPosition"
:link="preview"
/>
</span>
</template>
</div>
</template>
<script>
import dayjs from "dayjs";
import Username from "./Username.vue";
2018-07-10 11:57:11 +00:00
import LinkPreview from "./LinkPreview.vue";
import ParsedMessage from "./ParsedMessage.vue";
2018-07-09 10:44:12 +00:00
import MessageTypes from "./MessageTypes";
2019-11-16 17:24:03 +00:00
import constants from "../js/constants";
MessageTypes.ParsedMessage = ParsedMessage;
2018-07-10 11:57:11 +00:00
MessageTypes.LinkPreview = LinkPreview;
2018-07-09 10:44:12 +00:00
MessageTypes.Username = Username;
export default {
name: "Message",
2018-07-09 10:44:12 +00:00
components: MessageTypes,
props: {
message: Object,
2019-11-09 22:21:34 +00:00
channel: Object,
2018-07-19 17:44:24 +00:00
network: Object,
keepScrollPosition: Function,
},
2018-07-09 10:44:12 +00:00
computed: {
messageTime() {
const format = this.$store.state.settings.showSeconds
2019-07-17 09:33:59 +00:00
? constants.timeFormats.msgWithSeconds
: constants.timeFormats.msgDefault;
return dayjs(this.message.time).format(format);
},
2018-07-09 10:44:12 +00:00
messageComponent() {
return "message-" + this.message.type;
},
},
methods: {
isAction() {
return typeof MessageTypes["message-" + this.message.type] !== "undefined";
},
},
};
</script>