diff --git a/src/utils/encodeQR.ts b/src/utils/encodeQR.ts new file mode 100644 index 0000000..be67f53 --- /dev/null +++ b/src/utils/encodeQR.ts @@ -0,0 +1,71 @@ +import type { QRState } from '../types'; + +export function encodeQR(state: QRState): string | null { + const { selectedType, formData } = state; + + switch (selectedType) { + case 'url': { + const { websiteUrl } = formData.url; + return websiteUrl.trim() || null; + } + case 'text': { + const { text } = formData.text; + return text.trim() || null; + } + case 'wifi': { + const { networkName, encryption, password } = formData.wifi; + if (!networkName.trim()) return null; + const pass = encryption === 'None' ? '' : password; + return `WIFI:T:${encryption};S:${networkName};P:${pass};;`; + } + case 'email': { + const { emailAddress, subject, message } = formData.email; + if (!emailAddress.trim()) return null; + const params = new URLSearchParams(); + if (subject.trim()) params.set('subject', subject); + if (message.trim()) params.set('body', message); + const qs = params.toString(); + return `mailto:${emailAddress}${qs ? '?' + qs : ''}`; + } + case 'sms': { + const { phoneNumber, message } = formData.sms; + if (!phoneNumber.trim()) return null; + return `smsto:${phoneNumber}${message.trim() ? ':' + message : ''}`; + } + case 'image': { + const { imageUrl } = formData.image; + return imageUrl.trim() || null; + } + case 'pdf': { + const { pdfUrl } = formData.pdf; + return pdfUrl.trim() || null; + } + case 'mp3': { + const { mp3Url } = formData.mp3; + return mp3Url.trim() || null; + } + case 'app': { + const { appStoreLink } = formData.app; + return appStoreLink.trim() || null; + } + case 'vcard': { + const { firstName, lastName, phone, email, company, jobTitle, website, address } = formData.vcard; + if (!firstName.trim() && !lastName.trim()) return null; + const lines = [ + 'BEGIN:VCARD', 'VERSION:3.0', + `N:${lastName};${firstName};;;`, + `FN:${firstName} ${lastName}`.trim(), + company ? `ORG:${company}` : '', + jobTitle ? `TITLE:${jobTitle}` : '', + phone ? `TEL;TYPE=CELL:${phone}` : '', + email ? `EMAIL:${email}` : '', + website ? `URL:${website}` : '', + address ? `ADR:;;${address};;;;` : '', + 'END:VCARD', + ].filter(Boolean); + return lines.join('\n'); + } + default: + return null; + } +}