misskey/src/client/app/common/views/components/emoji.vue

86 lines
1.7 KiB
Vue
Raw Normal View History

2018-11-04 18:19:40 -08:00
<template>
<img v-if="customEmoji" class="fvgwvorwhxigeolkkrcderjzcawqrscl custom" :src="url" :alt="alt" :title="alt"/>
<img v-else-if="char && !useOsDefaultEmojis" class="fvgwvorwhxigeolkkrcderjzcawqrscl" :src="url" :alt="alt" :title="alt"/>
<span v-else-if="char && useOsDefaultEmojis">{{ char }}</span>
<span v-else>:{{ name }}:</span>
2018-11-04 18:19:40 -08:00
</template>
<script lang="ts">
import Vue from 'vue';
import { lib } from 'emojilib';
2018-11-04 18:19:40 -08:00
export default Vue.extend({
props: {
name: {
type: String,
required: false
},
emoji: {
type: String,
required: false
},
customEmojis: {
required: false,
default: []
}
},
2018-11-04 18:19:40 -08:00
data() {
return {
url: null,
char: null,
customEmoji: null
2018-11-04 18:19:40 -08:00
}
},
computed: {
alt(): string {
2018-11-05 02:33:28 -08:00
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
},
useOsDefaultEmojis(): boolean {
return this.$store.state.device.useOsDefaultEmojis;
}
2018-11-04 18:19:40 -08:00
},
created() {
if (this.name) {
const customEmoji = this.customEmojis.find(x => x.name == this.name);
if (customEmoji) {
this.customEmoji = customEmoji;
this.url = customEmoji.url;
} else {
const emoji = lib[this.name];
if (emoji) {
this.char = emoji.char;
2018-11-04 18:19:40 -08:00
}
}
} else {
this.char = this.emoji;
}
if (this.char) {
let codes = [...this.char].map(x => x.codePointAt(0).toString(16));
if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
this.url = `https://twemoji.maxcdn.com/2/svg/${codes.join('-')}.svg`;
2018-11-04 18:19:40 -08:00
}
}
});
</script>
<style lang="stylus" scoped>
.fvgwvorwhxigeolkkrcderjzcawqrscl
2018-11-05 08:48:33 -08:00
height 1.25em
vertical-align -0.25em
&.custom
height 2.5em
vertical-align middle
transition transform 0.2s ease
&:hover
transform scale(1.2)
2018-11-04 18:19:40 -08:00
</style>