perf: handle VnLinkMail and VnEmail

This commit is contained in:
Javier Segarra 2025-04-01 14:51:49 +02:00
parent 588876952a
commit 02a78c662b
2 changed files with 46 additions and 27 deletions

View File

@ -1,8 +1,11 @@
<script setup> <script setup>
import { dashIfEmpty } from 'src/filters';
defineProps({ email: { type: [String], default: null } }); defineProps({ email: { type: [String], default: null } });
</script> </script>
<template> <template>
<QBtn <QBtn
class="q-pr-xs"
v-if="email" v-if="email"
flat flat
round round
@ -13,4 +16,5 @@ defineProps({ email: { type: [String], default: null } });
:href="`mailto:${email}`" :href="`mailto:${email}`"
@click.stop @click.stop
/> />
<span>{{ dashIfEmpty(email) }}</span>
</template> </template>

View File

@ -12,50 +12,65 @@ const props = defineProps({
const phone = ref(props.phoneNumber); const phone = ref(props.phoneNumber);
const config = reactive({ const config = reactive({
sip: { icon: 'phone', href: `sip:${props.phoneNumber}` },
'say-simple': { 'say-simple': {
icon: 'vn:saysimple', icon: 'vn:saysimple',
url: null, url: null,
channel: props.channel, channel: props.channel,
}, },
sip: { icon: 'phone', href: `sip:${props.phoneNumber}` },
}); });
const type = Object.keys(config).find((key) => key in useAttrs()) || 'sip';
const attrs = useAttrs();
const types = Object.keys(config)
.filter((key) => key in attrs)
.sort();
const activeTypes = types.length ? types : ['sip'];
onBeforeMount(async () => { onBeforeMount(async () => {
if (!phone.value) return; if (!phone.value) return;
let { channel } = config[type];
if (type === 'say-simple') { for (const type of activeTypes) {
const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne')) if (type === 'say-simple') {
.data; let { channel } = config[type];
if (!channel) channel = defaultChannel; const { url, defaultChannel } = (await axios.get('SaySimpleConfigs/findOne'))
.data;
if (!channel) channel = defaultChannel;
phone.value = await parsePhone(props.phoneNumber, props.country?.toLowerCase()); phone.value = await parsePhone(
config[type].url = props.phoneNumber,
`${url}?customerIdentity=%2B${phone.value}&channelId=${channel}`; props.country?.toLowerCase(),
);
config[type].url =
`${url}?customerIdentity=%2B${phone.value}&channelId=${channel}`;
}
} }
}); });
function handleClick() { function handleClick(type) {
if (config[type].url) useOpenURL(config[type].url); if (config[type].url) useOpenURL(config[type].url);
else if (config[type].href) window.location.href = config[type].href; else if (config[type].href) window.location.href = config[type].href;
} }
</script> </script>
<template>
<QBtn
v-if="phone"
flat
round
:icon="config[type].icon"
size="sm"
color="primary"
padding="none"
@click.stop="handleClick"
>
<QTooltip>
{{ capitalize(type).replace('-', '') }}
</QTooltip>
</QBtn>
<span>{{ dashIfEmpty(phone) }}</span> <template>
<div class="flex items-center gap-2">
<template v-for="type in activeTypes">
<QBtn
:key="type"
v-if="phone"
flat
round
:icon="config[type].icon"
size="sm"
color="primary"
padding="none"
@click.stop="() => handleClick(type)"
>
<QTooltip>
{{ capitalize(type).replace('-', '') }}
</QTooltip>
</QBtn></template
>
<span>{{ dashIfEmpty(phone) }}</span>
</div>
</template> </template>