0) { ob_end_clean(); } // Establecer el tipo de contenido como JavaScript header('Content-Type: application/javascript; charset=utf-8'); // Evitar caché header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); // Iniciar sesión si no está iniciada if (session_status() === PHP_SESSION_NONE) { session_start(['read_and_close' => true]); } // Inicializar array de emojis personalizados si no existe if (!isset($_SESSION['custom_emojis'])) { $_SESSION['custom_emojis'] = []; } // Si es una petición POST para agregar un emoji personalizado if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['emoji'])) { $emoji = trim($_POST['emoji']); if (!empty($emoji) && !in_array($emoji, $_SESSION['custom_emojis'] ?? [])) { array_unshift($_SESSION['custom_emojis'], $emoji); $_SESSION['custom_emojis'] = array_slice($_SESSION['custom_emojis'], 0, 50); echo json_encode(['success' => true, 'message' => 'Emoji guardado correctamente']); } else { echo json_encode(['success' => false, 'message' => 'No se pudo guardar el emoji']); } exit; } // Si llegamos aquí, es una petición GET para cargar los emojis // Generamos el código JavaScript directamente echo "// Asegurarse de que la función no se defina múltiples veces\n"; echo "if (typeof window.setupEmojiHandlers === 'undefined') {\n"; echo " // Función para manejar los eventos de los emojis\n"; echo " window.setupEmojiHandlers = function() {\n"; echo " console.log('Inicializando manejadores de emojis...');\n\n"; echo " // Función para manejar clics en emojis\n"; echo " function handleEmojiClick(e) {\n"; echo " const emoji = e.target.closest('.emoji-item');\n"; echo " if (!emoji) return;\n\n"; echo " e.preventDefault();\n"; echo " e.stopPropagation();\n\n"; echo " const emojiChar = emoji.getAttribute('data-emoji');\n"; echo " if (!emojiChar) return;\n\n"; echo " console.log('Emoji seleccionado:', emojiChar);\n\n"; echo " // Intentar encontrar el editor en diferentes contextos\n"; echo " const contexts = [window, window.parent, window.opener, window.top];\n"; echo " let emojiInserted = false;\n\n"; echo " for (const ctx of contexts) {\n"; echo " try {\n"; echo " if (ctx && ctx.$ && ctx.$('#messageContent').length > 0) {\n"; echo " ctx.$('#messageContent').summernote('editor.saveRange');\n"; echo " ctx.$('#messageContent').summernote('editor.restoreRange');\n"; echo " ctx.$('#messageContent').summernote('editor.focus');\n"; echo " ctx.$('#messageContent').summernote('editor.insertText', emojiChar);\n"; echo " emojiInserted = true;\n"; echo " break;\n"; echo " }\n"; echo " } catch (e) {\n"; echo " console.error('Error al insertar emoji en contexto:', e);\n"; echo " }\n"; echo " }\n\n"; echo " if (!emojiInserted) {\n"; echo " console.warn('No se pudo insertar el emoji: No se encontró el editor Summernote');\n"; echo " alert('No se pudo insertar el emoji. Asegúrate de que el editor esté disponible.');\n"; echo " }\n\n"; echo " // Cerrar el modal después de seleccionar un emoji\n"; echo " $('#emojiModal').modal('hide');\n"; echo " }\n\n"; echo " // Función para manejar clics en pestañas\n"; echo " function handleTabClick(e) {\n"; echo " const tab = e.target.closest('.emoji-tab');\n"; echo " if (!tab) return;\n\n"; echo " e.preventDefault();\n"; echo " e.stopPropagation();\n\n"; echo " const category = tab.getAttribute('data-category');\n"; echo " if (!category) return;\n\n"; echo " console.log('Cambiando a categoría:', category);\n\n"; echo " // Actualizar pestaña activa\n"; echo " document.querySelectorAll('.emoji-tab').forEach(function(t) {\n"; echo " t.classList.remove('btn-primary');\n"; echo " t.classList.add('btn-outline-secondary');\n"; echo " });\n\n"; echo " tab.classList.remove('btn-outline-secondary');\n"; echo " tab.classList.add('btn-primary');\n\n"; echo " // Mostrar la categoría seleccionada\n"; echo " document.querySelectorAll('.emoji-category').forEach(function(cat) {\n"; echo " cat.classList.add('d-none');\n"; echo " });\n\n"; echo " const targetCategory = document.getElementById('emoji-' + category);\n"; echo " if (targetCategory) {\n"; echo " targetCategory.classList.remove('d-none');\n"; echo " }\n"; echo " }\n\n"; echo " // Eliminar manejadores anteriores para evitar duplicados\n"; echo " document.removeEventListener('click', handleEmojiClick);\n"; echo " document.removeEventListener('click', handleTabClick);\n\n"; echo " // Agregar nuevos manejadores\n"; echo " document.addEventListener('click', handleEmojiClick);\n"; echo " document.addEventListener('click', handleTabClick);\n\n"; echo " // Activar la primera pestaña por defecto si no hay ninguna activa\n"; echo " const activeTab = document.querySelector('.emoji-tab.btn-primary');\n"; echo " if (!activeTab) {\n"; echo " const firstTab = document.querySelector('.emoji-tab');\n"; echo " if (firstTab) {\n"; echo " firstTab.click();\n"; echo " }\n"; echo " }\n"; echo " }; // Cierre de la función setupEmojiHandlers\n"; echo "} // Cierre del if que verifica si la función ya está definida\n\n"; // Lista de emojis organizados por categorías $emojis = [ 'caritas' => ['😀', '😃', '😄', '😁', '😆', '😅', '😂', '🤣', '😊', '😇', '🙂', '🙃', '😉', '😌', '😍', '🥰', '😘', '😗', '😙', '😚', '😋', '😛', '😝', '😜', '🤪', '🤨', '🧐', '🤓', '😎', '🤩'], 'manos' => ['👋', '🤚', '🖐️', '✋', '🖖', '👌', '🤏', '✌️', '🤞', '🤟', '🤘', '🤙', '👈', '👉', '👆', '🖕', '👇', '☝️', '👍', '👎', '✊', '👊', '🤛', '🤜', '👏', '🙌', '🤲', '🤝', '🙏'], 'simbolos' => ['❤️', '🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎', '💔', '❣️', '💕', '💞', '💓', '💗', '💖', '💘', '💝', '💟', '☮️', '✝️', '☪️', '🕉️', '☸️', '✡️', '🔯', '🕎', '☯️', '☦️', '🛐'], 'objetos' => ['📱', '📲', '💻', '⌨️', '🖥️', '🖨️', '🖱️', '🖲️', '🕹️', '⌚', '📷', '📸', '📹', '🎥', '📽️', '🎞️', '📞', '☎️', '📟', '📠', '📺', '📻', '🎙️', '🎚️', '🎛️', '🧭', '⏱️', '⏲️', '⏰', '🕰️'], 'naturaleza' => ['🐵', '🐒', '🦍', '🦧', '🐶', '🐕', '🦮', '🐕‍🦺', '🐩', '🐺', '🦊', '🦝', '🐱', '🐈', '🦁', '🐯', '🐅', '🐆', '🐴', '🐎', '🦄', '🦓', '🦌', '🐮', '🐂', '🐃', '🐄', '🐷', '🐖', '🐗'] ]; // Agregar emojis personalizados si existen if (!empty($_SESSION['custom_emojis'])) { $emojis['personalizados'] = $_SESSION['custom_emojis']; } else { $emojis['personalizados'] = []; } // Nombres de categorías más amigables $categoryNames = [ 'caritas' => 'Caritas', 'manos' => 'Manos', 'simbolos' => 'Símbolos', 'objetos' => 'Objetos', 'naturaleza' => 'Naturaleza', 'personalizados' => 'Mis Emojis' ]; // Manejar la adición de un nuevo emoji personalizado if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['emoji'])) { // Limpiar el buffer de salida while (ob_get_level() > 0) { ob_end_clean(); } // Establecer el tipo de contenido como JSON header('Content-Type: application/json'); // Validar y limpiar el emoji $emoji = trim($_POST['emoji']); // Validar que el emoji no esté vacío if (empty($emoji)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'El emoji no puede estar vacío']); exit; } // Iniciar la sesión si no está iniciada if (session_status() === PHP_SESSION_NONE) { session_start(); } // Inicializar el array de emojis personalizados si no existe if (!isset($_SESSION['custom_emojis'])) { $_SESSION['custom_emojis'] = []; } // Verificar si el emoji ya existe if (!in_array($emoji, $_SESSION['custom_emojis'])) { // Agregar el nuevo emoji al inicio del array array_unshift($_SESSION['custom_emojis'], $emoji); // Mantener solo los últimos 50 emojis $_SESSION['custom_emojis'] = array_slice($_SESSION['custom_emojis'], 0, 50); // Devolver éxito echo json_encode([ 'success' => true, 'message' => 'Emoji guardado correctamente', 'emoji' => $emoji ]); } else { // El emoji ya existe echo json_encode([ 'success' => false, 'message' => 'Este emoji ya existe en tu colección' ]); } // Terminar la ejecución exit; } ?>
Puedes pegar cualquier emoji o carácter especial
$emojiList): ?>
2; $emojiClass = $isLongEmoji ? 'long-emoji' : ''; ?>