@wireai/activation 0.13.0 → 0.13.3

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 (82) hide show
  1. package/AGENTS.md +7 -4
  2. package/CHANGELOG.md +341 -4
  3. package/README.md +98 -2
  4. package/dist/analytics/index.d.mts +4 -4
  5. package/dist/analytics/index.d.ts +4 -4
  6. package/dist/analytics/index.js +164 -471
  7. package/dist/analytics/index.js.map +1 -1
  8. package/dist/analytics/index.mjs +162 -469
  9. package/dist/analytics/index.mjs.map +1 -1
  10. package/dist/coachmarks/index.d.mts +14 -1
  11. package/dist/coachmarks/index.d.ts +14 -1
  12. package/dist/coachmarks/index.js +58 -14
  13. package/dist/coachmarks/index.js.map +1 -1
  14. package/dist/coachmarks/index.mjs +58 -14
  15. package/dist/coachmarks/index.mjs.map +1 -1
  16. package/dist/{currentSession-_GynvhzT.d.mts → currentSession-BoWtr3Jp.d.mts} +299 -14
  17. package/dist/{currentSession-D7zabMXK.d.ts → currentSession-CCOMlaQ2.d.ts} +299 -14
  18. package/dist/{decision-Bl_M2y3r.d.mts → decision-Cjw0jbEj.d.mts} +1 -1
  19. package/dist/{decision-Cau5KmP6.d.ts → decision-GfpXAsk_.d.ts} +1 -1
  20. package/dist/index.d.mts +218 -4
  21. package/dist/index.d.ts +218 -4
  22. package/dist/index.js +1104 -888
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.mjs +887 -692
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/questionnaire/index.d.mts +42 -10
  27. package/dist/questionnaire/index.d.ts +42 -10
  28. package/dist/questionnaire/index.js +45 -13
  29. package/dist/questionnaire/index.js.map +1 -1
  30. package/dist/questionnaire/index.mjs +45 -13
  31. package/dist/questionnaire/index.mjs.map +1 -1
  32. package/dist/reviews/index.d.mts +4 -4
  33. package/dist/reviews/index.d.ts +4 -4
  34. package/dist/reviews/index.js +39 -8
  35. package/dist/reviews/index.js.map +1 -1
  36. package/dist/reviews/index.mjs +39 -8
  37. package/dist/reviews/index.mjs.map +1 -1
  38. package/dist/showcase/index.js +7 -2
  39. package/dist/showcase/index.js.map +1 -1
  40. package/dist/showcase/index.mjs +7 -2
  41. package/dist/showcase/index.mjs.map +1 -1
  42. package/dist/{transport-DsRe4epC.d.ts → transport-CefdERPs.d.mts} +44 -5
  43. package/dist/{transport-CF_eHwzC.d.mts → transport-DFuPyCoJ.d.ts} +44 -5
  44. package/dist/{types-Buj9Lw9t.d.ts → types-UVYt9BJe.d.ts} +41 -1
  45. package/dist/{types-CNUqMK0D.d.mts → types-l2tfg23P.d.mts} +41 -1
  46. package/package.json +4 -1
  47. package/src/OnboardingFlow.tsx +175 -15
  48. package/src/WireOnboarding.tsx +70 -8
  49. package/src/activation/wireActivation.ts +3 -3
  50. package/src/analytics/analyticsEvent.ts +16 -1
  51. package/src/analytics/analyticsFacade.ts +2 -2
  52. package/src/analytics/eventQueue.ts +85 -20
  53. package/src/analytics/reportClientEvent.ts +68 -12
  54. package/src/cards/CardGridSelectCard.tsx +1 -1
  55. package/src/cards/ChipSelectCard.tsx +2 -2
  56. package/src/cards/PermissionCard.tsx +438 -0
  57. package/src/cards/SelectionCard.tsx +1 -1
  58. package/src/cards/index.ts +7 -0
  59. package/src/coachmarks/runtime.ts +62 -2
  60. package/src/coachmarks/useCoachmarkTour.ts +62 -14
  61. package/src/context/deviceId.ts +4 -4
  62. package/src/features/WireFeaturesProvider.tsx +4 -1
  63. package/src/identity/userIdentity.ts +1 -1
  64. package/src/illustrations/defaultIllustrations.tsx +44 -3
  65. package/src/index.ts +38 -0
  66. package/src/permissions/index.ts +64 -0
  67. package/src/permissions/permissionCopy.ts +87 -0
  68. package/src/permissions/permissionEvents.ts +76 -0
  69. package/src/permissions/permissionMemory.ts +88 -0
  70. package/src/permissions/placement.ts +88 -0
  71. package/src/permissions/types.ts +131 -0
  72. package/src/questionnaire/QuestionnaireGate.tsx +90 -10
  73. package/src/questionnaire/index.ts +9 -1
  74. package/src/questionnaire/transport.ts +46 -11
  75. package/src/reviews/ReviewGate.tsx +61 -6
  76. package/src/reviews/index.ts +10 -1
  77. package/src/reviews/transport.ts +58 -12
  78. package/src/session/persistedSession.ts +10 -3
  79. package/src/session-analytics/useLifecycleEvents.ts +1 -1
  80. package/src/theme/ThemeContext.tsx +42 -1
  81. package/src/types.ts +66 -4
  82. package/src/utils/submitResult.ts +39 -0
