Spaces:
Running
Running
File size: 3,921 Bytes
460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 1681cd4 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 867f974 460bd69 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
/**
* RAG κ²μ μ±λ΄ UI κ³΅ν΅ μ νΈλ¦¬ν° JavaScript
*/
// μ μ μ νΈλ¦¬ν° ν¨μ
const AppUtils = {
// μμ€ν
μλ¦Ό λ©μμ§ μΆκ°
addSystemNotification: function(message) {
console.log(`[μμ€ν
μλ¦Ό] ${message}`);
const messageDiv = document.createElement('div');
messageDiv.classList.add('message', 'system');
const contentDiv = document.createElement('div');
contentDiv.classList.add('message-content');
const messageP = document.createElement('p');
messageP.innerHTML = `<i class="fas fa-info-circle"></i> ${message}`;
contentDiv.appendChild(messageP);
messageDiv.appendChild(contentDiv);
// μ±ν
λ©μμ§ μμμ΄ μμΌλ©΄ μΆκ°
const chatMessages = document.getElementById('chatMessages');
if (chatMessages) {
chatMessages.appendChild(messageDiv);
// μ€ν¬λ‘€μ κ°μ₯ μλλ‘ μ΄λ
chatMessages.scrollTop = chatMessages.scrollHeight;
}
},
// μ€λ₯ λ©μμ§ μΆκ°
addErrorMessage: function(errorText) {
console.error(`[μ€λ₯] ${errorText}`);
const messageDiv = document.createElement('div');
messageDiv.classList.add('message', 'system');
const contentDiv = document.createElement('div');
contentDiv.classList.add('message-content');
contentDiv.style.backgroundColor = 'rgba(239, 68, 68, 0.1)';
contentDiv.style.color = 'var(--error-color)';
const errorP = document.createElement('p');
errorP.innerHTML = `<i class="fas fa-exclamation-circle"></i> ${errorText}`;
contentDiv.appendChild(errorP);
messageDiv.appendChild(contentDiv);
// μ±ν
λ©μμ§ μμμ΄ μμΌλ©΄ μΆκ°
const chatMessages = document.getElementById('chatMessages');
if (chatMessages) {
chatMessages.appendChild(messageDiv);
// μ€ν¬λ‘€μ κ°μ₯ μλλ‘ μ΄λ
chatMessages.scrollTop = chatMessages.scrollHeight;
}
},
// νμμμ κΈ°λ₯μ΄ μλ fetch
fetchWithTimeout: async function(url, options = {}, timeout = 30000) {
console.log(`API μμ²: ${options.method || 'GET'} ${url}`);
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
try {
const response = await fetch(url, {
...options,
signal: controller.signal
});
clearTimeout(id);
console.log(`API μλ΅ μν: ${response.status}`);
return response;
} catch (error) {
clearTimeout(id);
if (error.name === 'AbortError') {
console.error(`API μμ² νμμμ: ${url}`);
throw new Error('μμ² μκ°μ΄ μ΄κ³Όλμμ΅λλ€.');
}
console.error(`API μμ² μ€ν¨: ${url}`, error);
throw error;
}
},
// λ‘λ© μ€νΌλ HTML μμ±
createLoadingSpinner: function() {
return '<div class="loading-spinner"></div>';
},
// λ μ§ ν¬λ§·ν
formatDate: function(date) {
return new Date(date).toLocaleString('ko-KR', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
});
},
// HTML λ¬Έμμ΄ μ΄μ€μΌμ΄ν (XSS λ°©μ§)
escapeHtml: function(html) {
const div = document.createElement('div');
div.textContent = html;
return div.innerHTML;
}
};
// νμ΄μ§ λ‘λ μλ£ μ κ³΅ν΅ μ΄κΈ°ν
document.addEventListener('DOMContentLoaded', function() {
console.log('μ± μ½μ΄ λͺ¨λ μ΄κΈ°ν μλ£');
});
|