fix(desktop 0.1.6): fast + persistent native notifications + screen picker
- Desktop notifications were slow (~15s), vanished in ~1s, and clicks did nothing:
* don't block the toast on the avatar download (race a 600ms cap) → shows instantly
* keep a strong reference to each Notification (Electron GC'd them → premature close
+ dead click)
* call invites use timeoutType:'never' + a 45s window so they stay until clicked/ended;
web marks call notifications persistent.
- #9: enable the OS screen/window PICKER (useSystemPicker) so users choose what to share
(a single window avoids the whole-screen mirror); falls back to primary display.
- desktop 0.1.5 -> 0.1.6.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -827,7 +827,7 @@
|
||||
<body>
|
||||
<script src="/icons.js?v=5"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/@twemoji/api@15.1.0/dist/twemoji.min.js" crossorigin="anonymous"></script>
|
||||
<script>window.__BUILD='2026-07-08-batch57';console.log('%cBiz Connect','color:#1F3B73;font-weight:bold','build '+window.__BUILD);
|
||||
<script>window.__BUILD='2026-07-08-batch58';console.log('%cBiz Connect','color:#1F3B73;font-weight:bold','build '+window.__BUILD);
|
||||
// Render modern (Twemoji) emojis in place of the OS's flat ones. No-op if the CDN didn't load
|
||||
// (emojis stay as plain Unicode). (#5)
|
||||
function twemojify(el){ try{ if(el && window.twemoji) window.twemoji.parse(el, { folder:'svg', ext:'.svg' }); }catch(_){} }</script>
|
||||
@@ -1764,7 +1764,7 @@ function showCallInvite(room, byName, ret, sub){
|
||||
+'<button class="ci-join">'+ic('video',16)+' Join</button>'
|
||||
+'<button class="ci-decline" title="Decline">'+ic('callEnd',16)+' Decline</button>';
|
||||
document.body.appendChild(el);
|
||||
try{ notify('📞 '+who, (sub?('Group call · '+sub):'is calling you'), ret&&ret.kind, ret&&ret.id); }catch(_){} // OS notification too
|
||||
try{ notify('📞 '+who, (sub?('Group call · '+sub):'is calling you'), ret&&ret.kind, ret&&ret.id, {persistent:true}); }catch(_){} // OS notification too (stays until clicked/ended)
|
||||
let closed=false;
|
||||
const close=()=>{ if(closed) return; closed=true; try{ el.remove(); }catch(_){} stopRing(); };
|
||||
el.querySelector('.ci-join').onclick=()=>{ close(); meetReturn=ret||null; switchTab('meeting'); enterMeeting(room); };
|
||||
@@ -2344,13 +2344,14 @@ function onNotifClear(d){
|
||||
// Drop matching activity-center entries so the bell badge stays in sync.
|
||||
try{ if(Array.isArray(NOTIFS)){ const before=NOTIFS.length; NOTIFS=NOTIFS.filter(x=>!(x.link&&x.link.kind===d.kind&&x.link.id===d.id)); if(NOTIFS.length!==before){ saveNotifs&&saveNotifs(); updateBellBadge&&updateBellBadge(); } } }catch(_){}
|
||||
}
|
||||
function notify(title, body, kind, id){
|
||||
function notify(title, body, kind, id, opts){
|
||||
const persistent=!!(opts&&opts.persistent);
|
||||
try{
|
||||
// Desktop app: native toast with the sender/group DP. Pass the DP URL directly — the shell
|
||||
// downloads it for the icon (drawing an external DP to a canvas here tainted it → initials).
|
||||
if(window.bizConnectNative && window.bizConnectNative.replyNotify){
|
||||
const _av=(rowFor(kind,id)||{}).avatar||null;
|
||||
Promise.resolve(window.bizConnectNative.replyNotify({title, body, kind, id, avatar:_av}))
|
||||
Promise.resolve(window.bizConnectNative.replyNotify({title, body, kind, id, avatar:_av, persistent}))
|
||||
.then(r=>{ if(!r) return;
|
||||
if(r.text) sendReplyTo(kind, id, r.text); // replied from the toast
|
||||
else if(r.open) openFromNotif(kind, id); // clicked the toast
|
||||
|
||||
Reference in New Issue
Block a user