thelounge/client/components/MessageCondensed.vue

117 lines
2.4 KiB
Vue
Raw Normal View History

2018-07-09 14:14:44 +02:00
<template>
2019-12-15 12:46:43 +01:00
<div :class="['msg', {closed: isCollapsed}]" data-type="condensed">
2018-07-13 09:43:31 +02:00
<div class="condensed-summary">
2018-07-29 19:57:14 +02:00
<span class="time" />
<span class="from" />
2019-07-17 11:33:59 +02:00
<span class="content" @click="onCollapseClick"
>{{ condensedText
}}<button class="toggle-button" aria-label="Toggle status messages"
/></span>
2018-07-09 14:14:44 +02:00
</div>
<Message
v-for="message in messages"
2018-07-29 19:57:14 +02:00
:key="message.id"
2018-07-19 19:44:24 +02:00
:network="network"
:message="message"
/>
2018-07-09 14:14:44 +02:00
</div>
</template>
<script>
2019-12-17 23:10:50 +01:00
const constants = require("../js/constants");
2018-07-09 14:14:44 +02:00
import Message from "./Message.vue";
export default {
name: "MessageCondensed",
components: {
Message,
2018-07-09 14:14:44 +02:00
},
props: {
2018-07-19 19:44:24 +02:00
network: Object,
2018-07-09 14:14:44 +02:00
messages: Array,
keepScrollPosition: Function,
2018-07-09 14:14:44 +02:00
},
data() {
return {
isCollapsed: true,
};
},
2018-07-09 14:14:44 +02:00
computed: {
condensedText() {
const obj = {};
constants.condensedTypes.forEach((type) => {
obj[type] = 0;
});
for (const message of this.messages) {
obj[message.type]++;
}
// Count quits as parts in condensed messages to reduce information density
obj.part += obj.quit;
const strings = [];
constants.condensedTypes.forEach((type) => {
if (obj[type]) {
switch (type) {
2019-07-17 11:33:59 +02:00
case "chghost":
strings.push(
obj[type] +
(obj[type] > 1
? " users have changed hostname"
: " user has changed hostname")
);
break;
case "join":
strings.push(
obj[type] +
(obj[type] > 1 ? " users have joined" : " user has joined")
);
break;
case "part":
strings.push(
obj[type] + (obj[type] > 1 ? " users have left" : " user has left")
);
break;
case "nick":
strings.push(
obj[type] +
(obj[type] > 1
? " users have changed nick"
: " user has changed nick")
);
break;
case "kick":
strings.push(
obj[type] +
(obj[type] > 1 ? " users were kicked" : " user was kicked")
);
break;
case "mode":
strings.push(
obj[type] + (obj[type] > 1 ? " modes were set" : " mode was set")
);
break;
2018-07-09 14:14:44 +02:00
}
}
});
let text = strings.pop();
if (strings.length) {
text = strings.join(", ") + ", and " + text;
}
return text;
},
},
methods: {
onCollapseClick() {
this.isCollapsed = !this.isCollapsed;
this.keepScrollPosition();
},
},
2018-07-09 14:14:44 +02:00
};
</script>