/* global React */ /* ============================================================= VzdelAI — SEKCIA: Kontakt (formulár cez Web3Forms) ------------------------------------------------------------- Funkčný formulár: meno · e-mail · organizácia · správa. Validácia client-side (HTML5 + JS), odoslanie cez fetch na https://api.web3forms.com/submit. Honeypot proti botom. Kde nahradiť access key: konštanta WEB3FORMS_ACCESS_KEY nižšie. Kde upraviť texty hlášok: konštanta MESSAGES nižšie. ============================================================= */ /* ⬇⬇⬇ NAHRADIŤ PRED DEPLOYOM ⬇⬇⬇ */ const WEB3FORMS_ACCESS_KEY = 'effeb045-0777-4e06-afba-a19e8f90ed86'; /* ⬆⬆⬆ NAHRADIŤ PRED DEPLOYOM ⬆⬆⬆ */ const MESSAGES = { success: 'Ďakujeme za Vašu správu. Čo najskôr sa Vám ozveme.', error: 'Správu sa nepodarilo odoslať. Skúste to prosím neskôr, alebo nás kontaktujte priamo na vzdelai@uniza.sk.', required: 'Toto pole je povinné.', invalidEmail: 'Zadajte platnú e-mailovú adresu.', shortMessage: 'Správa musí mať aspoň 10 znakov.' }; function V2_Contact() { const [form, setForm] = React.useState({ name: '', email: '', organization: '', message: '' }); const [errors, setErrors] = React.useState({}); const [status, setStatus] = React.useState('idle'); // 'idle' | 'sending' | 'success' | 'error' const feedbackRef = React.useRef(null); React.useEffect(() => { if ((status === 'success' || status === 'error') && feedbackRef.current) { feedbackRef.current.focus(); } }, [status]); const fieldStyle = { width: '100%', padding: '14px 16px', border: '1px solid var(--border)', borderRadius: 8, background: '#fff', fontFamily: 'var(--font-body)', fontSize: 15, color: 'var(--vz-ink)', boxSizing: 'border-box' }; const labelStyle = { display: 'block', fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.22em', textTransform: 'uppercase', color: 'var(--vz-ink-60)', marginBottom: 8, fontWeight: 500 }; const validate = (data) => { const e = {}; if (!data.name.trim() || data.name.trim().length < 2) e.name = MESSAGES.required; if (!data.email.trim()) e.email = MESSAGES.required; else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email.trim())) e.email = MESSAGES.invalidEmail; if (!data.organization.trim()) e.organization = MESSAGES.required; if (!data.message.trim()) e.message = MESSAGES.required; else if (data.message.trim().length < 10) e.message = MESSAGES.shortMessage; return e; }; const handleChange = (field) => (ev) => { const value = ev.target.value; setForm((prev) => ({ ...prev, [field]: value })); if (errors[field]) { setErrors((prev) => { const next = { ...prev }; delete next[field]; return next; }); } }; const inputClass = (field) => `vz-input${errors[field] ? ' has-error' : ''}`; const errId = (field) => `vz-${field}-error`; const ariaProps = (field) => ({ 'aria-required': true, 'aria-invalid': errors[field] ? true : undefined, 'aria-describedby': errors[field] ? errId(field) : undefined }); const handleSubmit = async (ev) => { ev.preventDefault(); if (status === 'sending') return; const validationErrors = validate(form); if (Object.keys(validationErrors).length > 0) { setErrors(validationErrors); setStatus('idle'); return; } // Honeypot — ak je vyplnený, ticho zlyháme bez odoslania (anti-bot) const honeypot = ev.target.elements.botcheck; if (honeypot && honeypot.value) return; setStatus('sending'); setErrors({}); try { const formData = new FormData(ev.target); // Reply-To header → kliknutie na "Odpovedať" pôjde priamo odosielateľovi formulára formData.set('replyto', form.email); const res = await fetch('https://api.web3forms.com/submit', { method: 'POST', body: formData }); const data = await res.json().catch(() => ({})); if (res.ok && data && data.success) { setStatus('success'); setForm({ name: '', email: '', organization: '', message: '' }); } else { setStatus('error'); } } catch (err) { setStatus('error'); } }; return (
Kontakt

Máte záujem o spoluprácu?

Hľadáme univerzity, fakulty a partnerov z praxe, ktorí chcú integrovať VzdelAI do výučby, rozvíjať odbornú spoluprácu alebo sa zapojiť do ďalšieho výskumu.

E-mail
vzdelai@uniza.sk
Adresa
Žilinská univerzita v Žiline · FPEDAS
Univerzitná 8215/1 · 010 26 Žilina
{/* Web3Forms — povinné a voliteľné polia (skryté) */} {/* Honeypot — skutoční ľudia ho nevidia, boti ho vyplnia */}
{errors.name && ( {errors.name} )}
{errors.email && ( {errors.email} )}
{errors.organization && ( {errors.organization} )}