Spaces:
Sleeping
Sleeping
File size: 3,921 Bytes
6575706 |
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('μ± μ½μ΄ λͺ¨λ μ΄κΈ°ν μλ£');
});
|