import React, { useState, useMemo } from 'react'; import { Sparkles, RefreshCw, Zap } from 'lucide-react'; // Datos de los participantes const PARTICIPANTS_DATA = [ { id: 1, name: 'Sofi', avatar: '👩🏻' }, { id: 2, name: 'Ricky', avatar: '🧔🏻♂️' }, { id: 3, name: 'Vicky', avatar: '👩🏼' }, { id: 4, name: 'Juli', avatar: '👩🏽' }, { id: 5, name: 'Gaby', avatar: '👱🏻♀️' }, { id: 6, name: 'Hector', avatar: '👴🏻' }, { id: 7, name: 'Beltran', avatar: '🧒🏻' }, { id: 8, name: 'Male', avatar: '👱🏻♀️' }, { id: 9, name: 'Pancho', avatar: '🧑🏻' }, ]; // Paleta de colores tipo "Luces de Navidad" const NEON_COLORS = [ '#FF355E', // Radical Red '#50BFE6', // Blizzard Blue '#CCFF00', // Electric Lime '#FF00CC', // Hot Magenta '#FFCC00', // Tangerine Yellow '#BC13FE', // Neon Purple '#00FF99', // Spring Green '#FFFF33', // Neon Yellow '#FF6EFF', // Shocking Pink ]; const App = () => { const [assignments, setAssignments] = useState([]); const [isGenerating, setIsGenerating] = useState(false); const [showSnow, setShowSnow] = useState(true); // Posiciones fijas en círculo para el mapa visual const radius = 38; // Porcentaje del contenedor const positions = useMemo(() => { return PARTICIPANTS_DATA.map((_, index) => { const angle = (index * 2 * Math.PI) / PARTICIPANTS_DATA.length - Math.PI / 2; return { x: 50 + radius * Math.cos(angle), // % left y: 50 + radius * Math.sin(angle), // % top angle: angle }; }); }, []); // Algoritmo Fisher-Yates para mezcla imparcial const shuffleArray = (array) => { const newArray = [...array]; for (let i = newArray.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [newArray[i], newArray[j]] = [newArray[j], newArray[i]]; } return newArray; }; // Función para generar la distribución (Ciclo Hamiltoniano) const generateGifts = () => { setIsGenerating(true); setAssignments([]); // Limpiar visualmente para efecto de "reset" setTimeout(() => { // 1. Mezclamos aleatoriamente a los participantes const shuffled = shuffleArray(PARTICIPANTS_DATA); // 2. Creamos el ciclo: A regala a B, B a C, ..., Z a A const newAssignments = shuffled.map((giver, index) => { const receiver = shuffled[(index + 1) % shuffled.length]; return { giver, receiver, // Asignamos un color único de la paleta color: NEON_COLORS[index % NEON_COLORS.length], // Encontramos los índices visuales originales para trazar las flechas giverPosIndex: PARTICIPANTS_DATA.findIndex(p => p.id === giver.id), receiverPosIndex: PARTICIPANTS_DATA.findIndex(p => p.id === receiver.id) }; }); setAssignments(newAssignments); setIsGenerating(false); }, 600); // Delay estético }; return (
¿Quién regala a quién?