chore: refactor thumbnail (#5682)

This commit is contained in:
David Kubeš
2022-10-27 21:32:23 +02:00
committed by GitHub
parent 12cd15b6ad
commit 89d7e4ead6
2 changed files with 32 additions and 122 deletions

View File

@@ -1,10 +1,6 @@
<template> <template>
<div <div class="avatar-container" :style="style" aria-hidden="true">
class="avatar-container" {{ userInitial }}
:style="[style, customStyle]"
aria-hidden="true"
>
<span>{{ userInitial }}</span>
</div> </div>
</template> </template>
@@ -16,69 +12,26 @@ export default {
type: String, type: String,
default: '', default: '',
}, },
backgroundColor: {
type: String,
default: '#c2e1ff',
},
color: {
type: String,
default: '#1976cc',
},
customStyle: {
type: Object,
default: undefined,
},
size: { size: {
type: Number, type: Number,
default: 40, default: 40,
}, },
src: {
type: String,
default: '',
},
rounded: {
type: Boolean,
default: true,
},
variant: {
type: String,
default: 'circle',
},
}, },
computed: { computed: {
style() { style() {
let style = { return {
width: `${this.size}px`,
height: `${this.size}px`,
borderRadius:
this.variant === 'square' ? 'var(--border-radius-large)' : '50%',
lineHeight: `${this.size + Math.floor(this.size / 20)}px`,
fontSize: `${Math.floor(this.size / 2.5)}px`, fontSize: `${Math.floor(this.size / 2.5)}px`,
}; };
if (this.backgroundColor) {
style = { ...style, backgroundColor: this.backgroundColor };
}
if (this.color) {
style = { ...style, color: this.color };
}
return style;
}, },
userInitial() { userInitial() {
return this.initials || this.initial(this.username); const parts = this.username.split(/[ -]/);
}, let initials = parts.reduce((acc, curr) => acc + curr.charAt(0), '');
},
methods: {
initial(username) {
const parts = username ? username.split(/[ -]/) : [];
let initials = '';
for (let i = 0; i < parts.length; i += 1) {
initials += parts[i].charAt(0);
}
if (initials.length > 2 && initials.search(/[A-Z]/) !== -1) { if (initials.length > 2 && initials.search(/[A-Z]/) !== -1) {
initials = initials.replace(/[a-z]+/g, ''); initials = initials.replace(/[a-z]+/g, '');
} }
initials = initials.substring(0, 2).toUpperCase(); initials = initials.substring(0, 2).toUpperCase();
return initials; return initials;
}, },
}, },
@@ -88,6 +41,7 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.avatar-container { .avatar-container {
display: flex; display: flex;
line-height: 100%;
font-weight: 500; font-weight: 500;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View File

@@ -1,74 +1,23 @@
<template> <template>
<div class="user-thumbnail-box" :style="{ height: size, width: size }"> <div class="user-thumbnail-box" :style="{ height: size, width: size }">
<img <img
v-if="!imgError && Boolean(src)" v-if="!imgError && src"
id="image"
:src="src" :src="src"
:class="thumbnailClass" :class="thumbnailClass"
@error="onImgError()" @error="onImgError"
/> />
<Avatar <Avatar
v-else v-else
:username="userNameWithoutEmoji" :username="userNameWithoutEmoji"
:class="thumbnailClass" :class="thumbnailClass"
:size="avatarSize" :size="avatarSize"
:variant="variant"
/> />
<img <img
v-if="badge === 'instagram_direct_message'" v-if="badgeSrc"
id="badge"
class="source-badge" class="source-badge"
:style="badgeStyle" :style="badgeStyle"
src="/integrations/channels/badges/instagram-dm.png" :src="`/integrations/channels/badges/${badgeSrc}.png`"
/> alt="Badge"
<img
v-else-if="badge === 'facebook'"
id="badge"
class="source-badge"
:style="badgeStyle"
src="/integrations/channels/badges/messenger.png"
/>
<img
v-else-if="badge === 'twitter-tweet'"
id="badge"
class="source-badge"
:style="badgeStyle"
src="/integrations/channels/badges/twitter-tweet.png"
/>
<img
v-else-if="badge === 'twitter-dm'"
id="badge"
class="source-badge"
:style="badgeStyle"
src="/integrations/channels/badges/twitter-dm.png"
/>
<img
v-else-if="badge === 'whatsapp'"
id="badge"
class="source-badge"
:style="badgeStyle"
src="/integrations/channels/badges/whatsapp.png"
/>
<img
v-else-if="badge === 'sms'"
id="badge"
class="source-badge"
:style="badgeStyle"
src="/integrations/channels/badges/sms.png"
/>
<img
v-else-if="badge === 'Channel::Line'"
id="badge"
class="source-badge"
:style="badgeStyle"
src="/integrations/channels/badges/line.png"
/>
<img
v-else-if="badge === 'Channel::Telegram'"
id="badge"
class="source-badge"
:style="badgeStyle"
src="/integrations/channels/badges/telegram.png"
/> />
<div <div
v-if="showStatusIndicator" v-if="showStatusIndicator"
@@ -103,7 +52,7 @@ export default {
}, },
badge: { badge: {
type: String, type: String,
default: 'fb', default: '',
}, },
username: { username: {
type: String, type: String,
@@ -142,6 +91,19 @@ export default {
avatarSize() { avatarSize() {
return Number(this.size.replace(/\D+/g, '')); return Number(this.size.replace(/\D+/g, ''));
}, },
badgeSrc() {
return {
instagram_direct_message: 'instagram-dm',
facebook: 'messenger',
'twitter-tweet': 'twitter-tweet',
'twitter-dm': 'twitter-dm',
whatsapp: 'whatsapp',
sms: 'sms',
'Channel::Line': 'line',
'Channel::Telegram': 'telegram',
'Channel::WebWidget': '',
}[this.badge];
},
badgeStyle() { badgeStyle() {
const size = Math.floor(this.avatarSize / 3); const size = Math.floor(this.avatarSize / 3);
const badgeSize = `${size + 2}px`; const badgeSize = `${size + 2}px`;
@@ -160,14 +122,12 @@ export default {
}, },
}, },
watch: { watch: {
src: { src(value, oldValue) {
handler(value, oldValue) {
if (value !== oldValue && this.imgError) { if (value !== oldValue && this.imgError) {
this.imgError = false; this.imgError = false;
} }
}, },
}, },
},
methods: { methods: {
onImgError() { onImgError() {
this.imgError = true; this.imgError = true;
@@ -229,9 +189,5 @@ export default {
.user-online-status--offline { .user-online-status--offline {
background: var(--s-500); background: var(--s-500);
} }
.user-online-status--offline {
background: var(--s-500);
}
} }
</style> </style>