101 lines
2.8 KiB
JavaScript
101 lines
2.8 KiB
JavaScript
// ── Session Page ──
|
|
|
|
let _sessionPageCleanup = [];
|
|
|
|
registerPage('session', {
|
|
async init(params) {
|
|
const sessionId = params.id;
|
|
if (!sessionId) return navigateTo('dashboard');
|
|
|
|
currentSessionId = sessionId;
|
|
|
|
// Session-Name laden
|
|
const session = await apiGetSession(sessionId);
|
|
const titleEl = document.getElementById('sessionTitle');
|
|
if (session && titleEl) {
|
|
titleEl.textContent = session.name || 'Unbenannt';
|
|
titleEl.addEventListener('dblclick', () => editTitle(sessionId, titleEl));
|
|
}
|
|
|
|
// System Prompt Toggle
|
|
const showSystem = document.getElementById('showSystem');
|
|
const systemPrompt = document.getElementById('systemPrompt');
|
|
if (showSystem && systemPrompt) {
|
|
showSystem.addEventListener('change', () => {
|
|
systemPrompt.classList.toggle('visible', showSystem.checked);
|
|
});
|
|
}
|
|
|
|
// Send
|
|
const sendBtn = document.getElementById('send');
|
|
if (sendBtn) sendBtn.addEventListener('click', sendMessage);
|
|
|
|
// Ctrl+Enter
|
|
const inputEl = document.getElementById('input');
|
|
if (inputEl) {
|
|
const keyHandler = (e) => {
|
|
if (e.ctrlKey && e.key === 'Enter') sendMessage();
|
|
};
|
|
inputEl.addEventListener('keydown', keyHandler);
|
|
|
|
// Auto-Resize
|
|
inputEl.addEventListener('input', function () {
|
|
this.style.height = 'auto';
|
|
this.style.height = Math.min(this.scrollHeight, 150) + 'px';
|
|
});
|
|
}
|
|
|
|
// Archivieren
|
|
const archiveBtn = document.getElementById('archiveBtn');
|
|
if (archiveBtn) archiveBtn.addEventListener('click', clearChat);
|
|
|
|
// State zurücksetzen und History laden
|
|
messages.length = 0;
|
|
lastKnownMessageId = 0;
|
|
loadedArchiveCount = 0;
|
|
isStreaming = false;
|
|
|
|
await loadHistory();
|
|
},
|
|
|
|
destroy() {
|
|
stopHistoryPolling();
|
|
messages.length = 0;
|
|
lastKnownMessageId = 0;
|
|
loadedArchiveCount = 0;
|
|
isStreaming = false;
|
|
}
|
|
});
|
|
|
|
function editTitle(sessionId, titleEl) {
|
|
const input = document.createElement('input');
|
|
input.type = 'text';
|
|
input.className = 'session-rename';
|
|
input.value = titleEl.textContent;
|
|
|
|
titleEl.replaceWith(input);
|
|
input.focus();
|
|
input.select();
|
|
|
|
const save = async () => {
|
|
const newName = input.value.trim();
|
|
if (newName) {
|
|
await apiUpdateSession(sessionId, { name: newName });
|
|
const newTitle = document.createElement('h1');
|
|
newTitle.id = 'sessionTitle';
|
|
newTitle.className = 'editable-title';
|
|
newTitle.textContent = newName;
|
|
newTitle.addEventListener('dblclick', () => editTitle(sessionId, newTitle));
|
|
input.replaceWith(newTitle);
|
|
} else {
|
|
input.replaceWith(titleEl);
|
|
}
|
|
};
|
|
|
|
input.addEventListener('blur', save);
|
|
input.addEventListener('keydown', (e) => {
|
|
if (e.key === 'Enter') input.blur();
|
|
if (e.key === 'Escape') { input.replaceWith(titleEl); }
|
|
});
|
|
}
|