'use client'; import React, { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { QRCodeSVG } from 'qrcode.react'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/Card'; import { Input } from '@/components/ui/Input'; import { Select } from '@/components/ui/Select'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { calculateContrast } from '@/lib/utils'; import { useTranslation } from '@/hooks/useTranslation'; import { showToast } from '@/components/ui/Toast'; export default function CreatePage() { const router = useRouter(); const { t } = useTranslation(); const [loading, setLoading] = useState(false); // Form state const [title, setTitle] = useState(''); const [contentType, setContentType] = useState('URL'); const [content, setContent] = useState({ url: '' }); const [isDynamic, setIsDynamic] = useState(true); const [tags, setTags] = useState(''); // Style state const [foregroundColor, setForegroundColor] = useState('#000000'); const [backgroundColor, setBackgroundColor] = useState('#FFFFFF'); const [cornerStyle, setCornerStyle] = useState('square'); const [size, setSize] = useState(200); // QR preview const [qrDataUrl, setQrDataUrl] = useState(''); const contrast = calculateContrast(foregroundColor, backgroundColor); const hasGoodContrast = contrast >= 4.5; const contentTypes = [ { value: 'URL', label: 'URL / Website' }, { value: 'WIFI', label: 'WiFi Network' }, { value: 'VCARD', label: 'Contact Card' }, { value: 'PHONE', label: 'Phone Number' }, { value: 'EMAIL', label: 'Email' }, { value: 'SMS', label: 'SMS' }, { value: 'TEXT', label: 'Plain Text' }, { value: 'WHATSAPP', label: 'WhatsApp' }, ]; // Get QR content based on content type const getQRContent = () => { switch (contentType) { case 'URL': return content.url || 'https://example.com'; case 'PHONE': return `tel:${content.phone || '+1234567890'}`; case 'EMAIL': return `mailto:${content.email || 'email@example.com'}${content.subject ? `?subject=${encodeURIComponent(content.subject)}` : ''}`; case 'SMS': return `sms:${content.phone || '+1234567890'}${content.message ? `?body=${encodeURIComponent(content.message)}` : ''}`; case 'WIFI': return `WIFI:T:${content.security || 'WPA'};S:${content.ssid || 'NetworkName'};P:${content.password || ''};H:false;;`; case 'TEXT': return content.text || 'Sample text'; case 'WHATSAPP': return `https://wa.me/${content.phone || '+1234567890'}${content.message ? `?text=${encodeURIComponent(content.message)}` : ''}`; default: return 'https://example.com'; } }; const qrContent = getQRContent(); const downloadQR = async (format: 'svg' | 'png') => { try { // Get the content based on content type let qrContent = ''; switch (contentType) { case 'URL': qrContent = content.url || ''; break; case 'PHONE': qrContent = `tel:${content.phone || ''}`; break; case 'EMAIL': qrContent = `mailto:${content.email || ''}${content.subject ? `?subject=${encodeURIComponent(content.subject)}` : ''}`; break; case 'TEXT': qrContent = content.text || ''; break; default: qrContent = content.url || ''; } if (!qrContent) return; const QRCode = (await import('qrcode')).default; if (format === 'svg') { const svg = await QRCode.toString(qrContent, { type: 'svg', width: size, margin: 2, color: { dark: foregroundColor, light: backgroundColor, }, }); const blob = new Blob([svg], { type: 'image/svg+xml' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `qrcode-${title || 'download'}.svg`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } else { const a = document.createElement('a'); a.href = qrDataUrl; a.download = `qrcode-${title || 'download'}.png`; document.body.appendChild(a); a.click(); document.body.removeChild(a); } } catch (err) { console.error('Error downloading QR code:', err); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); try { const qrData = { title, contentType, content, isStatic: !isDynamic, // Add this flag tags: tags.split(',').map(t => t.trim()).filter(Boolean), style: { foregroundColor, backgroundColor, cornerStyle, size, }, }; console.log('SENDING QR DATA:', qrData); const response = await fetch('/api/qrs', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(qrData), }); const responseData = await response.json(); console.log('RESPONSE DATA:', responseData); if (response.ok) { showToast(`QR Code "${title}" created successfully!`, 'success'); // Wait a moment so user sees the toast, then redirect setTimeout(() => { router.push('/dashboard'); router.refresh(); }, 1000); } else { console.error('Error creating QR code:', responseData); showToast(responseData.error || 'Error creating QR code', 'error'); } } catch (error) { console.error('Error creating QR code:', error); showToast('Error creating QR code. Please try again.', 'error'); } finally { setLoading(false); } }; const renderContentFields = () => { switch (contentType) { case 'URL': return ( setContent({ url: e.target.value })} placeholder="https://example.com" required /> ); case 'PHONE': return ( setContent({ phone: e.target.value })} placeholder="+1234567890" required /> ); case 'EMAIL': return ( <> setContent({ ...content, email: e.target.value })} placeholder="contact@example.com" required /> setContent({ ...content, subject: e.target.value })} placeholder="Email subject" /> ); case 'WIFI': return ( <> setContent({ ...content, ssid: e.target.value })} required /> setContent({ ...content, password: e.target.value })} />