@unisim/sdk 0.157.0 → 0.158.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/dist/presence.js CHANGED
@@ -6,16 +6,18 @@
6
6
  // platform and counting guests. Bipolar Bear did the same on Firestore; this
7
7
  // is the Supabase version (migration 0175):
8
8
  //
9
- // * `app_presence_beat(product, install_id)` — this install is here. Called
10
- // when the app opens, on sign-in / sign-out, and every 45 s while visible.
9
+ // * `app_presence_beat(product, install_id, platform)` — this install is
10
+ // here. Called on the first INTERACTION on the web (see below), when a
11
+ // native app opens, on sign-in / sign-out, and every 45 s while visible.
11
12
  // Signed in, the server adds auth.uid() itself; nothing else is sent.
12
- // * `app_user_counts(product)` — `{ total, live }`. "Live" is a beat within
13
- // two minutes. The dedupe rules (an account is one person across devices;
14
- // a guest install somebody signed in on is that account) live in SQL.
15
- // * `suite_user_counts()` — the same two numbers across every product
13
+ // * `app_user_counts(product)` — `{ total, live, web, native }`. "Live" is a
14
+ // beat within two minutes. The dedupe rules (an account is one person
15
+ // across devices; a guest install somebody signed in on is that account)
16
+ // live in SQL.
17
+ // * `suite_user_counts()` — the same figures across every product
16
18
  // (migration 0177), which the line switches to when tapped. An account is
17
19
  // one person suite-wide; a guest is one person per browser origin.
18
- // * `suite_user_counts_by_product()` — the same two numbers PER product
20
+ // * `suite_user_counts_by_product()` — the same figures PER product
19
21
  // (migration 0184), which the line shows in a popup on a long press. The
20
22
  // rows deliberately do not add up to the suite total: one account using
21
23
  // four apps is four rows here and one person there.
@@ -23,11 +25,35 @@
23
25
  // The install id is a random UUID in this origin's localStorage, so web,
24
26
  // Capacitor and Electron all get one with no native code.
25
27
  //
28
+ // ── Web counts from an INTERACTION, not a page load (0.158.0) ────────────────
29
+ // James, 2026-09-21: "I also want the web count to be from the point of an
30
+ // interaction and not just a page load if possible". So on the web the first
31
+ // beat waits for a pointer, key, touch, wheel or scroll event — a visitor who
32
+ // lands and leaves without touching anything is not a user of the app, and
33
+ // used to be one. In an installed app (Capacitor, Electron) the beat goes at
34
+ // once: somebody chose that icon and waited for it to open, which is a good
35
+ // deal more deliberate than arriving at a URL.
36
+ //
37
+ // ⚠️ The "has interacted" flag is per PAGE, not per call — `startPresence` is
38
+ // restarted whenever the account changes, and a signed-in person who has
39
+ // already clicked must not be made to click again to keep counting.
40
+ //
41
+ // ── web / native (0.158.0, migration 0187) ───────────────────────────────────
42
+ // Each beat says which kind of device it came from, and the count functions
43
+ // put each PERSON in one bucket — the platform of their most recent beat — so
44
+ // web + native is at most the total rather than counting a phone-and-laptop
45
+ // person twice. Anyone last seen before 0.158.0 shipped is in neither bucket,
46
+ // so the two can add up to less than the total; the popup's "How we count a
47
+ // user" fold says so. `null` means the figure is not available at all: an
48
+ // older database, or a row whose total comes from an app's own account count
49
+ // (migration 0185).
50
+ //
26
51
  // ⚠️ Nothing React in this file, on purpose: Universal AI (Svelte) and Universal
27
52
  // Family (no <UniversalProvider>) call these directly. The provider starts
28
53
  // presence for every other app — see `presence` in UniversalConfig.
29
54
  // ──────────────────────────────────────────────────────────────────────────────
30
55
  import { t } from './i18n.js';
56
+ import { capacitorPlatform, isNativeShell } from './sessionStorage.js';
31
57
  /** localStorage key holding this install's random id. */
32
58
  export const INSTALL_ID_KEY = 'unisim:install-id';
33
59
  /** How often an open, visible app beats. Well inside the server's 2-min window. */
@@ -82,6 +108,131 @@ export function getInstallId() {
82
108
  return memoryInstallId;
83
109
  }
84
110
  }
