smodusermc commited on
Commit
20c0dda
·
verified ·
1 Parent(s): a04bf1a

Update static/script.js

Browse files
Files changed (1) hide show
  1. 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 => {