@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
@@ -54,7 +54,12 @@ var defaultOnboardingTheme = {
54
54
  var mergeTheme = (override) => {
55
55
  return defaultOnboardingTheme;
56
56
  };
57
- var OnboardingThemeContext = createContext(null);
57
+ var THEME_CONTEXT_SLOT = /* @__PURE__ */ Symbol.for("@wireai/activation:themeContext");
58
+ var themeGlobal = globalThis;
59
+ if (!themeGlobal[THEME_CONTEXT_SLOT]) {
60
+ themeGlobal[THEME_CONTEXT_SLOT] = createContext(null);
61
+ }
62
+ var OnboardingThemeContext = themeGlobal[THEME_CONTEXT_SLOT];
58
63
  var useOnboardingTheme = () => {
59
64
  const ctx = useContext(OnboardingThemeContext);
60
65
  return ctx != null ? ctx : mergeTheme();
@@ -731,13 +736,24 @@ var requestStoreReview = async (store) => {
731
736
 
732
737
  // src/analytics/reportClientEvent.ts
733
738
  var makeSessionId = () => `wire_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
739
+ var toWireEvents = (events) => events.map((event) => {
740
+ if (typeof event.ts !== "number") return event;
741
+ const { ts, ...rest } = event;
742
+ if (!Number.isFinite(ts)) return rest;
743
+ try {
744
+ return { ...rest, ts: new Date(ts).toISOString() };
745
+ } catch {
746
+ return rest;
747
+ }
748
+ });
734
749
  var buildEventsRequest = (target, events) => {
735
750
  if (!(target == null ? void 0 : target.serverUrl) || events.length === 0) return null;
736
751
  try {
737
752
  const url = `${target.serverUrl.replace(/\/$/, "")}/v1/events`;
738
753
  const headers = { "Content-Type": "application/json" };
739
754
  if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
740
- return { url, init: { method: "POST", headers, body: JSON.stringify({ events }) } };
755
+ const body = JSON.stringify({ events: toWireEvents(events) });
756
+ return { url, init: { method: "POST", headers, body } };
741
757
  } catch {
742
758
  return null;
743
759
  }
@@ -775,19 +791,21 @@ var ensureCurrentSessionId = () => {
775
791
  };
776
792
 
777
793
  // src/reviews/transport.ts
778
- var submitReview = (target, review) => {
779
- if (!(target == null ? void 0 : target.serverUrl)) return;
794
+ var submitReview = async (target, review) => {
795
+ if (!(target == null ? void 0 : target.serverUrl)) return "unsent";
780
796
  try {
781
797
  const url = `${target.serverUrl.replace(/\/$/, "")}/v1/reviews`;
782
798
  const headers = { "Content-Type": "application/json" };
783
799
  if (target.apiKey) headers.Authorization = `Bearer ${target.apiKey}`;
784
- void fetch(url, {
800
+ const res = await fetch(url, {
785
801
  method: "POST",
786
802
  headers,
787
803
  body: JSON.stringify(review)
788
- }).catch(() => {
789
804
  });
805
+ if (!res) return "unsent";
806
+ return res.ok ? "accepted" : "rejected";
790
807
  } catch {
808
+ return "unsent";
791
809
  }
792
810
  };
793
811
  var fetchReviewDecision = async (target, options = {}) => {
@@ -876,17 +894,30 @@ var _ReviewGate = ({
876
894
  onResolved == null ? void 0 : onResolved();
877
895
  }, [onResolved]);
878
896
  const postedRef = React7.useRef(false);
897
+ const unackedRef = React7.useRef(null);
879
898
  const postOnce = useCallback(
880
899
  (body) => {
881
900
  if (postedRef.current) return;
882
901
  postedRef.current = true;
883
- submitReview(target, body);
902
+ unackedRef.current = body;
903
+ void submitReview(target, body).then((result) => {
904
+ if (result === "unsent") {
905
+ postedRef.current = false;
906
+ return;
907
+ }
908
+ unackedRef.current = null;
909
+ });
884
910
  },
885
911
  [target]
886
912
  );
887
913
  const abandonRef = React7.useRef(() => {
888
914
  });
889
915
  abandonRef.current = () => {
916
+ const undelivered = unackedRef.current;
917
+ if (undelivered && !postedRef.current) {
918
+ postOnce(undelivered);
919
+ return;
920
+ }
890
921
  if (postedRef.current || stars < 1) return;
891
922
  postOnce(
892
923
  buildReviewSubmission({
@@ -1254,7 +1285,7 @@ var useWireFeatures = (config) => {
1254
1285
  return flags;
1255
1286
  };
1256
1287
  var CONTEXT_SYMBOL = /* @__PURE__ */ Symbol.for("wireai.features.context");
1257
- var globalObj = global;
1288
+ var globalObj = globalThis;
1258
1289
  if (!globalObj[CONTEXT_SYMBOL]) {
1259
1290
  globalObj[CONTEXT_SYMBOL] = createContext(null);
1260
1291
  }