@@ -1,10 +1,10 @@
1
1
  import React__default from 'react';
2
- import { R as ReviewGateProps, a as ReviewPresentation, U as UseReviewGateOptions, b as ReviewGateController, c as ReviewDecision, d as ReviewStoreConfig } from '../types-CNUqMK0D.mjs';
3
- export { e as RatingRoute, f as ReviewConfig, g as ReviewDecisionResponse, h as ReviewGateEvent, i as ReviewGateEventName, j as ReviewSubmission, k as ReviewTarget } from '../types-CNUqMK0D.mjs';
2
+ import { R as ReviewGateProps, a as ReviewPresentation, U as UseReviewGateOptions, b as ReviewGateController, c as ReviewDecision, d as ReviewStoreConfig } from '../types-l2tfg23P.mjs';
3
+ export { e as RatingRoute, f as ReviewConfig, g as ReviewDecisionResponse, h as ReviewGateEvent, i as ReviewGateEventName, j as ReviewSubmission, k as ReviewTarget, S as SubmitResult } from '../types-l2tfg23P.mjs';
4
4
  export { C as ReviewModal, a as ReviewModalHandle, b as ReviewModalProps } from '../CenteredModal-C3qQBHsA.mjs';
5
- export { G as GateRules, a as GateSignals, b as buildReviewSubmission, d as decideReview, e as evaluateGate, r as resolveRules, c as routeRating } from '../decision-Bl_M2y3r.mjs';
5
+ export { G as GateRules, a as GateSignals, b as buildReviewSubmission, d as decideReview, e as evaluateGate, r as resolveRules, c as routeRating } from '../decision-Cjw0jbEj.mjs';
6
6
  import { c as OnboardingFonts } from '../types-BKfpdZzX.mjs';
7
- export { F as FetchReviewDecisionOptions, R as ReportAppEventOptions, f as fetchReviewDecision, r as reportAppEvent, s as submitReview } from '../transport-CF_eHwzC.mjs';
7
+ export { F as FetchReviewDecisionOptions, R as ReportAppEventOptions, a as ReviewSubmitResult, f as fetchReviewDecision, r as reportAppEvent, s as submitReview } from '../transport-CefdERPs.mjs';
8
8
  import '../types-BcmagF6K.mjs';
9
9
  import '../types-CKFhyrMu.mjs';
10
10
 
@@ -1,10 +1,10 @@
1
1
  import React__default from 'react';
2
- import { R as ReviewGateProps, a as ReviewPresentation, U as UseReviewGateOptions, b as ReviewGateController, c as ReviewDecision, d as ReviewStoreConfig } from '../types-Buj9Lw9t.js';
3
- export { e as RatingRoute, f as ReviewConfig, g as ReviewDecisionResponse, h as ReviewGateEvent, i as ReviewGateEventName, j as ReviewSubmission, k as ReviewTarget } from '../types-Buj9Lw9t.js';
2
+ import { R as ReviewGateProps, a as ReviewPresentation, U as UseReviewGateOptions, b as ReviewGateController, c as ReviewDecision, d as ReviewStoreConfig } from '../types-UVYt9BJe.js';
3
+ export { e as RatingRoute, f as ReviewConfig, g as ReviewDecisionResponse, h as ReviewGateEvent, i as ReviewGateEventName, j as ReviewSubmission, k as ReviewTarget, S as SubmitResult } from '../types-UVYt9BJe.js';
4
4
  export { C as ReviewModal, a as ReviewModalHandle, b as ReviewModalProps } from '../CenteredModal-Cdgns6--.js';
5
- export { G as GateRules, a as GateSignals, b as buildReviewSubmission, d as decideReview, e as evaluateGate, r as resolveRules, c as routeRating } from '../decision-Cau5KmP6.js';
5
+ export { G as GateRules, a as GateSignals, b as buildReviewSubmission, d as decideReview, e as evaluateGate, r as resolveRules, c as routeRating } from '../decision-GfpXAsk_.js';
6
6
  import { c as OnboardingFonts } from '../types-BKfpdZzX.js';
7
- export { F as FetchReviewDecisionOptions, R as ReportAppEventOptions, f as fetchReviewDecision, r as reportAppEvent, s as submitReview } from '../transport-DsRe4epC.js';
7
+ export { F as FetchReviewDecisionOptions, R as ReportAppEventOptions, a as ReviewSubmitResult, f as fetchReviewDecision, r as reportAppEvent, s as submitReview } from '../transport-DFuPyCoJ.js';
8
8
  import '../types-BcmagF6K.js';
