diff --git a/chat.php b/chat.php
index eeb1b28..e22f2e8 100644
--- a/chat.php
+++ b/chat.php
@@ -3193,6 +3193,14 @@ if (isset($_GET['stream']) && $_GET['stream'] === 'events') {
color: #c2410c;
}
+ .user-list-error-banner {
+ margin: 12px 16px;
+ border-radius: 10px;
+ background: rgba(255, 237, 213, 0.85);
+ border: 1px solid rgba(251, 146, 60, 0.35);
+ padding: 12px 14px;
+ }
+
.chat-state-message.hidden {
display: none;
}
@@ -4359,9 +4367,42 @@ async function loadUsers() {
} catch (error) {
console.error('Nutzerliste konnte nicht geladen werden:', error);
state.isLoadingUsers = false;
- if (userListEl) {
- userListEl.innerHTML = '
Nutzerliste konnte nicht geladen werden.
';
+
+ const message = (error && error.message) ? error.message : 'Nutzerliste konnte nicht geladen werden.';
+ if (/nicht\s+eingeloggt/i.test(message) || /sitzung/i.test(message)) {
+ window.location.href = basePath;
+ return;
}
+
+ if (userListEl) {
+ if (!Array.isArray(state.users) || state.users.length === 0) {
+ userListEl.innerHTML = '';
+ const errorBox = document.createElement('div');
+ errorBox.className = 'error-state user-list-error-banner';
+ errorBox.textContent = message;
+ userListEl.appendChild(errorBox);
+ } else {
+ const existingBanner = userListEl.querySelector('.user-list-error-banner');
+ if (existingBanner) {
+ existingBanner.remove();
+ }
+ const banner = document.createElement('div');
+ banner.className = 'error-state user-list-error-banner';
+ banner.textContent = message;
+ userListEl.prepend(banner);
+ setTimeout(() => {
+ if (banner.parentNode) {
+ banner.remove();
+ }
+ }, 5000);
+ }
+ }
+
+ setTimeout(() => {
+ if (!state.isLoadingUsers) {
+ loadUsers();
+ }
+ }, 5000);
}
}
@@ -4390,27 +4431,29 @@ function renderUserList() {
return;
}
- const offlineLimit = 5;
- const onlineUsers = [];
- const offlineUsers = [];
+ const prioritizedUsers = filtered.slice();
- filtered.forEach(user => {
- if (user.is_online) {
- onlineUsers.push(user);
- } else {
- offlineUsers.push(user);
+ if (state.selectedUserId && !prioritizedUsers.some(user => Number(user.id) === Number(state.selectedUserId))) {
+ const selectedUser = users.find(user => Number(user.id) === Number(state.selectedUserId));
+ if (selectedUser && selectedUser.display_name.toLowerCase().includes(searchTerm)) {
+ prioritizedUsers.push(selectedUser);
}
- });
-
- const limitedUsers = onlineUsers.concat(offlineUsers.slice(0, offlineLimit));
+ }
+ const seen = new Set();
const fragment = document.createDocumentFragment();
- limitedUsers.forEach(user => {
+ prioritizedUsers.forEach(user => {
+ const userId = Number(user.id);
+ if (seen.has(userId)) {
+ return;
+ }
+ seen.add(userId);
+
const item = document.createElement('button');
item.type = 'button';
- item.className = 'user-item' + (Number(user.id) === Number(state.selectedUserId) ? ' active' : '');
- item.dataset.userId = String(user.id);
+ item.className = 'user-item' + (userId === Number(state.selectedUserId) ? ' active' : '');
+ item.dataset.userId = String(userId);
item.dataset.displayName = user.display_name;
const avatar = document.createElement('div');
@@ -4918,8 +4961,21 @@ userSearchInput?.addEventListener('input', () => renderUserList());
document.getElementById('logoutBtn')?.addEventListener('click', async () => {
const formData = new FormData();
formData.append('action', 'logout');
- await postFormData(formData);
- window.location.reload();
+
+ try {
+ const response = await postFormData(formData);
+ const contentType = response.headers.get('content-type') || '';
+ if (contentType.includes('application/json')) {
+ const result = await response.json().catch(() => null);
+ if (result && result.success === false) {
+ throw new Error(result.error || 'Logout fehlgeschlagen.');
+ }
+ }
+ } catch (error) {
+ console.error('Logout fehlgeschlagen:', error);
+ } finally {
+ window.location.href = basePath;
+ }
});
chatInputEl?.addEventListener('input', function() {