"use client"; import React, { useState, useRef, useEffect } from "react"; import { motion } from "framer-motion"; import { Copy, Check, Send, Loader2 } from "lucide-react"; import contactData from "@/data/contact.json"; export default function ContactMe() { const [copied, setCopied] = useState(false); const [isMounted, setIsMounted] = useState(false); const [positionedTags, setPositionedTags] = useState([]); const [status, setStatus] = useState<"idle" | "sending" | "success" | "error">("idle"); const constraintsRef = useRef(null); // 1. Vyriešenie hydratácie a náhodného spawnu tagov z JSONu useEffect(() => { const randomized = contactData.tags.map((tag) => ({ ...tag, initialX: Math.random() * 240 - 120, // Jemne zväčšený rozptyl initialY: Math.random() * 240 - 120, initialRotate: Math.random() * 40 - 20, })); setPositionedTags(randomized); setIsMounted(true); }, []); const copyToClipboard = () => { navigator.clipboard.writeText(contactData.config.to_email); setCopied(true); setTimeout(() => setCopied(false), 2000); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setStatus("sending"); const formData = new FormData(e.currentTarget); const payload = { firstName: formData.get("firstName"), lastName: formData.get("lastName"), email: formData.get("email"), subject: formData.get("subject"), body: formData.get("body"), }; try { const res = await fetch("/api/send", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }); if (res.ok) { setStatus("success"); (e.target as HTMLFormElement).reset(); setTimeout(() => setStatus("idle"), 5000); } else { setStatus("error"); setTimeout(() => setStatus("idle"), 5000); } } catch (err) { setStatus("error"); setTimeout(() => setStatus("idle"), 5000); } }; // Prevencia Hydration Mismatch if (!isMounted) return
; return (
{/* L'AVÁ STRANA: Interaktívne Tagy */}
{/* Dekoratívny text na pozadí */}

Visual Studio
Code

{positionedTags.map((tag, i) => ( {tag.name} ))}

Drag them anywhere

{/* PRAVÁ STRANA: Formulár */}

Get in touch

Have a project in mind? Let's build it.