9
9
  import '../types-CKFhyrMu.js';
10
10
 
@@ -60,7 +60,12 @@ var defaultOnboardingTheme = {
60
60
  var mergeTheme = (override) => {
61
61
  return defaultOnboardingTheme;
62
62
  };
63
- var OnboardingThemeContext = React7.createContext(null);
63
+ var THEME_CONTEXT_SLOT = /* @__PURE__ */ Symbol.for("@wireai/activation:themeContext");
64
+ var themeGlobal = globalThis;
65
+ if (!themeGlobal[THEME_CONTEXT_SLOT]) {
66
+ themeGlobal[THEME_CONTEXT_SLOT] = React7.createContext(null);
67
+ }
68
+ var OnboardingThemeContext = themeGlobal[THEME_CONTEXT_SLOT];
64
69
  var useOnboardingTheme = () => {
65
70
  const ctx = React7.useContext(OnboardingThemeContext);
66
71
  return ctx != null ? ctx : mergeTheme();
@@ -737,13 +742,24 @@ var requestStoreReview = async (store) => {
737
742
 
738
743
  // src/analytics/reportClientEvent.ts
739
744
  var makeSessionId = () => `wire_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
745
+ var toWireEvents = (events) => events.map((event) => {
746
+ if (typeof event.ts !== "number") return event;
747
+ const { ts, ...rest } = event;
748
+ if (!Number.isFinite(ts)) return rest;
749
+ try {
750
+ return { ...rest, ts: new Date(ts).toISOString() };
751
+ } catch {
752
+ return rest;
753
+ }
754
+ });
740
755
  var buildEventsRequest = (target, events) => {
741
756
  if (!(target == null ? void 0 : target.serverUrl) || events.length === 0) return null;
742
757
  try {
743
758
  const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
744
759
  const headers = { "Content-Type": "application/json" };
745
760
  if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
746
- return { url, init: { method: "POST", headers, body: JSON.stringify({ events }) } };
761
+ const body = JSON.stringify({ events: toWireEvents(events) });
762
+ return { url, init: { method: "POST", headers, body } };
747
763
  } catch {
748
764
  return null;
749
765
  }
@@ -781,19 +797,21 @@ var ensureCurrentSessionId = () => {
781
797
  };
782
798
 
783
799
  // src/reviews/transport.ts
784
- var submitReview = (target, review) => {
785
- if (!(target == null ? void 0 : target.serverUrl)) return;
800
+ var submitReview = async (target, review) => {
801
+ if (!(target == null ? void 0 : target.serverUrl)) return "unsent";
786
802
  try {
787
803
  const url = `${target.serverUrl.replace(/\/$/, "")}/v1/reviews`;
788
804
  const headers = { "Content-Type": "application/json" };
789
805
  if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
790
- void fetch(url, {
806
+ const res = await fetch(url, {
791
807
  method: "POST",
792
808
  headers,
793
809
  body: JSON.stringify(review)
794
- }).catch(() => {
795
810
  });
811
+ if (!res) return "unsent";
812
+ return res.ok ? "accepted" : "rejected";
796
813
  } catch {
814
+ return "unsent";
797
815
  }
798
816
  };
799
817
  var fetchReviewDecision = async (target, options = {}) => {
@@ -882,17 +900,30 @@ var _ReviewGate = ({
882
900
  onResolved == null ? void 0 : onResolved();
883
901
  }, [onResolved]);
884
902
  const postedRef = React7__default.default.useRef(false);
903
+ const unackedRef = React7__default.default.useRef(null);
885
904
  const postOnce = React7.useCallback(
886
905
  (body) => {
887
906
  if (postedRef.current) return;
888
907
  postedRef.current = true;
889
- submitReview(target, body);
908
+ unackedRef.current = body;
909
+ void submitReview(target, body).then((result) => {
910
+ if (result === "unsent") {
911
+ postedRef.current = false;
912
+ return;
913
+ }
914
+ unackedRef.current = null;
915
+ });
890
916
  },
891
917
  [target]
892
918
  );
893
919
  const abandonRef = React7__default.default.useRef(() => {
894
920
  });
895
921
  abandonRef.current = () => {
922
+ const undelivered = unackedRef.current;
923
+ if (undelivered && !postedRef.current) {
924
+ postOnce(undelivered);
925
+ return;
926
+ }
896
927
  if (postedRef.current || stars < 1) return;
897
928
  postOnce(
898
929
  buildReviewSubmission({
@@ -1260,7 +1291,7 @@ var useWireFeatures = (config) => {
1260
1291
  return flags;
1261
1292
  };
1262
1293
  var CONTEXT_SYMBOL = /* @__PURE__ */ Symbol.for("wireai.features.context");
1263
- var globalObj = global;
1294
+ var globalObj = globalThis;
1264
1295
  if (!globalObj[CONTEXT_SYMBOL]) {
1265
1296
  globalObj[CONTEXT_SYMBOL] = React7.createContext(null);
1266
1297
  }