|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(function () { |
|
|
'use strict'; |
|
|
|
|
|
var sanitizeInput = function (raw, encode) { |
|
|
if (!raw) return ''; |
|
|
var clean = raw; |
|
|
|
|
|
if (typeof DOMPurify !== 'undefined') { |
|
|
clean = DOMPurify.sanitize(clean, { |
|
|
ALLOWED_TAGS: [], |
|
|
ALLOWED_ATTR: [] |
|
|
}); |
|
|
} |
|
|
|
|
|
if (typeof filterXSS !== 'undefined') { |
|
|
clean = filterXSS(clean, { |
|
|
whiteList: {} |
|
|
}); |
|
|
} |
|
|
|
|
|
if (encode === true && typeof he !== 'undefined') { |
|
|
clean = he.encode(clean, { |
|
|
encodeEverything: false |
|
|
}); |
|
|
} |
|
|
|
|
|
return clean; |
|
|
}; |
|
|
|
|
|
var noop = function () {}; |
|
|
var methods = [ |
|
|
'log', 'error', 'warn', 'info', 'debug', 'trace', |
|
|
'dir', 'table', 'time', 'timeEnd', 'timeLog', 'group', |
|
|
'groupEnd', 'assert', 'count', 'countReset', 'profile', |
|
|
'profileEnd', 'clear', 'dirxml', 'exception', |
|
|
'groupCollapsed' |
|
|
]; |
|
|
|
|
|
var disableConsole = function () { |
|
|
methods.forEach(function (m) { |
|
|
try { |
|
|
window.console[m] = noop; |
|
|
} catch (e) {} |
|
|
}); |
|
|
|
|
|
try { |
|
|
Object.defineProperty(window, 'console', { |
|
|
value: Object.freeze(Object.create(null)), |
|
|
writable: false, |
|
|
configurable: false |
|
|
}); |
|
|
} catch (e) {} |
|
|
}; |
|
|
|
|
|
disableConsole(); |
|
|
|
|
|
var InitWelcomeModal = function () { |
|
|
try { |
|
|
var hasShown = localStorage.getItem('welcomeModalShown'); |
|
|
if (!hasShown) { |
|
|
var modal = document.getElementById('welcomeModal'); |
|
|
if (modal) { |
|
|
modal.style.display = 'flex'; |
|
|
} |
|
|
} |
|
|
} catch (e) { |
|
|
var modal = document.getElementById('welcomeModal'); |
|
|
if (modal) { |
|
|
modal.style.display = 'flex'; |
|
|
} |
|
|
} |
|
|
}; |
|
|
|
|
|
var closeWelcomeModal = function () { |
|
|
var modal = document.getElementById('welcomeModal'); |
|
|
if (modal) { |
|
|
modal.style.display = 'none'; |
|
|
try { |
|
|
localStorage.setItem('welcomeModalShown', 'true'); |
|
|
} catch (e) {} |
|
|
} |
|
|
}; |
|
|
|
|
|
var closeErrorModal = function () { |
|
|
var modal = document.getElementById('errorModal'); |
|
|
if (modal) { |
|
|
modal.style.animation = 'fadeIn 0.5s ease reverse'; |
|
|
setTimeout(function () { |
|
|
modal.remove(); |
|
|
}, 500); |
|
|
} |
|
|
}; |
|
|
|
|
|
var validateInputs = function () { |
|
|
var model = document.getElementById('modelSelect'); |
|
|
var size = document.getElementById('sizeSelect'); |
|
|
var prompt = document.getElementById('promptInput'); |
|
|
var submitBtn = document.getElementById('submitBtn'); |
|
|
|
|
|
if (!model || !size || !prompt || !submitBtn) return; |
|
|
|
|
|
var modelValue = model.value; |
|
|
var sizeValue = size.value; |
|
|
var promptValue = sanitizeInput(prompt.value); |
|
|
|
|
|
var isValid = !!modelValue && |
|
|
!!sizeValue && |
|
|
!!promptValue && |
|
|
promptValue.length > 0; |
|
|
|
|
|
if (isValid) { |
|
|
var hasNonWhitespace = /[^\s\t\n\r\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/.test(promptValue); |
|
|
isValid = isValid && hasNonWhitespace; |
|
|
} |
|
|
|
|
|
if (typeof validator !== 'undefined' && isValid) { |
|
|
isValid = isValid && |
|
|
validator.isLength(promptValue.trim(), { min: 1 }); |
|
|
} |
|
|
|
|
|
submitBtn.disabled = !isValid; |
|
|
}; |
|
|
|
|
|
var triggerExample = function (prompt, model, size) { |
|
|
var modelSelect = document.getElementById('modelSelect'); |
|
|
var sizeSelect = document.getElementById('sizeSelect'); |
|
|
var promptInput = document.getElementById('promptInput'); |
|
|
var form = document.getElementById('generateForm'); |
|
|
|
|
|
if (modelSelect) modelSelect.value = model; |
|
|
if (sizeSelect) sizeSelect.value = size; |
|
|
if (promptInput) { |
|
|
promptInput.value = sanitizeInput(prompt); |
|
|
} |
|
|
|
|
|
validateInputs(); |
|
|
|
|
|
if (form) { |
|
|
setTimeout(function () { |
|
|
var fa = document.getElementById('formAction'); |
|
|
if (fa) fa.value = 'generate'; |
|
|
submitForm(); |
|
|
}, 100); |
|
|
} |
|
|
}; |
|
|
|
|
|
var submitForm = function() { |
|
|
var form = document.getElementById('generateForm'); |
|
|
if (!form) return; |
|
|
|
|
|
var formData = new FormData(form); |
|
|
var promptValue = sanitizeInput(formData.get('prompt')); |
|
|
|
|
|
var hasNonWhitespace = /[^\s\t\n\r\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/.test(promptValue); |
|
|
|
|
|
if (!promptValue || !hasNonWhitespace) { |
|
|
return; |
|
|
} |
|
|
|
|
|
var data = { |
|
|
action: formData.get('action') || 'generate', |
|
|
prompt: promptValue, |
|
|
model: formData.get('model'), |
|
|
size: formData.get('size'), |
|
|
sessionId: document.body.dataset.sessionId || '' |
|
|
}; |
|
|
|
|
|
var xhr = new XMLHttpRequest(); |
|
|
xhr.open('POST', '/', true); |
|
|
xhr.setRequestHeader( |
|
|
'Content-Type', |
|
|
'application/json' |
|
|
); |
|
|
|
|
|
xhr.onload = function() { |
|
|
try { |
|
|
var response = JSON.parse(xhr.responseText); |
|
|
if (!response.success && response.error) { |
|
|
showErrorModal(response.error); |
|
|
} |
|
|
} catch (e) {} |
|
|
}; |
|
|
|
|
|
xhr.send(JSON.stringify(data)); |
|
|
}; |
|
|
|
|
|
var cancelGeneration = function () { |
|
|
var xhr = new XMLHttpRequest(); |
|
|
xhr.open('POST', '/', true); |
|
|
xhr.setRequestHeader( |
|
|
'Content-Type', |
|
|
'application/json' |
|
|
); |
|
|
|
|
|
xhr.send(JSON.stringify({ |
|
|
action: 'cancel', |
|
|
sessionId: document.body.dataset.sessionId || '' |
|
|
})); |
|
|
}; |
|
|
|
|
|
var showErrorModal = function(error) { |
|
|
var existingModal = document.getElementById('errorModal'); |
|
|
if (existingModal) existingModal.remove(); |
|
|
|
|
|
var modal = document.createElement('div'); |
|
|
modal.id = 'errorModal'; |
|
|
modal.className = 'modal-overlay'; |
|
|
modal.innerHTML = |
|
|
'<div class="modal-content modal-error-content">' + |
|
|
'<div class="modal-inner">' + |
|
|
'<h3 class="modal-error-title">Error</h3>' + |
|
|
'<p class="modal-error-text">' + error + '</p>' + |
|
|
'<button onclick="closeErrorModal()" ' + |
|
|
'class="btn btn-primary w-full">OK</button>' + |
|
|
'</div>' + |
|
|
'</div>'; |
|
|
|
|
|
document.body.appendChild(modal); |
|
|
}; |
|
|
|
|
|
var modelSelect = document.getElementById('modelSelect'); |
|
|
var sizeSelect = document.getElementById('sizeSelect'); |
|
|
var promptInput = document.getElementById('promptInput'); |
|
|
var form = document.getElementById('generateForm'); |
|
|
|
|
|
if (modelSelect) { |
|
|
modelSelect.addEventListener('change', validateInputs); |
|
|
} |
|
|
|
|
|
if (sizeSelect) { |
|
|
sizeSelect.addEventListener('change', validateInputs); |
|
|
} |
|
|
|
|
|
if (promptInput) { |
|
|
promptInput.addEventListener('input', function () { |
|
|
promptInput.value = sanitizeInput(promptInput.value); |
|
|
validateInputs(); |
|
|
}); |
|
|
|
|
|
promptInput.addEventListener('paste', function () { |
|
|
setTimeout(function () { |
|
|
promptInput.value = sanitizeInput(promptInput.value); |
|
|
validateInputs(); |
|
|
}, 10); |
|
|
}); |
|
|
|
|
|
promptInput.addEventListener('keydown', function (e) { |
|
|
if (e.key === 'Enter' && e.ctrlKey) { |
|
|
e.preventDefault(); |
|
|
var submitBtn = document.getElementById('submitBtn'); |
|
|
if (submitBtn && !submitBtn.disabled) { |
|
|
submitForm(); |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
promptInput.addEventListener('keyup', function () { |
|
|
validateInputs(); |
|
|
}); |
|
|
|
|
|
promptInput.addEventListener('blur', function () { |
|
|
validateInputs(); |
|
|
}); |
|
|
} |
|
|
|
|
|
if (form) { |
|
|
form.addEventListener('submit', function(e) { |
|
|
e.preventDefault(); |
|
|
|
|
|
var promptValue = sanitizeInput(promptInput ? promptInput.value : ''); |
|
|
var hasNonWhitespace = /[^\s\t\n\r\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/.test(promptValue); |
|
|
|
|
|
if (!promptValue || !hasNonWhitespace) { |
|
|
return; |
|
|
} |
|
|
|
|
|
submitForm(); |
|
|
}); |
|
|
} |
|
|
|
|
|
window.closeWelcomeModal = closeWelcomeModal; |
|
|
window.closeErrorModal = closeErrorModal; |
|
|
window.triggerExample = triggerExample; |
|
|
window.cancelGeneration = cancelGeneration; |
|
|
window.validateInputs = validateInputs; |
|
|
|
|
|
validateInputs(); |
|
|
|
|
|
var cards = document.querySelectorAll('.card'); |
|
|
Array.prototype.forEach.call(cards, function (card) { |
|
|
card.addEventListener('mousemove', function (e) { |
|
|
var rect = card.getBoundingClientRect(); |
|
|
var x = e.clientX - rect.left; |
|
|
var y = e.clientY - rect.top; |
|
|
card.style.setProperty('--mouse-x', x + 'px'); |
|
|
card.style.setProperty('--mouse-y', y + 'px'); |
|
|
}); |
|
|
}); |
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
InitWelcomeModal(); |
|
|
validateInputs(); |
|
|
}); |
|
|
|
|
|
if (document.readyState === 'complete' || |
|
|
document.readyState === 'interactive') { |
|
|
InitWelcomeModal(); |
|
|
validateInputs(); |
|
|
} |
|
|
|
|
|
setInterval(function () { |
|
|
disableConsole(); |
|
|
}, 1000); |
|
|
})(); |