Test Support
AI-powered · Typically replies instantly
// ===== CONFIGURATION ===== const GVX_CONFIG = { webhookUrl: 'https://8000-i5qginuif1c2gwl7wrncx-fb9d7228.us2.manus.computer', welcomeMessage: "Hi! I'm the Golf VX Simulator Support AI. I can help you with troubleshooting, setup questions, technical issues, and more. What can I help you with today?", escalationPrompt: "I wasn't able to find an answer for that. Let me create a support ticket so our team can follow up with you.", };
// ===== STATE ===== let gvxState = { isOpen: false, threadId: null, isLoading: false, hasShownBadge: false, customerName: '', customerEmail: '', transcript: [], awaitingEscalation: false, };
// ===== INIT ===== document.addEventListener('DOMContentLoaded', () => { // Show badge after 3 seconds to draw attention setTimeout(() => { if (!gvxState.isOpen) { const badge = document.getElementById('gvx-badge'); badge.style.display = 'flex'; gvxState.hasShownBadge = true; } }, 3000); });
// ===== TOGGLE ===== function gvxToggleChat() { gvxState.isOpen = !gvxState.isOpen; const win = document.getElementById('gvx-chat-window'); const badge = document.getElementById('gvx-badge');
if (gvxState.isOpen) { win.classList.add('open'); badge.style.display = 'none'; if (document.getElementById('gvx-messages').children.length === 0) { gvxAddMessage('bot', GVX_CONFIG.welcomeMessage); } setTimeout(() => document.getElementById('gvx-input').focus(), 100); } else { win.classList.remove('open'); } }
// ===== ADD MESSAGE ===== function gvxAddMessage(role, text, isHtml = false) { const container = document.getElementById('gvx-messages');
const wrapper = document.createElement('div'); wrapper.className = `gvx-msg ${role}`;
if (role === 'bot') { const avatar = document.createElement('div'); avatar.className = 'gvx-msg-avatar'; avatar.innerHTML = ``; wrapper.appendChild(avatar); }
const bubble = document.createElement('div'); bubble.className = 'gvx-bubble'; if (isHtml) { bubble.innerHTML = text; } else { bubble.textContent = text; } wrapper.appendChild(bubble);
container.appendChild(wrapper); container.scrollTop = container.scrollHeight;
// Track transcript gvxState.transcript.push({ role, text });
return wrapper; }
// ===== TYPING INDICATOR ===== function gvxShowTyping() { const container = document.getElementById('gvx-messages'); const wrapper = document.createElement('div'); wrapper.className = 'gvx-msg bot'; wrapper.id = 'gvx-typing-indicator';
const avatar = document.createElement('div'); avatar.className = 'gvx-msg-avatar'; avatar.innerHTML = ``;
const bubble = document.createElement('div'); bubble.className = 'gvx-bubble'; bubble.innerHTML = `
`;
wrapper.appendChild(avatar); wrapper.appendChild(bubble); container.appendChild(wrapper); container.scrollTop = container.scrollHeight; }
function gvxHideTyping() { const indicator = document.getElementById('gvx-typing-indicator'); if (indicator) indicator.remove(); }
// ===== ESCALATION FORM ===== function gvxShowEscalationForm() { gvxState.awaitingEscalation = true; document.getElementById('gvx-input').disabled = true; document.getElementById('gvx-send-btn').disabled = true;
const transcriptText = gvxState.transcript .map(m => `[${m.role.toUpperCase()}]: ${m.text}`) .join('\n');
const formHtml = `
Please provide your contact details and our support team will follow up with you.
`;
const container = document.getElementById('gvx-messages'); const wrapper = document.createElement('div'); wrapper.className = 'gvx-msg bot'; wrapper.style.maxWidth = '100%'; wrapper.style.width = '100%'; wrapper.innerHTML = formHtml; container.appendChild(wrapper); container.scrollTop = container.scrollHeight; }
async function gvxSubmitEscalation(encodedTranscript) { const name = document.getElementById('gvx-esc-name').value.trim(); const email = document.getElementById('gvx-esc-email').value.trim();
if (!name || !email) { alert('Please enter both your name and email address.'); return; } if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { alert('Please enter a valid email address.'); return; }
gvxState.customerName = name; gvxState.customerEmail = email;
const transcript = decodeURIComponent(encodedTranscript);
// Remove the form const container = document.getElementById('gvx-messages'); const lastMsg = container.lastElementChild; if (lastMsg) lastMsg.remove();
gvxShowTyping();
try { const response = await fetch(GVX_CONFIG.webhookUrl + '/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: '[FORCE_ESCALATE]', thread_id: gvxState.threadId, customer_name: name, customer_email: email, transcript: transcript, source: 'golfvx', }), });
const data = await response.json(); gvxHideTyping();
const ticketId = data.ticket_id || ''; gvxAddMessage('bot', `✅ Your support ticket has been created${ticketId ? ' (#' + ticketId + ')' : ''}. Our team will reach out to ${email} shortly. Thank you for contacting Golf VX support!` );
} catch (err) { gvxHideTyping(); gvxAddMessage('bot', `Your request has been received. Our support team will reach out to ${email} within 1 business day.` ); } }
// ===== SEND MESSAGE ===== async function gvxSendMessage() { if (gvxState.isLoading || gvxState.awaitingEscalation) return;
const input = document.getElementById('gvx-input'); const message = input.value.trim(); if (!message) return;
input.value = ''; input.style.height = 'auto'; gvxState.isLoading = true; document.getElementById('gvx-send-btn').disabled = true;
gvxAddMessage('user', message); gvxShowTyping();
try { const response = await fetch(GVX_CONFIG.webhookUrl + '/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: message, thread_id: gvxState.threadId || '', customer_name: gvxState.customerName, customer_email: gvxState.customerEmail, transcript: '', source: 'golfvx', }), });
const data = await response.json(); gvxHideTyping();
// Save thread ID for conversation continuity if (data.thread_id) gvxState.threadId = data.thread_id;
if (data.escalate) { gvxAddMessage('bot', GVX_CONFIG.escalationPrompt); gvxShowEscalationForm(); } else { gvxAddMessage('bot', data.reply || "I'm sorry, I didn't get a response. Please try again."); }
} catch (err) { gvxHideTyping(); gvxAddMessage('bot', "I'm having trouble connecting right now. Please try again in a moment, or email us at support@golfvx.com."); }
gvxState.isLoading = false; document.getElementById('gvx-send-btn').disabled = false; input.focus(); }
// ===== KEYBOARD & RESIZE ===== function gvxHandleKey(e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); gvxSendMessage(); } }
function gvxAutoResize(el) { el.style.height = 'auto'; el.style.height = Math.min(el.scrollHeight, 100) + 'px'; }
