From 530fee985048aea28d6cee4e2445a6d19abee309 Mon Sep 17 00:00:00 2001 From: Taltos-ch Date: Sun, 16 Feb 2025 18:21:54 +0100 Subject: [PATCH] This component generates a QR code that stores contact information in vCard format, compatible with both Android and iOS contact cards. --- .../contact-info-qr-code-generator.ts | 49 ++++++ .../contact-info-qr-code-generator.vue | 160 ++++++++++++++++++ src/tools/qr-contact-info-generator/index.ts | 5 + 3 files changed, 214 insertions(+) create mode 100644 src/tools/qr-contact-info-generator/contact-info-qr-code-generator.ts create mode 100644 src/tools/qr-contact-info-generator/contact-info-qr-code-generator.vue create mode 100644 src/tools/qr-contact-info-generator/index.ts diff --git a/src/tools/qr-contact-info-generator/contact-info-qr-code-generator.ts b/src/tools/qr-contact-info-generator/contact-info-qr-code-generator.ts new file mode 100644 index 00000000..1b17d371 --- /dev/null +++ b/src/tools/qr-contact-info-generator/contact-info-qr-code-generator.ts @@ -0,0 +1,49 @@ +import QRCode from 'qrcode'; + +interface ContactInfo { + firstName: string; + lastName: string; + role: string; + phoneNumber: string; + email: string; + companyName: string; + companyWebsite: string; + companyAddress: string; +} + +const generateContactInfoQRCode = (contactInfo: ContactInfo): void => { + const vCard = ` +BEGIN:VCARD +VERSION:3.0 +N:${contactInfo.lastName};${contactInfo.firstName} +FN:${contactInfo.firstName} ${contactInfo.lastName} +ORG:${contactInfo.companyName} +TITLE:${contactInfo.role} +TEL;TYPE=WORK,VOICE:${contactInfo.phoneNumber} +EMAIL;TYPE=PREF,INTERNET:${contactInfo.email} +URL:${contactInfo.companyWebsite} +ADR;TYPE=WORK,PREF:;;${contactInfo.companyAddress} +END:VCARD + `; + + QRCode.toDataURL(vCard, { errorCorrectionLevel: 'H' }, (err: Error | null, url: string) => { + if (err) { + console.error(err); + return; + } + console.log(url); + }); +}; + +const contactInfo: ContactInfo = { + firstName: 'John', + lastName: 'Doe', + role: 'Software Engineer', + phoneNumber: '+1234567890', + email: 'john.doe@example.com', + companyName: 'Example Inc.', + companyWebsite: 'https://www.example.com', + companyAddress: '123 Example Street, City, Country' +}; + +generateContactInfoQRCode(contactInfo); \ No newline at end of file diff --git a/src/tools/qr-contact-info-generator/contact-info-qr-code-generator.vue b/src/tools/qr-contact-info-generator/contact-info-qr-code-generator.vue new file mode 100644 index 00000000..46eb10d9 --- /dev/null +++ b/src/tools/qr-contact-info-generator/contact-info-qr-code-generator.vue @@ -0,0 +1,160 @@ + + + + + \ No newline at end of file diff --git a/src/tools/qr-contact-info-generator/index.ts b/src/tools/qr-contact-info-generator/index.ts new file mode 100644 index 00000000..fd467b19 --- /dev/null +++ b/src/tools/qr-contact-info-generator/index.ts @@ -0,0 +1,5 @@ +import ContactInfoQRCodeGenerator from './contact-info-qr-code-generator.vue'; + +export { + ContactInfoQRCodeGenerator, +}; \ No newline at end of file