// Public invitation view + other sub-screens const PublishedInvitation = ({ palette, onBack }) => { const [copied, setCopied] = React.useState(false); const [orderData, setOrderData] = React.useState(null); // Read published data from localStorage (set during publish flow) const publishedData = React.useMemo(() => { try { return JSON.parse(localStorage.getItem('inv23_last_published') || 'null'); } catch { return null; } }, []); const previewUrl = publishedData?.previewUrl || null; const subdomain = publishedData?.subdomain || null; const displayUrl = subdomain ? `invitacion23.com/${subdomain}` : (previewUrl ? `localhost:4000${previewUrl}` : 'invitacion23.com/mi-evento'); const shareUrl = previewUrl ? `${window.location.origin}${previewUrl}` : `https://invitacion23.com/${subdomain || 'mi-evento'}`; const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=160x160&data=${encodeURIComponent(shareUrl)}`; // Load real order data to display event details React.useEffect(() => { const orderId = localStorage.getItem('inv23_active_order'); if (!orderId || !window.clientFetch) return; window.clientFetch(window.BACKEND + '/client/orders/' + orderId) .then(r => r.json()) .then(d => { if (d.order) setOrderData(d.order); }) .catch(() => {}); }, []); // Extract real event fields from order const eventTitle = orderData?.title || publishedData?.title || null; const eventDate = orderData?.date || orderData?.brief?.date || null; const eventVenue = orderData?.ceremony?.location || orderData?.ceremony?.name || orderData?.brief?.venue || null; const eventTime = orderData?.time || orderData?.ceremony?.time || null; const copyLink = async () => { try { await navigator.clipboard.writeText(shareUrl); setCopied(true); setTimeout(() => setCopied(false), 2500); } catch { // Fallback: select text const el = document.createElement('textarea'); el.value = shareUrl; document.body.appendChild(el); el.select(); document.execCommand('copy'); document.body.removeChild(el); setCopied(true); setTimeout(() => setCopied(false), 2500); } }; const waUrl = `https://wa.me/?text=${encodeURIComponent(`¡Te invito a ${eventTitle || 'mi evento'}! Confirma tu asistencia aquí: ${shareUrl}`)}`; return (
Sin suscripciones. Sin contratos. Tu invitación, tu evento, tu ritmo.
Mariana las personaliza con tus colores, textos y fotos.
Sin suscripciones. Sin contratos.