feat(chat): emoji speed, action rework, copy, phone links, image zoom, upload %, profile card, last seen (batch82)
#6 Emoji were slow because Twemoji swapped EVERY emoji for an <img> fetched individually from a CDN — opening the picker fired hundreds of image requests. Now uses the OS's own colour emoji font: instant, zero network. twemojify() kept as a no-op. #4 Message hover row reworked: three one-tap reactions (Like/Laugh/Surprised) + the emoji picker + (own) Edit. Reply / Forward / Copy / Delete moved behind a ⋮ menu. Added Copy. The row now sits FULLY above the bubble (was top:-14px, overlapping the first text line). #9 Phone numbers linkify to tel: — mobile gets the OS "call this number?" prompt; desktop has no dialer so it offers to copy. Regex kept conservative (10–15 digits, needs +/grouping) so it won't grab amounts, dates or 6-digit meeting codes. #3 Image preview zooms: wheel + pinch + double-click + ± buttons, drag to pan, keys (+/-/0), cursor-anchored. Arrows hide while zoomed so panning isn't hijacked. #8 Upload progress: fetch() can't report upload progress at all, so a large file just said "uploading…". Switched to XHR (upload.onprogress) → real bar + %, and cancel aborts in flight. #1 Clicking a sender in a group opens a mini profile card (photo, presence, last seen) with a Message button that opens the 1:1 (and a view-photo button). #2 Last seen: new users.last_seen column, stamped on connect and when the last socket drops; carried on the presence broadcast, so an offline contact reads "Last seen 10 minutes ago" instead of a bare "Offline". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -225,6 +225,9 @@ try { db.exec("ALTER TABLE users ADD COLUMN status TEXT NOT NULL DEFAULT 'active
|
||||
// their mobile number, so this — not the typed login identifier — is the stable identity key.
|
||||
// Provisioning matches on it to keep one Biz Connect account per person (#2 account merge).
|
||||
try { db.exec('ALTER TABLE users ADD COLUMN bizgaze_user_id TEXT'); } catch (e) { /* exists */ }
|
||||
// #2: when this user was last connected (stamped on connect + on their last socket closing), so contacts
|
||||
// can show "last seen 10 minutes ago" instead of a bare "Offline".
|
||||
try { db.exec('ALTER TABLE users ADD COLUMN last_seen INTEGER'); } catch (e) { /* exists */ }
|
||||
// External (non-Connect) invitee emails on a scheduled meeting (#4) — JSON array. They get an emailed
|
||||
// guest join link instead of an in-app invite.
|
||||
try { db.exec('ALTER TABLE scheduled_meetings ADD COLUMN guest_emails TEXT'); } catch (e) { /* exists */ }
|
||||
|
||||
Reference in New Issue
Block a user