@wireai/activation 0.13.0 → 0.13.2

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.
Files changed (41) hide show
  1. package/AGENTS.md +3 -1
  2. package/CHANGELOG.md +116 -3
  3. package/README.md +82 -0
  4. package/dist/analytics/index.d.mts +2 -2
  5. package/dist/analytics/index.d.ts +2 -2
  6. package/dist/analytics/index.js +61 -2
  7. package/dist/analytics/index.js.map +1 -1
  8. package/dist/analytics/index.mjs +61 -2
  9. package/dist/analytics/index.mjs.map +1 -1
  10. package/dist/{currentSession-_GynvhzT.d.mts → currentSession-ClkLjcJ0.d.mts} +298 -13
  11. package/dist/{currentSession-D7zabMXK.d.ts → currentSession-DOVZEWJl.d.ts} +298 -13
  12. package/dist/index.d.mts +195 -4
  13. package/dist/index.d.ts +195 -4
  14. package/dist/index.js +909 -340
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +693 -145
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/questionnaire/index.js.map +1 -1
  19. package/dist/questionnaire/index.mjs.map +1 -1
  20. package/dist/reviews/index.js +12 -1
  21. package/dist/reviews/index.js.map +1 -1
  22. package/dist/reviews/index.mjs +12 -1
  23. package/dist/reviews/index.mjs.map +1 -1
  24. package/package.json +1 -1
  25. package/src/OnboardingFlow.tsx +131 -0
  26. package/src/WireOnboarding.tsx +63 -2
  27. package/src/analytics/analyticsEvent.ts +16 -1
  28. package/src/analytics/eventQueue.ts +2 -0
  29. package/src/analytics/reportClientEvent.ts +68 -12
  30. package/src/cards/PermissionCard.tsx +438 -0
  31. package/src/cards/index.ts +7 -0
  32. package/src/illustrations/defaultIllustrations.tsx +44 -3
  33. package/src/index.ts +38 -0
  34. package/src/permissions/index.ts +64 -0
  35. package/src/permissions/permissionCopy.ts +87 -0
  36. package/src/permissions/permissionEvents.ts +76 -0
  37. package/src/permissions/permissionMemory.ts +88 -0
  38. package/src/permissions/placement.ts +88 -0
  39. package/src/permissions/types.ts +131 -0
  40. package/src/session/persistedSession.ts +10 -3
  41. package/src/types.ts +66 -4
@@ -400,13 +400,24 @@ var init_Constants = __esm({
400
400
 
401
401
  // src/analytics/reportClientEvent.ts
402
402
  var makeSessionId = () => `wire_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
403
+ var toWireEvents = (events) => events.map((event) => {
404
+ if (typeof event.ts !== "number") return event;
405
+ const { ts, ...rest } = event;
406
+ if (!Number.isFinite(ts)) return rest;
407
+ try {
408
+ return { ...rest, ts: new Date(ts).toISOString() };
409
+ } catch {
410
+ return rest;
411
+ }
412
+ });
403
413
  var buildEventsRequest = (target, events) => {
404
414
  if (!(target == null ? void 0 : target.serverUrl) || events.length === 0) return null;
405
415
  try {
406
416
  const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
407
417
  const headers = { "Content-Type": "application/json" };
408
418
  if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
409
- return { url, init: { method: "POST", headers, body: JSON.stringify({ events }) } };
419
+ const body = JSON.stringify({ events: toWireEvents(events) });
420
+ return { url, init: { method: "POST", headers, body } };
410
421
  } catch {
411
422
  return null;
412
423
  }
@@ -418,7 +429,13 @@ var readEventsAck = async (res) => {
418
429
  const body = await Promise.resolve(json.call(res));
419
430
  const skipped = body == null ? void 0 : body.skipped;
420
431
  if (typeof skipped !== "number" || !Number.isFinite(skipped)) return void 0;
421
- const reasons = Array.isArray(body == null ? void 0 : body.errors) ? body.errors.map((e) => e == null ? void 0 : e.reason).filter((r) => typeof r === "string") : [];
432
+ const reasons = Array.isArray(body == null ? void 0 : body.errors) ? body.errors.map((e) => {
433
+ const entry = e;
434
+ const reason = entry == null ? void 0 : entry.reason;
435
+ if (typeof reason !== "string") return void 0;
436
+ const field = entry == null ? void 0 : entry.field;
437
+ return typeof field === "string" && field.length > 0 ? `${reason} (field: ${field})` : reason;
438
+ }).filter((r) => typeof r === "string") : [];
422
439
  return { written: typeof (body == null ? void 0 : body.written) === "number" ? body.written : void 0, skipped, reasons };
423
440
  } catch {
424
441
  return void 0;
@@ -596,6 +613,43 @@ var useScreenTracking = (navigationRef, options = {}) => {
596
613
  }, [navigationRef]);
597
614
  };
598
615
 
616
+ // src/permissions/permissionEvents.ts
617
+ var WIRE_PERMISSION_EVENTS = {
618
+ /** The priming screen became visible. The denominator for every rate below. */
619
+ screenShown: "wire_permission_screen_shown",
620
+ /** The user tapped the primary, so the OS dialog is about to open. The rationale worked. */
621
+ primerAccepted: "wire_permission_primer_accepted",
622
+ /** The OS granted it. */
623
+ granted: "wire_permission_granted",
624
+ /** The OS refused it (a permanently blocked answer reports here too, with `status: "blocked"`). */
625
+ denied: "wire_permission_denied",
626
+ /** The user took the secondary. The one native prompt was NOT spent. */
627
+ skipped: "wire_permission_skipped",
628
+ /** A blocked user was redirected to the OS settings page. */
629
+ settingsOpened: "wire_permission_settings_opened"
630
+ };
631
+ var permissionEventName = (stage) => {
632
+ switch (stage) {
633
+ case "shown":
634
+ return WIRE_PERMISSION_EVENTS.screenShown;
635
+ case "accepted":
636
+ return WIRE_PERMISSION_EVENTS.primerAccepted;
637
+ case "granted":
638
+ return WIRE_PERMISSION_EVENTS.granted;
639
+ case "denied":
640
+ return WIRE_PERMISSION_EVENTS.denied;
641
+ case "skipped":
642
+ return WIRE_PERMISSION_EVENTS.skipped;
643
+ case "settings":
644
+ return WIRE_PERMISSION_EVENTS.settingsOpened;
645
+ default: {
646
+ const _exhaustive = stage;
647
+ return _exhaustive;
648
+ }
649
+ }
650
+ };
651
+ var permissionEventProps = (permission, status) => status ? { permission, status } : { permission };
652
+
599
653
  // src/analytics/analyticsEvent.ts
600
654
  var WIRE_ONBOARDING_EVENTS = {
601
655
  started: "wire_onboarding_started",
@@ -628,6 +682,11 @@ var toAnalyticsEvent = (event) => {
628
682
  };
629
683
  case "fallback":
630
684
  return { name: WIRE_ONBOARDING_EVENTS.fallback, params: { reason: event.reason } };
685
+ case "permission":
686
+ return {
687
+ name: permissionEventName(event.stage),
688
+ params: permissionEventProps(event.permission, event.status)
689
+ };
631
690
  default: {
632
691
  const _exhaustive = event;
633
692
  return _exhaustive;