mirror of
https://github.com/danbulant/Nertivia-Client
synced 2026-06-16 21:11:16 +00:00
92 lines
2.1 KiB
Vue
92 lines
2.1 KiB
Vue
<template>
|
|
<transition name="typing-animate">
|
|
<div v-if="formatedRecipients" class="typing-status">
|
|
<object class="animation" type="image/svg+xml" :data="animation" />
|
|
<div class="text" v-html="formatedRecipients" />
|
|
</div>
|
|
</transition>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: ["recipients"],
|
|
data() {
|
|
return {
|
|
animation: require("@/assets/typing-indicator.svg")
|
|
};
|
|
},
|
|
computed: {
|
|
formatedRecipients() {
|
|
const arr = Object.values(this.recipients);
|
|
if (!arr.length) return null;
|
|
switch (true) {
|
|
case arr.length == 1:
|
|
return `<strong>${this.escapeHtml(
|
|
arr[0].username
|
|
)}</strong> is typing...`;
|
|
case arr.length == 2:
|
|
return `<strong>${this.escapeHtml(
|
|
arr[0].username
|
|
)}</strong> and <strong>${this.escapeHtml(
|
|
arr[1].username
|
|
)}</strong> are typing...`;
|
|
case arr.length == 3:
|
|
return `<strong>${this.escapeHtml(
|
|
arr[0].username
|
|
)}</strong>, <strong>${this.escapeHtml(
|
|
arr[1].username
|
|
)}</strong> and <strong>${this.escapeHtml(
|
|
arr[2].username
|
|
)}</strong> are typing...`;
|
|
case arr.length > 3:
|
|
return `<strong>${arr.length}</strong> people are typing...`;
|
|
default:
|
|
break;
|
|
}
|
|
return arr;
|
|
}
|
|
},
|
|
methods: {
|
|
escapeHtml(unsafe) {
|
|
return unsafe
|
|
.replace(/&/g, "&")
|
|
.replace(/</g, "<")
|
|
.replace(/>/g, ">")
|
|
.replace(/"/g, """)
|
|
.replace(/'/g, "'");
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
.typing-animate-enter-active {
|
|
transition: 0.1s;
|
|
}
|
|
.typing-animate-enter /* .fade-leave-active below version 2.1.8 */ {
|
|
opacity: 0;
|
|
transform: translateY(3px);
|
|
}
|
|
.typing-animate-leave-to {
|
|
opacity: 0;
|
|
transform: translateY(-3px);
|
|
}
|
|
|
|
.typing-status {
|
|
color: white;
|
|
display: flex;
|
|
transition: 0.3s;
|
|
flex-shrink: 0;
|
|
flex: 1;
|
|
}
|
|
.animation {
|
|
height: 20px;
|
|
width: 20px;
|
|
display: flex;
|
|
}
|
|
.text {
|
|
margin: auto;
|
|
margin-left: 5px;
|
|
font-size: 13px;
|
|
}
|
|
</style>
|