feat: Implement QR code download functionality in profile page

This commit is contained in:
2025-04-23 23:27:20 -04:00
parent 17f30e47d1
commit dc1ea64d02

View File

@@ -112,6 +112,72 @@ function handleDelete() {
creatorProfileStore.removeCreatorPage(); creatorProfileStore.removeCreatorPage();
deleteDialogShown.value = false; deleteDialogShown.value = false;
} }
function downloadQRCode() {
try {
// Get the SVG element
const svgElement = document.querySelector('.qr-code svg') ||
document.querySelector('.qr-container svg') ||
document.querySelector('svg[class*="qr"]');
if (!svgElement) {
console.error('QR code SVG element not found');
return;
}
// Create a Blob from the SVG
const svgData = new XMLSerializer().serializeToString(svgElement);
const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });
const svgUrl = URL.createObjectURL(svgBlob);
// Create an image element
const img = new Image();
img.onload = () => {
// Set padding
const padding = 20; // 20 pixels padding on each side
// Create canvas with padding
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// Set canvas size to include padding
canvas.width = img.width + (padding * 2);
canvas.height = img.height + (padding * 2);
// Fill white background for entire canvas (including padding)
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Draw the image with padding offset
ctx.drawImage(img, padding, padding);
// Convert to PNG
const pngUrl = canvas.toDataURL('image/png');
// Create download link
const downloadLink = document.createElement('a');
downloadLink.href = pngUrl;
downloadLink.download = `hutopy-qr-${creatorProfileStore.creator.slug}.png`;
// Trigger download
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
// Cleanup
URL.revokeObjectURL(svgUrl);
};
img.onerror = (error) => {
console.error('Error loading SVG:', error);
};
// Load the SVG into the image
img.src = svgUrl;
} catch (error) {
console.error('Error in downloadQRCode:', error);
}
}
</script> </script>
<template> <template>
@@ -286,6 +352,14 @@ function handleDelete() {
render-as="svg" render-as="svg"
class="qr-code" class="qr-code"
/> />
<button
v-if="creatorProfileStore.creator"
class="download-button"
@click="downloadQRCode"
>
<v-icon>mdi-download</v-icon>
{{ t('downloadQRCode') }}
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -434,6 +508,13 @@ function handleDelete() {
.qr-text { .qr-text {
@apply text-hOnBackground text-center; @apply text-hOnBackground text-center;
} }
.download-button {
@apply flex items-center gap-2 px-4 py-2 rounded-lg;
@apply bg-hutopyPrimary text-hOnPrimary;
@apply hover:bg-hutopySecondary;
@apply transition-colors duration-300;
}
</style> </style>
<i18n> <i18n>
@@ -455,7 +536,8 @@ function handleDelete() {
"socialNetworks": "Social Networks", "socialNetworks": "Social Networks",
"handle": "Creator Handle", "handle": "Creator Handle",
"qrCode": "QR Code", "qrCode": "QR Code",
"qrCodeDescription": "Print this QR code to share your Hutopy with the world! Perfect for business cards, social media, and promotional materials." "qrCodeDescription": "Print this QR code to share your Hutopy with the world! Perfect for business cards, social media, and promotional materials.",
"downloadQRCode": "Download QR Code"
}, },
"fr": { "fr": {
"personalInfo": "Informations Personnelles", "personalInfo": "Informations Personnelles",
@@ -474,7 +556,8 @@ function handleDelete() {
"socialNetworks": "Réseaux Sociaux", "socialNetworks": "Réseaux Sociaux",
"handle": "Identifiant du créateur", "handle": "Identifiant du créateur",
"qrCode": "Code QR", "qrCode": "Code QR",
"qrCodeDescription": "Imprimez ce code QR pour partager votre Hutopy avec le monde ! Parfait pour les cartes de visite, les réseaux sociaux et les supports promotionnels." "qrCodeDescription": "Imprimez ce code QR pour partager votre Hutopy avec le monde ! Parfait pour les cartes de visite, les réseaux sociaux et les supports promotionnels.",
"downloadQRCode": "Télécharger le Code QR"
}, },
"es": { "es": {
"personalInfo": "Información Personal", "personalInfo": "Información Personal",
@@ -493,7 +576,8 @@ function handleDelete() {
"socialNetworks": "Redes Sociales", "socialNetworks": "Redes Sociales",
"handle": "Identificador del creador", "handle": "Identificador del creador",
"qrCode": "Código QR", "qrCode": "Código QR",
"qrCodeDescription": "¡Imprime este código QR para compartir tu Hutopy con el mundo! Perfecto para tarjetas de presentación, redes sociales y materiales promocionales." "qrCodeDescription": "¡Imprime este código QR para compartir tu Hutopy con el mundo! Perfecto para tarjetas de presentación, redes sociales y materiales promocionales.",
"downloadQRCode": "Descargar Código QR"
} }
} }
</i18n> </i18n>