feat(auth): merge mobile+email logins into one account via BizGaze person-id (#2)

Provisioning now keys the Biz Connect account on bz.bizgazeUserId (the same
value whether the person signs in with email or mobile) instead of the typed
identifier, so both logins resolve to a single contact. Legacy rows get the
person-id stamped on next login; an existing duplicate created under the same
identifier is folded in via a transactional users.mergeInto() that reassigns
all messages/memberships/reactions/votes/favorites/ownership to the survivor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 12:35:29 +05:30
parent 88e897cc9c
commit 04db586dc3
11 changed files with 120 additions and 3 deletions
+24
View File
@@ -0,0 +1,24 @@
# Biz Connect — master assets for VS Claude
Three masters, exactly as requested. Regenerate/wire everything from these.
## 1. App icon → app-icon-1024.png
- 1024×1024, full-bleed solid brand-blue square (no baked-in rounded corners), C mark
centred with safe padding. Use as the single source to regenerate:
Windows `.ico` (multi-size — fixes the tiny/blurry taskbar icon), PWA icons
(192, 512, maskable), apple-touch-icon, favicon, and the Android/iOS mobile icons.
## 2. Splash → splash-2732-dark.png (primary) · splash-2732-light.png (optional)
- 2732×2732. Dark = brand blue (use this everywhere by default). Light = white background
variant if you support a light theme. Use for the desktop/web launch and the mobile
native splash. (Native launch screens should stay static — no animation.)
## 3. Loader → animated SVG (pick per context)
- loader-ring.svg default everyday spinner, for LIGHT backgrounds (blue track + yellow arc)
- loader-orbit.svg branded spinner (the C with a circling dot), LIGHT backgrounds
- loader-orbit-dark.svg same branded spinner for DARK/overlay backgrounds (white C)
Recommended: use loader-ring.svg as the standard "Loading…" and in-app spinner; use
loader-orbit(-dark).svg for the hero "Connecting…" moment. SVG is animated, tiny, scalable.
## Brand
Blue #1F3B73 · Blue-dark #16294F · Yellow #FFC708 · (deeper gold #E0AC00 for "Connect" on white)
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="64" height="64" role="img" aria-label="Loading">
<circle cx="50" cy="50" r="34" fill="none" stroke="#ffffff" stroke-width="9" stroke-linecap="round" stroke-dasharray="165 300" transform="rotate(38 50 50)"/>
<g><circle cx="84" cy="50" r="7" fill="#FFC708"/>
<animateTransform attributeName="transform" type="rotate" from="0 50 50" to="360 50 50" dur="1.1s" repeatCount="indefinite"/></g>
</svg>

After

Width:  |  Height:  |  Size: 471 B

+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="64" height="64" role="img" aria-label="Loading">
<circle cx="50" cy="50" r="34" fill="none" stroke="#1F3B73" stroke-width="9" stroke-linecap="round" stroke-dasharray="165 300" transform="rotate(38 50 50)"/>
<g><circle cx="84" cy="50" r="7" fill="#FFC708"/>
<animateTransform attributeName="transform" type="rotate" from="0 50 50" to="360 50 50" dur="1.1s" repeatCount="indefinite"/></g>
</svg>

After

Width:  |  Height:  |  Size: 471 B

+6
View File
@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50" height="50" role="img" aria-label="Loading">
<circle cx="25" cy="25" r="20" fill="none" stroke="#1F3B73" stroke-opacity="0.16" stroke-width="5"/>
<path fill="none" stroke="#FFC708" stroke-width="5" stroke-linecap="round" d="M25 5 A20 20 0 0 1 45 25">
<animateTransform attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.8s" repeatCount="indefinite"/>
</path>
</svg>

After

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB