Spaces:
Running
Running
Update static/script.js
Browse files- static/script.js +62 -1
static/script.js
CHANGED
|
@@ -117,7 +117,7 @@
|
|
| 117 |
confirmModal: $('confirm-modal'), lightboxModal: $('lightbox-modal'),
|
| 118 |
emojiPicker: $('emoji-picker'), emojiGrid: $('emoji-grid'),
|
| 119 |
|
| 120 |
-
groupBtn: $('group-btn'), groupModal: $('group-modal'),
|
| 121 |
groupNameInput: $('group-name-input'), groupUserSearch: $('group-user-search'),
|
| 122 |
groupUserResults: $('group-user-results'), groupSelectedList: $('group-selected-list'),
|
| 123 |
createGroupBtn: $('create-group-btn'),
|
|
@@ -144,6 +144,7 @@
|
|
| 144 |
settingsBtn: $('settings-btn'), logoutBtn: $('logout-btn'), meSettingsBtn: $('me-settings-btn'),
|
| 145 |
sidebarLogoutBtn: $('sidebar-logout-btn'),
|
| 146 |
convModalDesc: $('conv-modal-desc'), convModalList: $('conv-modal-list'), newChatBtn: $('new-chat-btn'),
|
|
|
|
| 147 |
receiptsSummary: $('receipts-summary'), receiptsList: $('receipts-list'),
|
| 148 |
confirmTitle: $('confirm-title'), confirmMessage: $('confirm-message'),
|
| 149 |
confirmOkBtn: $('confirm-ok-btn'), confirmCancelBtn: $('confirm-cancel-btn'),
|
|
@@ -2186,10 +2187,70 @@
|
|
| 2186 |
(existing.length ? ` (${existing.length} of 3 existing)` : '');
|
| 2187 |
DOM.convModal.dataset.peerId = peerId;
|
| 2188 |
DOM.convModal.dataset.peerName = peerName;
|
|
|
|
|
|
|
| 2189 |
renderConvModal(existing);
|
| 2190 |
openModal(DOM.convModal);
|
| 2191 |
}
|
| 2192 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2193 |
function renderConvModal(existing) {
|
| 2194 |
let html = '';
|
| 2195 |
existing.forEach(c => {
|
|
|
|
| 117 |
confirmModal: $('confirm-modal'), lightboxModal: $('lightbox-modal'),
|
| 118 |
emojiPicker: $('emoji-picker'), emojiGrid: $('emoji-grid'),
|
| 119 |
|
| 120 |
+
privateChatBtn: $('private-chat-btn'), groupBtn: $('group-btn'), groupModal: $('group-modal'),
|
| 121 |
groupNameInput: $('group-name-input'), groupUserSearch: $('group-user-search'),
|
| 122 |
groupUserResults: $('group-user-results'), groupSelectedList: $('group-selected-list'),
|
| 123 |
createGroupBtn: $('create-group-btn'),
|
|
|
|
| 144 |
settingsBtn: $('settings-btn'), logoutBtn: $('logout-btn'), meSettingsBtn: $('me-settings-btn'),
|
| 145 |
sidebarLogoutBtn: $('sidebar-logout-btn'),
|
| 146 |
convModalDesc: $('conv-modal-desc'), convModalList: $('conv-modal-list'), newChatBtn: $('new-chat-btn'),
|
| 147 |
+
convUserSearch: $('conv-user-search'),
|
| 148 |
receiptsSummary: $('receipts-summary'), receiptsList: $('receipts-list'),
|
| 149 |
confirmTitle: $('confirm-title'), confirmMessage: $('confirm-message'),
|
| 150 |
confirmOkBtn: $('confirm-ok-btn'), confirmCancelBtn: $('confirm-cancel-btn'),
|
|
|
|
| 2187 |
(existing.length ? ` (${existing.length} of 3 existing)` : '');
|
| 2188 |
DOM.convModal.dataset.peerId = peerId;
|
| 2189 |
DOM.convModal.dataset.peerName = peerName;
|
| 2190 |
+
DOM.convUserSearch.classList.add('hidden');
|
| 2191 |
+
DOM.newChatBtn.style.display = '';
|
| 2192 |
renderConvModal(existing);
|
| 2193 |
openModal(DOM.convModal);
|
| 2194 |
}
|
| 2195 |
|
| 2196 |
+
function openPrivateChatPicker() {
|
| 2197 |
+
DOM.convModal.dataset.peerId = '';
|
| 2198 |
+
DOM.convModal.dataset.peerName = '';
|
| 2199 |
+
DOM.convModalDesc.innerHTML = 'Start a <strong>private chat</strong> with someone';
|
| 2200 |
+
DOM.convUserSearch.classList.remove('hidden');
|
| 2201 |
+
DOM.convUserSearch.value = '';
|
| 2202 |
+
DOM.newChatBtn.style.display = 'none';
|
| 2203 |
+
DOM.convModalList.innerHTML = '<div class="conv-modal-empty">Loading users…</div>';
|
| 2204 |
+
loadPrivateUsers('');
|
| 2205 |
+
openModal(DOM.convModal);
|
| 2206 |
+
}
|
| 2207 |
+
|
| 2208 |
+
function renderPrivateUsers(users) {
|
| 2209 |
+
if (!users || !users.length) {
|
| 2210 |
+
DOM.convModalList.innerHTML = '<div class="conv-modal-empty">No one found</div>';
|
| 2211 |
+
return;
|
| 2212 |
+
}
|
| 2213 |
+
DOM.convModalList.innerHTML = users.filter(u => u.id !== State.user?.id).map(u => {
|
| 2214 |
+
const existing = [...State.conversations.values()].filter(
|
| 2215 |
+
c => c.type === 'dm' && c.peer && c.peer.id === u.id
|
| 2216 |
+
);
|
| 2217 |
+
const count = existing.length ? ` · ${existing.length} chat${existing.length === 1 ? '' : 's'}` : '';
|
| 2218 |
+
const av = u.avatar_path
|
| 2219 |
+
? `<img src="${fileUrl(u.avatar_path)}" alt="" style="width:36px;height:36px;border-radius:50%;object-fit:cover">`
|
| 2220 |
+
: `<span style="font-weight:600;font-size:1.1rem">${initialOf(displayNameOf(u))}</span>`;
|
| 2221 |
+
return `<button class="conv-modal-item" data-pick-user="${u.id}">
|
| 2222 |
+
<div class="user-avatar">${av}</div>
|
| 2223 |
+
<div class="mi-info">
|
| 2224 |
+
<span class="mi-name">${escapeHtml(displayNameOf(u))}</span>
|
| 2225 |
+
<span class="mi-preview">${escapeHtml(u.username)}${count}${u.online ? ' · online' : ''}${u.blocked ? ' · blocked' : ''}</span>
|
| 2226 |
+
</div>
|
| 2227 |
+
<i class="fas fa-user-plus mi-open"></i>
|
| 2228 |
+
</button>`;
|
| 2229 |
+
}).join('') || '<div class="conv-modal-empty">No one found</div>';
|
| 2230 |
+
DOM.convModalList.querySelectorAll('[data-pick-user]').forEach(btn => {
|
| 2231 |
+
btn.addEventListener('click', () => {
|
| 2232 |
+
const u = users.find(x => x.id === parseInt(btn.dataset.pickUser, 10));
|
| 2233 |
+
if (!u) return;
|
| 2234 |
+
if (u.blocked) { showToast('You have blocked this user', 'warning'); return; }
|
| 2235 |
+
openConvModal(u.id, displayNameOf(u));
|
| 2236 |
+
});
|
| 2237 |
+
});
|
| 2238 |
+
}
|
| 2239 |
+
|
| 2240 |
+
async function loadPrivateUsers(query = '') {
|
| 2241 |
+
try {
|
| 2242 |
+
const data = await apiGet(`/api/users?query=${encodeURIComponent(query)}`);
|
| 2243 |
+
renderPrivateUsers(data.users || []);
|
| 2244 |
+
} catch (err) {
|
| 2245 |
+
DOM.convModalList.innerHTML = `<div class="conv-modal-empty">${escapeHtml(err.message)}</div>`;
|
| 2246 |
+
}
|
| 2247 |
+
}
|
| 2248 |
+
|
| 2249 |
+
DOM.privateChatBtn.addEventListener('click', openPrivateChatPicker);
|
| 2250 |
+
DOM.convUserSearch.addEventListener('input', debounce(() => {
|
| 2251 |
+
loadPrivateUsers(DOM.convUserSearch.value.trim());
|
| 2252 |
+
}, 250));
|
| 2253 |
+
|
| 2254 |
function renderConvModal(existing) {
|
| 2255 |
let html = '';
|
| 2256 |
existing.forEach(c => {
|