111
+ // ── Which kind of device this is ─────────────────────────────────────────────
112
+ /**
113
+ * True in anything the person INSTALLED — a Capacitor container or an Electron
114
+ * desktop build — as opposed to a page they navigated to.
115
+ *
116
+ * This is what decides that the beat goes immediately rather than waiting for
117
+ * an interaction, so it deliberately errs towards "no": a browser wrongly
118
+ * treated as an app would put page loads back in the total, which is the whole
119
+ * thing this release takes out.
120
+ *
121
+ * ⚠️ Electron is read off `navigator.userAgent` and the preload bridge rather
122
+ * than imported from `desktop.ts`, which pulls React in — and this file has
123
+ * none on purpose (Universal AI is Svelte).
124
+ */
125
+ export function isInstalledApp() {
126
+ if (isNativeShell())
127
+ return true;
128
+ if (typeof window === 'undefined')
129
+ return false;
130
+ const w = window;
131
+ if (w.unisimDesktop && typeof w.unisimDesktop.openHub === 'function')
132
+ return true;
133
+ const ua = typeof navigator === 'undefined' ? '' : navigator.userAgent ?? '';
134
+ return / Electron\//.test(ua);
135
+ }
136
+ /** Windows / macOS / Linux for a desktop build, or null if it cannot be told. */
137
+ function desktopOs() {
138
+ if (typeof navigator === 'undefined')
139
+ return null;
140
+ // `userAgentData.platform` is the one that survives the user-agent reduction
141
+ // Chromium has been rolling out; the string is the fallback, not the source.
142
+ const hinted = navigator
143
+ .userAgentData?.platform ?? '';
144
+ const ua = `${hinted} ${navigator.userAgent ?? ''}`;
145
+ if (/win/i.test(ua))
146
+ return 'windows';
147
+ if (/mac/i.test(ua))
148
+ return 'macos';
149
+ if (/linux|x11|cros/i.test(ua))
150
+ return 'linux';
151
+ return null;
152
+ }
153
+ /**
154
+ * What this install reports itself as to `app_presence_beat`.
155
+ *
156
+ * ⚠️ An installed app that cannot name its OS answers `null`, NOT `'web'`.
157
+ * Migration 0187 keeps the platform an earlier beat established when a beat
158
+ * says nothing, so an unknown is a missed chance to record rather than a wrong
159
+ * record — and a desktop app quietly filed under "web" is the exact figure
160
+ * this feature exists to get right.
161
+ */
162
+ export function devicePlatform() {
163
+ if (typeof window === 'undefined')
164
+ return null;
165
+ if (isNativeShell())
166
+ return capacitorPlatform();
167
+ if (isInstalledApp())
168
+ return desktopOs();
169
+ return 'web';
170
+ }
171
+ // ── "Interacted with" — the gate in front of the first beat on the web ───────
172
+ /**
173
+ * What counts as the person doing something. A scroll and a wheel are in the
174
+ * list on purpose: reading a page IS using it, and a reader who never clicks
175
+ * is not the drive-by this gate is meant to drop.
176
+ */
177
+ export const INTERACTION_EVENTS = ['pointerdown', 'keydown', 'touchstart', 'wheel', 'scroll'];
178
+ let interacted = false;
179
+ let interactionArmed = false;
180
+ const interactionWaiters = new Set();
181
+ function noteInteraction() {
182
+ if (interacted)
183
+ return;
184
+ interacted = true;
185
+ disarmInteraction();
186
+ const waiting = [...interactionWaiters];
187
+ interactionWaiters.clear();
188
+ for (const run of waiting)
189
+ run();
190
+ }
191
+ function armInteraction() {
192
+ if (interactionArmed || typeof window === 'undefined')
193
+ return;
194
+ interactionArmed = true;
195
+ // Capture, so a press inside a component that stops propagation still counts;
196
+ // passive, so nothing here can hold up a scroll.
197
+ for (const type of INTERACTION_EVENTS) {
198
+ window.addEventListener(type, noteInteraction, { capture: true, passive: true });
199
+ }
200
+ }
201
+ function disarmInteraction() {
202
+ if (!interactionArmed)
203
+ return;
204
+ interactionArmed = false;
205
+ for (const type of INTERACTION_EVENTS) {
206
+ window.removeEventListener(type, noteInteraction, true);
207
+ }
208
+ }
209
+ /** Whether this page has seen a real interaction yet. Exported for tests and
210
+ * for an app that wants to hold something else back on the same rule. */
211
+ export function hasInteracted() {
212
+ return interacted;
213
+ }
214
+ /**
215
+ * Run `fn` on the first interaction — or straight away if one has already
216
+ * happened on this page. Returns a function that cancels the wait.
217
+ *
218
+ * ⚠️ The flag is module-level, so an app that restarts presence (signing in
219
+ * does) does not put the gate back in front of somebody who has been clicking
220
+ * for ten minutes.
221
+ */
222
+ export function onFirstInteraction(fn) {
223
+ if (interacted || typeof window === 'undefined') {
224
+ if (interacted)
225
+ fn();
226
+ return () => { };
227
+ }
228
+ interactionWaiters.add(fn);
229
+ armInteraction();
230
+ return () => {
231
+ interactionWaiters.delete(fn);
232
+ if (interactionWaiters.size === 0)
233
+ disarmInteraction();
234
+ };
235
+ }
85
236
  // The most recent beat per product. fetchUserCounts waits for it, so the first
