thelounge/client/components/Message.vue

186 lines
5.2 KiB
Vue
Raw Normal View History

<template>
<div
:id="'msg-' + message.id"
:class="[
'msg',
{
self: message.self,
highlight: message.highlight || focused,
'previous-source': isPreviousSource,
},
2022-06-03 05:02:24 +02:00
batchType,
]"
2019-12-15 12:46:43 +01:00
:data-type="message.type"
:data-command="message.command"
:data-from="message.from && message.from.nick"
>
<span
aria-hidden="true"
:aria-label="messageTimeLocale"
class="time tooltipped tooltipped-e"
2022-06-02 05:39:07 +02:00
>{{ `${messageTime}&#32;` }}
</span>
<template v-if="message.type === 'unhandled'">
<span class="from">[{{ message.command }}]</span>
<span class="content">
2022-06-02 05:39:07 +02:00
<span v-for="(param, id) in message.params" :key="id">{{
`&#32;${param}&#32;`
}}</span>
</span>
</template>
2018-07-09 12:44:12 +02:00
<template v-else-if="isAction()">
<span class="from"><span class="only-copy">***&nbsp;</span></span>
<component :is="messageComponent" :network="network" :message="message" />
2018-07-09 12:44:12 +02:00
</template>
2018-07-13 12:49:09 +02:00
<template v-else-if="message.type === 'action'">
<span class="from"><span class="only-copy">*&nbsp;</span></span>
<span class="content" dir="auto">
2020-04-24 09:20:40 +02:00
<Username
:user="message.from"
:network="network"
:channel="channel"
dir="auto"
/>&#32;<ParsedMessage :message="message" />
<LinkPreview
v-for="preview in message.previews"
:key="preview.link"
2018-07-29 19:57:14 +02:00
:keep-scroll-position="keepScrollPosition"
:link="preview"
2020-03-09 17:39:05 +01:00
:channel="channel"
/>
</span>
</template>
2018-07-09 12:44:12 +02:00
<template v-else>
2019-07-17 11:33:59 +02:00
<span v-if="message.type === 'message'" class="from">
<template v-if="message.from && message.from.nick">
<span class="only-copy" aria-hidden="true">&lt;</span>
2020-04-24 09:20:40 +02:00
<Username :user="message.from" :network="network" :channel="channel" />
<span class="only-copy" aria-hidden="true">&gt;&nbsp;</span>
</template>
</span>
2019-10-22 18:44:05 +02:00
<span v-else-if="message.type === 'plugin'" class="from">
<template v-if="message.from && message.from.nick">
<span class="only-copy" aria-hidden="true">[</span>
2019-10-22 19:38:13 +02:00
{{ message.from.nick }}
<span class="only-copy" aria-hidden="true">]&nbsp;</span>
2019-10-22 18:44:05 +02:00
</template>
</span>
2019-07-17 11:33:59 +02:00
<span v-else class="from">
<template v-if="message.from && message.from.nick">
<span class="only-copy" aria-hidden="true">-</span>
2020-04-24 09:20:40 +02:00
<Username :user="message.from" :network="network" :channel="channel" />
<span class="only-copy" aria-hidden="true">-&nbsp;</span>
</template>
</span>
<span class="content" dir="auto">
<span
v-if="message.showInActive"
aria-label="This message was shown in your active channel"
class="msg-shown-in-active tooltipped tooltipped-e"
><span></span
></span>
2020-04-24 10:46:39 +02:00
<span
v-if="message.statusmsgGroup"
:aria-label="`This message was only shown to users with ${message.statusmsgGroup} mode`"
class="msg-statusmsg tooltipped tooltipped-e"
><span>{{ message.statusmsgGroup }}</span></span
>
2019-07-17 11:33:59 +02:00
<ParsedMessage :network="network" :message="message" />
2018-07-10 13:57:11 +02:00
<LinkPreview
v-for="preview in message.previews"
:key="preview.link"
2018-07-29 19:57:14 +02:00
:keep-scroll-position="keepScrollPosition"
:link="preview"
2020-03-09 17:39:05 +01:00
:channel="channel"
/>
</span>
</template>
</div>
</template>
2022-06-03 05:02:24 +02:00
<style scoped css>
.batch-type-chathistory {
opacity: 0.6;
}
</style>
2022-05-23 09:44:01 +02:00
<script lang="ts">
import {computed, defineComponent, PropType} from "vue";
import dayjs from "dayjs";
2022-05-03 08:50:59 +02:00
import constants from "../js/constants";
2020-01-08 10:11:44 +01:00
import localetime from "../js/helpers/localetime";
import Username from "./Username.vue";
2018-07-10 13:57:11 +02:00
import LinkPreview from "./LinkPreview.vue";
import ParsedMessage from "./ParsedMessage.vue";
2018-07-09 12:44:12 +02:00
import MessageTypes from "./MessageTypes";
2022-05-23 09:44:01 +02:00
import type {ClientChan, ClientMessage, ClientNetwork} from "../js/types";
import {useStore} from "../js/store";
MessageTypes.ParsedMessage = ParsedMessage;
2018-07-10 13:57:11 +02:00
MessageTypes.LinkPreview = LinkPreview;
2018-07-09 12:44:12 +02:00
MessageTypes.Username = Username;
2022-05-23 09:44:01 +02:00
export default defineComponent({
name: "Message",
2018-07-09 12:44:12 +02:00
components: MessageTypes,
props: {
2022-05-23 09:44:01 +02:00
message: {type: Object as PropType<ClientMessage>, required: true},
channel: {type: Object as PropType<ClientChan>, required: false},
network: {type: Object as PropType<ClientNetwork>, required: true},
keepScrollPosition: Function as PropType<() => void>,
isPreviousSource: Boolean,
focused: Boolean,
},
2022-05-23 09:44:01 +02:00
setup(props) {
const store = useStore();
const timeFormat = computed(() => {
let format: keyof typeof constants.timeFormats;
2020-02-29 10:37:45 +01:00
2022-05-23 09:44:01 +02:00
if (store.state.settings.use12hClock) {
format = store.state.settings.showSeconds ? "msg12hWithSeconds" : "msg12h";
2020-02-29 10:37:45 +01:00
} else {
2022-05-23 09:44:01 +02:00
format = store.state.settings.showSeconds ? "msgWithSeconds" : "msgDefault";
2020-02-29 10:37:45 +01:00
}
2020-02-29 10:37:45 +01:00
return constants.timeFormats[format];
2022-05-23 09:44:01 +02:00
});
const messageTime = computed(() => {
return dayjs(props.message.time).format(timeFormat.value);
});
const messageTimeLocale = computed(() => {
return localetime(props.message.time);
});
const messageComponent = computed(() => {
return "message-" + props.message.type;
});
2022-06-03 05:02:24 +02:00
const batchType = computed(() => {
if (props.message.batch) {
return `batch-type-${props.message.batch?.type}`;
}
return undefined;
});
2022-05-23 09:44:01 +02:00
const isAction = () => {
return typeof MessageTypes["message-" + props.message.type] !== "undefined";
};
return {
timeFormat,
messageTime,
messageTimeLocale,
messageComponent,
isAction,
2022-06-03 05:02:24 +02:00
batchType,
2022-05-23 09:44:01 +02:00
};
2018-07-09 12:44:12 +02:00
},
2022-05-23 09:44:01 +02:00
});
</script>