wezard 2.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/web/chat.js CHANGED
@@ -302,14 +302,31 @@
302
302
  '<span class="pv">' + esc(pv) + '</span></span>';
303
303
  };
304
304
 
305
+ // 展开态按会话各记各的: 点开一个不收起别的, 轮询重画也不动它。
306
+ // OPEN_AT = 已经替它自动展开过的那个 CONV —— 选中新会话时展开一次, 之后折不折由人说了算。
307
+ var OPEN = {}, OPEN_AT = '';
308
+ var reveal = function () {
309
+ if (CONV && CONV !== OPEN_AT) { OPEN[CONV] = true; OPEN_AT = CONV; }
310
+ };
311
+ // 点侧栏项: 没选中它 → 选中 (会话顺带展开); 已选中 → 不再选一遍, 右边的正文一个字不动 ——
312
+ // 会话只折叠/展开, 子项什么都不做。
313
+ var clickItem = function (key, withRole) {
314
+ if (key !== CONV || withRole !== WITH || VIEW !== 'msgs') return selectConv(key, withRole);
315
+ // 窄屏退回列表后再点它是要回去读, 不是要折叠。
316
+ if (!app.classList.contains('reading')) return app.classList.add('reading');
317
+ if (withRole) return;
318
+ OPEN[key] = !OPEN[key];
319
+ renderConvs();
320
+ };
321
+
305
322
  var convItem = function (c) {
306
323
  var on = c.key === CONV;
307
324
  var title = c.kind === 'wizard' ? nm(c.peer, c.name, true) : '<span class="nm chat">' + esc(c.name) + '</span>';
308
325
  // 只列与我有往来的: 在群里但没和我说过话的人, 点进去也是空的。
309
- var talked = on ? c.subs.filter(function (s) { return s.count; }) : [];
326
+ var talked = OPEN[c.key] ? c.subs.filter(function (s) { return s.count; }) : [];
310
327
  var subs = talked.length
311
328
  ? '<div class="subs">' + talked.map(function (s) {
312
- var sel = s.role === WITH;
329
+ var sel = on && s.role === WITH;
313
330
  return '<button class="si' + (sel ? ' on' : '') + '" data-conv="' + esc(c.key) + '" data-with="' + esc(s.role) + '" ' +
314
331
  'title="' + esc('我与 ' + nameOf(s.role) + ' 在这里的 ' + s.count + ' 条往来') + '">' +
315
332
  goSpan('av', s.role, esc(s.label)) +
@@ -334,7 +351,8 @@
334
351
  if (convsEl._html === html) return;
335
352
  convsEl._html = html; convsEl.innerHTML = html;
336
353
  convsEl.querySelectorAll('[data-conv]').forEach(function (b) {
337
- b.onclick = function () { selectConv(b.getAttribute('data-conv'), b.getAttribute('data-with') || ''); };
354
+ var key = b.getAttribute('data-conv'), w = b.getAttribute('data-with') || '';
355
+ b.onclick = function () { clickItem(key, w); };
338
356
  });
339
357
  bindGo(convsEl);
340
358
  };
@@ -688,7 +706,10 @@
688
706
  if (c.peer) learn(c.peer, c.name, c.label);
689
707
  c.subs.forEach(function (s) { learn(s.role, s.name, s.label); });
690
708
  });
691
- if (!CONV || !convOf(CONV)) { CONV = d.conv || ''; WITH = ''; }
709
+ // 没带 conv 的链接 (群里点名字进来) 落在服务端挑的窗口上, 连同它挑的「只看我与谁」;
710
+ // 手里的 conv 失效则只退回整个会话。
711
+ if (!CONV || !convOf(CONV)) { WITH = CONV ? '' : d['with'] || ''; CONV = d.conv || ''; }
712
+ reveal();
692
713
  renderRole(); renderUsage(); renderConvs(); renderHead();
693
714
  };
694
715
 
@@ -728,6 +749,7 @@
728
749
 
729
750
  var selectConv = function (key, withRole) {
730
751
  CONV = key; WITH = withRole || '';
752
+ reveal();
731
753
  if (VIEW !== 'msgs') setView('msgs');
732
754
  app.classList.add('reading');
733
755
  // 上一个窗口的账不属于这个窗口 —— 先收起, 新的随 SSE 的首个 role 事件到。