86
237
  // read after opening the app already includes the person reading it.
87
238
  const pendingBeat = new Map();
@@ -94,16 +245,57 @@ function warnOnce(what, err) {
94
245
  warned = true;
95
246
  console.warn(`[unisim/sdk] user count: ${what} failed (not retried loudly)`, err);
96
247
  }
97
- /** Report this install as here now. Never throws; resolves whether it landed. */
248
+ /**
249
+ * ⚠️ **The one ordering hazard in this release.** PostgREST resolves an RPC by
250
+ * its ARGUMENT NAMES, so sending `p_platform` to a database that has not had
251
+ * migration 0187 applied is not ignored — it is "function not found", and every
252
+ * beat fails. The SDK ships to npm and reaches apps on their own schedule,
253
+ * which is exactly the window where that can happen, so a beat refused for that
254
+ * reason is retried WITHOUT the platform and the argument is dropped for the
255
+ * rest of the page. The count keeps growing; it simply records no platform
256
+ * until the migration lands, which is the same state every pre-0187 row is in.
257
+ *
258
+ * `null` while nothing has been refused — the check is only worth making once.
259
+ */
260
+ let sendPlatform = null;
261
+ /** PostgREST's "no function with these arguments", and Postgres' own. */
262
+ function isUnknownFunction(error) {
263
+ const code = error?.code;
264
+ return code === 'PGRST202' || code === '42883';
265
+ }
266
+ /**
267
+ * Report this install as here now. Never throws; resolves whether it landed.
268
+ */
98
269
  export function beatPresence(supabase, product) {
99
270
  const installId = getInstallId();
100
271
  if (!installId || typeof supabase?.rpc !== 'function')
101
272
  return Promise.resolve(false);
102
- const p = Promise.resolve(supabase.rpc('app_presence_beat', { p_product: product, p_install_id: installId })).then(({ error }) => {
273
+ const base = { p_product: product, p_install_id: installId };
274
+ const platform = devicePlatform();
275
+ // Left out, rather than sent as null, when this install cannot name itself:
276
+ // 0187 keeps whatever platform an earlier beat established, so saying nothing
277
+ // costs a record and never erases one.
278
+ const withPlatform = platform !== null && sendPlatform !== false;
279
+ const send = (args) => Promise.resolve(supabase.rpc('app_presence_beat', args));
280
+ const p = send(withPlatform ? { ...base, p_platform: platform } : base)
281
+ .then(async ({ error }) => {
282
+ if (error && withPlatform && isUnknownFunction(error)) {
283
+ // A database on 0175–0185. Say it once, drop the argument, carry on.
284
+ sendPlatform = false;
285
+ const retry = await send(base);
286
+ if (retry.error) {
287
+ warnOnce('presence beat', retry.error);
288
+ return false;
289
+ }
290
+ beatLanded.add(product);
291
+ return true;
292
+ }
103
293
  if (error) {
104
294
  warnOnce('presence beat', error);
105
295
  return false;
106
296
  }
297
+ if (withPlatform)
298
+ sendPlatform = true;
107
299
  beatLanded.add(product);
108
300
  return true;
109
301
  }, (err) => { warnOnce('presence beat', err); return false; });
@@ -111,46 +303,77 @@ export function beatPresence(supabase, product) {
111
303
  return p;
112
304
  }
113
305
  /**
114
- * Beat now, then every {@link PRESENCE_BEAT_MS} while the page is visible, and
115
- * straight away when it becomes visible again. Returns a stop function.
306
+ * Beat now — or, on the web, at the first interaction — then every
307
+ * {@link PRESENCE_BEAT_MS} while the page is visible, and straight away when it
308
+ * becomes visible again. Returns a stop function.
116
309
  *
117
310
  * A hidden page does not beat: a backgrounded tab is not someone using the app,
118
311
  * and it drops out of "live" within two minutes on its own.
119
312
  */
120
- export function startPresence(supabase, product) {
313
+ export function startPresence(supabase, product, options = {}) {
121
314
  if (typeof window === 'undefined')
122
315
  return () => { };
123
316
  const hidden = () => typeof document !== 'undefined' && document.visibilityState === 'hidden';
124
317
  const tick = () => { if (!hidden())
125
318
  void beatPresence(supabase, product); };
126
- tick();
127
- const timer = window.setInterval(tick, PRESENCE_BEAT_MS);
128
319
  const onVisible = () => { if (!hidden())
129
320
  tick(); };
130
- document.addEventListener('visibilitychange', onVisible);
321
+ let timer = null;
322
+ const begin = () => {
323
+ if (timer !== null)
324
+ return;
325
+ tick();
326
+ timer = window.setInterval(tick, PRESENCE_BEAT_MS);
327
+ document.addEventListener('visibilitychange', onVisible);
328
+ };
329
+ // An installed app was opened on purpose; a web page has to be touched first.
330
+ const wait = options.requireInteraction === false || isInstalledApp()
331
+ ? (begin(), () => { })
332
+ : onFirstInteraction(begin);
131
333
  return () => {
132
- window.clearInterval(timer);
334
+ wait();
335
+ if (timer !== null) {
336
+ window.clearInterval(timer);
337
+ timer = null;
338
+ }
133
339
  document.removeEventListener('visibilitychange', onVisible);
134
340
  };
135
341
  }
342
+ /** A `{ total, live, web, native }` out of anything, or null. The two splits
343
+ * are `null` rather than 0 when absent: 0 is a claim ("nobody is on the web"),
344
+ * null is the absence of one. */
345
+ function readCounts(row) {
346
+ const r = row;
347
+ const total = Number(r?.total);
348
+ const live = Number(r?.live);
349
+ if (!Number.isFinite(total) || !Number.isFinite(live))
350
+ return null;
351
+ return { total, live, web: optionalCount(r?.web), native: optionalCount(r?.native) };
352
+ }
353
+ function optionalCount(value) {
354
+ if (value === null || value === undefined)
355
+ return null;
356
+ const n = Number(value);
357
+ return Number.isFinite(n) ? n : null;
358
+ }
136
359
  /** The last counts this origin read for `product` (or, with 'suite', for the
137
360
  * whole suite), or null. */
138
361
  export function cachedUserCounts(product) {
139
362
  if (typeof window === 'undefined')
140
363
  return null;
141
364
  try {
142
- const raw = JSON.parse(window.localStorage.getItem(countsKey(product)) ?? 'null');
143
- if (raw && Number.isFinite(raw.total) && Number.isFinite(raw.live)) {
144
- return { total: raw.total, live: raw.live };
145
- }
365
+ // ⚠️ An entry written before 0.158.0 has no web/native in it. readCounts
366
+ // answers null for both rather than 0, so the cached figure paints without
367
+ // a split and gains one when the fresh read lands.
368
+ return readCounts(JSON.parse(window.localStorage.getItem(countsKey(product)) ?? 'null'));
146
369
  }
147
370
  catch { /* ignore */ }
148
371
  return null;
149
372
  }
150
373
  /**
151
- * Read `{ total, live }` for `product`. Waits (up to 3 s) for this page's
152
- * pending beat so the reader is in the figure. Resolves null on any failure —
153
- * the caller hides its line rather than showing a wrong number.
374
+ * Read `{ total, live, web, native }` for `product`. Waits (up to 3 s) for this
375
+ * page's pending beat so the reader is in the figure. Resolves null on any
376
+ * failure — the caller hides its line rather than showing a wrong number.
154
377
  */
155
378
  export async function fetchUserCounts(supabase, product, scope = 'app') {
156
379
  if (typeof supabase?.rpc !== 'function')
@@ -166,15 +389,17 @@ export async function fetchUserCounts(supabase, product, scope = 'app') {
166
389
  warnOnce('count read', error);
167
390
  return null;
168
391
  }
169
- const row = (Array.isArray(data) ? data[0] : data);
170
- const total = Number(row?.total);
171
- const live = Number(row?.live);
172
- if (!Number.isFinite(total) || !Number.isFinite(live))
392
+ const read = readCounts(Array.isArray(data) ? data[0] : data);
393
+ if (!read)
173
394
  return null;
174
395
  // Somebody is reading this, and if their beat landed they are live — a
175
396
  // count that raced the beat must not tell them "(0 live)".
176
397
  const self = beatLanded.has(product) ? 1 : 0;
177
- const counts = { live: Math.max(live, self), total: Math.max(total, live, self) };
398
+ const counts = {
399
+ ...read,
400
+ live: Math.max(read.live, self),
401
+ total: Math.max(read.total, read.live, self),
402
+ };
178
403
  try {
179
404
  window.localStorage.setItem(countsKey(scope === 'suite' ? 'suite' : product), JSON.stringify(counts));
180
405
  }
@@ -194,19 +419,26 @@ export function cachedUserCountsByProduct() {
194
419
  return null;
195
420
  try {
196
421
  const raw = JSON.parse(window.localStorage.getItem(BREAKDOWN_KEY) ?? 'null');
197
- const rows = Array.isArray(raw) ? raw.filter(isProductCounts) : [];
422
+ const rows = Array.isArray(raw) ? raw.map(asProductCounts).filter(isRow) : [];
198
423
  return rows.length > 0 ? rows : null;
199
424
  }
200
425
  catch { /* ignore */ }
201
426
  return null;
202
427
  }
203
- function isProductCounts(row) {
204
- const r = row;
205
- return !!r && typeof r.product === 'string' && Number.isFinite(r.total) && Number.isFinite(r.live);
428
+ function isRow(row) {
429
+ return row !== null;
430
+ }
431
+ function asProductCounts(row) {
432
+ const product = row?.product;
433
+ if (typeof product !== 'string')
434
+ return null;
435
+ const counts = readCounts(row);
436
+ return counts ? { product, ...counts } : null;
206
437
  }
207
438
  /**
208
- * `{ product, total, live }` for every product anybody has ever opened, biggest
209
- * first — the breakdown behind the suite figure (migration 0184).
439
+ * `{ product, total, live, web, native }` for every product anybody has ever
440
+ * opened, biggest first — the breakdown behind the suite figure (migration
441
+ * 0184).
210
442
  *
211
443
  * Resolves null on any failure, exactly like {@link fetchUserCounts}, so a
212
444
  * caller shows nothing rather than a wrong number. ⚠️ **That includes an app
@@ -218,6 +450,11 @@ function isProductCounts(row) {
218
450
  * ⚠️ The rows do NOT sum to `fetchUserCounts(_, _, 'suite').total`: an account
219
451
  * using four apps is four rows here and one person there. Never add them up to
220
452
  * produce a total — the suite figure is the total.
453
+ *
454
+ * ⚠️ `web`/`native` are null on a row whose total comes from that app's own
455
+ * account counter (migration 0185, the Bipolar apps): the counter has no
456
+ * platform in it, so a split beside it would describe a different, smaller
457
+ * population than the total next to it.
221
458
  */
222
459
  export async function fetchUserCountsByProduct(supabase) {
223
460
  if (typeof supabase?.rpc !== 'function')
@@ -231,12 +468,9 @@ export async function fetchUserCountsByProduct(supabase) {
231
468
  const rows = (Array.isArray(data) ? data : []);
232
469
  const counts = [];
233
470
  for (const row of rows) {
234
- const product = typeof row?.product === 'string' ? row.product : null;
235
- const total = Number(row?.total);
236
- const live = Number(row?.live);
237
- if (!product || !Number.isFinite(total) || !Number.isFinite(live))
238
- continue;
239
- counts.push({ product, total, live });
471
+ const parsed = asProductCounts(row);
472
+ if (parsed)
473
+ counts.push(parsed);
240
474
  }
241
475
  if (counts.length === 0)
242
476
  return null;
@@ -260,13 +494,7 @@ export async function fetchUserCountsByProduct(supabase) {
260
494
  * with the numbers grouped the way that language groups them.
261
495
  */
262
496
  export function formatUserCounts(language, counts, scope = 'app') {
263
- let nf;
264
- try {
265
- nf = new Intl.NumberFormat(language ?? undefined);
266
- }
267
- catch {
268
- nf = new Intl.NumberFormat('en');
269
- }
497
+ const nf = numberFormat(language);
270
498
  const one = counts.total === 1;
271
499
  const key = scope === 'suite'
272
500
  ? (one ? 'users.suite_one' : 'users.suite_other')
@@ -275,4 +503,31 @@ export function formatUserCounts(language, counts, scope = 'app') {
275
503
  .replace('{total}', nf.format(counts.total))
276
504
  .replace('{live}', nf.format(counts.live));
277
505
  }
506
+ /**
507
+ * The figures behind one row of the breakdown, as separate phrases — "1,234
508
+ * users", "900 web", "334 native", "5 live" — so the caller can lay them out
509
+ * and let them WRAP rather than measuring a single string (James, 2026-09-21:
510
+ * "show web | native | live if there's enough space").
511
+ *
512
+ * The split is left out entirely when it is not available, rather than shown as
513
+ * "0 web · 0 native": see {@link UserCounts.web}.
514
+ */
515
+ export function userCountParts(language, counts) {
516
+ const nf = numberFormat(language);
517
+ const say = (key, n) => t(language, key).replace('{n}', nf.format(n));
518
+ const parts = [say(counts.total === 1 ? 'users.part_total_one' : 'users.part_total', counts.total)];
519
+ if (typeof counts.web === 'number' && typeof counts.native === 'number') {
520
+ parts.push(say('users.part_web', counts.web), say('users.part_native', counts.native));
521
+ }
522
+ parts.push(say('users.part_live', counts.live));
523
+ return parts;
524
+ }
525
+ function numberFormat(language) {
526
+ try {
527
+ return new Intl.NumberFormat(language ?? undefined);
528
+ }
529
+ catch {
530
+ return new Intl.NumberFormat('en');
531
+ }
532
+ }
278
533
  //# sourceMappingURL=presence.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"presence.js","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { type ReactNode } from 'react';
3
3
  import type { ProductCode } from './types.js';
4
4
  import { type Language } from './i18n.js';
5
5
  import { type RevealOnExpandOptions } from './revealOnExpand.js';
6
+ import { type PresenceOptions } from './presence.js';
6
7
  import type { ThemePref } from './themeStore.js';
7
8
  export interface UniversalConfig {
8
9
  supabaseUrl: string;
@@ -67,8 +68,14 @@ export interface UniversalConfig {
67
68
  * in the navbar menu (see presence.ts). ON for every product unless set to
68
69
  * false; skipped anyway in mockAuth mode, with no `supabaseUrl`, and on the
69
70
  * hubs (`central`). Guests beat too — the figure counts everyone.
71
+ *
72
+ * ⚠️ Since 0.158.0 a WEB app reports itself only once the person interacts
73
+ * with the page — a load on its own is not somebody using the app. Pass
74
+ * `{ requireInteraction: false }` for a surface that is watched rather than
75
+ * touched (a wall display, a kiosk). An installed app never waits: opening it
76
+ * is the interaction.
70
77
  */
71
- presence?: boolean;
78
+ presence?: boolean | PresenceOptions;
72
79
  }
73
80
  interface UniversalContextValue {
74
81
  config: UniversalConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
package/dist/provider.js CHANGED
@@ -274,11 +274,17 @@ export function UniversalProvider({ config, children }) {
274
274
  // guest) rather than up to 45 s later.
275
275
  const presenceUser = session?.user?.id ?? null;
276
276
  const presenceOn = config.presence !== false && !mockActive && !!config.supabaseUrl && config.product !== 'central';
277
+ // Serialised for the same reason `revealOnExpand` is: a product writing the
278
+ // options inline hands a new object every render, and depending on it by
279
+ // identity would tear presence down and restart it on each one — which, with
280
+ // the interaction gate in front of the first beat, would also mean beating
281
+ // twice for one person.
282
+ const presenceKey = typeof config.presence === 'object' ? JSON.stringify(config.presence) : '';
277
283
  useEffect(() => {
278
284
  if (!presenceOn)
279
285
  return;
280
- return startPresence(supabase, config.product);
281
- }, [presenceOn, supabase, config.product, presenceUser]);
286
+ return startPresence(supabase, config.product, presenceKey ? JSON.parse(presenceKey) : undefined);
287
+ }, [presenceOn, supabase, config.product, presenceUser, presenceKey]);
282
288
  const [activeOrgId, setActiveOrgIdState] = useState(() => {
283
289
  if (typeof window === 'undefined')
284
290
  return null;