@flowsterix/react 0.4.0 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useHiddenTargetFallback.d.ts","sourceRoot":"","sources":["../../src/hooks/useHiddenTargetFallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAUrD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,YAAY,EAAE,cAAc,CAAA;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,cAAc,CAAA;IACtB,mBAAmB,EAAE,OAAO,CAAA;CAC7B;AAED,eAAO,MAAM,uBAAuB,GAAI,yCAKrC,6BAA6B,KAAG,6BAsFlC,CAAA"}
1
+ {"version":3,"file":"useHiddenTargetFallback.d.ts","sourceRoot":"","sources":["../../src/hooks/useHiddenTargetFallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAMrD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAA;IAC5B,MAAM,EAAE,cAAc,CAAA;IACtB,YAAY,EAAE,cAAc,CAAA;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,cAAc,CAAA;IACtB,mBAAmB,EAAE,OAAO,CAAA;CAC7B;AAED,eAAO,MAAM,uBAAuB,GAAI,yCAKrC,6BAA6B,KAAG,6BAkGlC,CAAA"}
package/dist/index.cjs CHANGED
@@ -473,7 +473,6 @@ var TourProvider = ({
473
473
  );
474
474
  const [debugEnabled, setDebugEnabled] = (0, import_react4.useState)(defaultDebug);
475
475
  const [delayInfo, setDelayInfo] = (0, import_react4.useState)(null);
476
- const [eligibleAutoStart, setEligibleAutoStart] = (0, import_react4.useState)(null);
477
476
  const teardownStore = (0, import_react4.useCallback)(() => {
478
477
  unsubscribeRef.current?.();
479
478
  unsubscribeRef.current = null;
@@ -506,8 +505,7 @@ var TourProvider = ({
506
505
  if (!hook) return;
507
506
  try {
508
507
  const result = hook(context);
509
- if (typeof result === "object" && result !== null && typeof result.then === "function") {
510
- ;
508
+ if (result instanceof Promise) {
511
509
  result.catch((error) => {
512
510
  console.warn(`[tour][step] ${phase} hook rejected`, error);
513
511
  });
@@ -676,10 +674,11 @@ var TourProvider = ({
676
674
  },
677
675
  [ensureStore, resolveResumeStrategy, runResumeHooks]
678
676
  );
677
+ const [eligibleFlows, setEligibleFlows] = (0, import_react4.useState)([]);
679
678
  (0, import_react4.useEffect)(() => {
680
679
  const autoStartFlows = flows.filter((f) => f.autoStart);
681
680
  if (autoStartFlows.length === 0) {
682
- setEligibleAutoStart(null);
681
+ setEligibleFlows([]);
683
682
  return;
684
683
  }
685
684
  if (!storageAdapter && !fallbackStorageRef.current && isBrowser) {
@@ -687,11 +686,13 @@ var TourProvider = ({
687
686
  }
688
687
  const resolvedStorageAdapter = storageAdapter ?? fallbackStorageRef.current;
689
688
  if (!resolvedStorageAdapter) {
690
- setEligibleAutoStart({
691
- flow: autoStartFlows[0],
692
- resolvedState: null,
693
- stepIndex: 0
694
- });
689
+ setEligibleFlows(
690
+ autoStartFlows.map((flow) => ({
691
+ flow,
692
+ resolvedState: null,
693
+ stepIndex: 0
694
+ }))
695
+ );
695
696
  return;
696
697
  }
697
698
  let cancelled = false;
@@ -705,12 +706,13 @@ var TourProvider = ({
705
706
  )
706
707
  );
707
708
  if (cancelled) return;
709
+ const eligible = [];
708
710
  for (let i = 0; i < autoStartFlows.length; i++) {
709
711
  const flow = autoStartFlows[i];
710
712
  const snapshot = snapshots[i];
711
713
  if (!snapshot) {
712
- setEligibleAutoStart({ flow, resolvedState: null, stepIndex: 0 });
713
- return;
714
+ eligible.push({ flow, resolvedState: null, stepIndex: 0 });
715
+ continue;
714
716
  }
715
717
  const storedVersionStr = typeof snapshot.version === "number" ? (0, import_core.serializeVersion)({ major: snapshot.version, minor: 0 }) : snapshot.version;
716
718
  const storedVersion = (0, import_core.parseVersion)(storedVersionStr);
@@ -728,10 +730,9 @@ var TourProvider = ({
728
730
  continue;
729
731
  }
730
732
  const stepIndex = Math.max(0, resolvedState.stepIndex);
731
- setEligibleAutoStart({ flow, resolvedState, stepIndex });
732
- return;
733
+ eligible.push({ flow, resolvedState, stepIndex });
733
734
  }
734
- setEligibleAutoStart(null);
735
+ setEligibleFlows(eligible);
735
736
  };
736
737
  void findEligible();
737
738
  return () => {
@@ -739,32 +740,32 @@ var TourProvider = ({
739
740
  };
740
741
  }, [flows, storageAdapter, storageNamespace]);
741
742
  (0, import_react4.useEffect)(() => {
742
- if (!eligibleAutoStart) {
743
+ if (eligibleFlows.length === 0) {
743
744
  autoStartRequestedRef.current = null;
744
745
  return;
745
746
  }
746
747
  if (activeFlowId) return;
747
- if (autoStartRequestedRef.current === eligibleAutoStart.flow.id) return;
748
- const { flow, stepIndex } = eligibleAutoStart;
749
- const step = flow.steps[stepIndex];
750
- if (!step?.route) {
751
- autoStartRequestedRef.current = flow.id;
752
- startFlow(flow.id, { resume: true });
753
- return;
754
- }
755
- const currentPath = getCurrentRoutePath();
756
- if (matchRoute({ pattern: step.route, path: currentPath })) {
757
- autoStartRequestedRef.current = flow.id;
758
- startFlow(flow.id, { resume: true });
759
- return;
760
- }
761
- const unsubscribe = subscribeToRouteChanges((path) => {
748
+ const findMatchingFlow = (path) => {
749
+ for (const { flow, stepIndex } of eligibleFlows) {
750
+ const step = flow.steps[stepIndex];
751
+ if (!step.route || matchRoute({ pattern: step.route, path })) {
752
+ return flow;
753
+ }
754
+ }
755
+ return null;
756
+ };
757
+ const tryStart = (path) => {
762
758
  if (activeFlowId) return;
763
- if (autoStartRequestedRef.current === flow.id) return;
764
- if (matchRoute({ pattern: step.route, path })) {
759
+ const flow = findMatchingFlow(path);
760
+ if (flow && autoStartRequestedRef.current !== flow.id) {
765
761
  autoStartRequestedRef.current = flow.id;
766
762
  startFlow(flow.id, { resume: true });
767
763
  }
764
+ };
765
+ const currentPath = getCurrentRoutePath();
766
+ tryStart(currentPath);
767
+ const unsubscribe = subscribeToRouteChanges((path) => {
768
+ tryStart(path);
768
769
  });
769
770
  return () => {
770
771
  unsubscribe();
@@ -772,7 +773,7 @@ var TourProvider = ({
772
773
  autoStartRequestedRef.current = null;
773
774
  }
774
775
  };
775
- }, [activeFlowId, eligibleAutoStart, startFlow]);
776
+ }, [activeFlowId, eligibleFlows, startFlow]);
776
777
  const next = (0, import_react4.useCallback)(() => getActiveStore().next(), [getActiveStore]);
777
778
  const back = (0, import_react4.useCallback)(() => getActiveStore().back(), [getActiveStore]);
778
779
  const goToStep = (0, import_react4.useCallback)(
@@ -1877,10 +1878,6 @@ var useAdvanceRules = (target) => {
1877
1878
  // src/hooks/useHiddenTargetFallback.ts
1878
1879
  var import_react7 = require("react");
1879
1880
  var DEFAULT_DELAY_MS = 900;
1880
- var HIDDEN_VISIBILITIES = [
1881
- "hidden",
1882
- "detached"
1883
- ];
1884
1881
  var useHiddenTargetFallback = ({
1885
1882
  step,
1886
1883
  target,
@@ -1911,7 +1908,9 @@ var useHiddenTargetFallback = ({
1911
1908
  if (!isBrowser) return void 0;
1912
1909
  if (!step) return void 0;
1913
1910
  clearPendingTimeout();
1914
- const shouldHandleHiddenTarget = HIDDEN_VISIBILITIES.includes(target.visibility) && !target.isScreen && target.status === "ready";
1911
+ const isHiddenOrDetached = (target.visibility === "hidden" || target.visibility === "detached") && target.status === "ready";
1912
+ const isMissingWithNoRect = target.visibility === "missing" && target.status === "resolving" && target.rect === null && target.lastResolvedRect === null;
1913
+ const shouldHandleHiddenTarget = !target.isScreen && (isHiddenOrDetached || isMissingWithNoRect);
1915
1914
  if (!shouldHandleHiddenTarget) {
1916
1915
  setUsingScreenFallback(false);
1917
1916
  return void 0;
@@ -1935,6 +1934,8 @@ var useHiddenTargetFallback = ({
1935
1934
  target.visibility,
1936
1935
  target.isScreen,
1937
1936
  target.status,
1937
+ target.rect,
1938
+ target.lastResolvedRect,
1938
1939
  hiddenMode,
1939
1940
  hiddenDelayMs,
1940
1941
  onSkip
package/dist/index.mjs CHANGED
@@ -214,7 +214,6 @@ var TourProvider = ({
214
214
  );
215
215
  const [debugEnabled, setDebugEnabled] = useState2(defaultDebug);
216
216
  const [delayInfo, setDelayInfo] = useState2(null);
217
- const [eligibleAutoStart, setEligibleAutoStart] = useState2(null);
218
217
  const teardownStore = useCallback(() => {
219
218
  unsubscribeRef.current?.();
220
219
  unsubscribeRef.current = null;
@@ -247,8 +246,7 @@ var TourProvider = ({
247
246
  if (!hook) return;
248
247
  try {
249
248
  const result = hook(context);
250
- if (typeof result === "object" && result !== null && typeof result.then === "function") {
251
- ;
249
+ if (result instanceof Promise) {
252
250
  result.catch((error) => {
253
251
  console.warn(`[tour][step] ${phase} hook rejected`, error);
254
252
  });
@@ -417,10 +415,11 @@ var TourProvider = ({
417
415
  },
418
416
  [ensureStore, resolveResumeStrategy, runResumeHooks]
419
417
  );
418
+ const [eligibleFlows, setEligibleFlows] = useState2([]);
420
419
  useEffect2(() => {
421
420
  const autoStartFlows = flows.filter((f) => f.autoStart);
422
421
  if (autoStartFlows.length === 0) {
423
- setEligibleAutoStart(null);
422
+ setEligibleFlows([]);
424
423
  return;
425
424
  }
426
425
  if (!storageAdapter && !fallbackStorageRef.current && isBrowser) {
@@ -428,11 +427,13 @@ var TourProvider = ({
428
427
  }
429
428
  const resolvedStorageAdapter = storageAdapter ?? fallbackStorageRef.current;
430
429
  if (!resolvedStorageAdapter) {
431
- setEligibleAutoStart({
432
- flow: autoStartFlows[0],
433
- resolvedState: null,
434
- stepIndex: 0
435
- });
430
+ setEligibleFlows(
431
+ autoStartFlows.map((flow) => ({
432
+ flow,
433
+ resolvedState: null,
434
+ stepIndex: 0
435
+ }))
436
+ );
436
437
  return;
437
438
  }
438
439
  let cancelled = false;
@@ -446,12 +447,13 @@ var TourProvider = ({
446
447
  )
447
448
  );
448
449
  if (cancelled) return;
450
+ const eligible = [];
449
451
  for (let i = 0; i < autoStartFlows.length; i++) {
450
452
  const flow = autoStartFlows[i];
451
453
  const snapshot = snapshots[i];
452
454
  if (!snapshot) {
453
- setEligibleAutoStart({ flow, resolvedState: null, stepIndex: 0 });
454
- return;
455
+ eligible.push({ flow, resolvedState: null, stepIndex: 0 });
456
+ continue;
455
457
  }
456
458
  const storedVersionStr = typeof snapshot.version === "number" ? serializeVersion({ major: snapshot.version, minor: 0 }) : snapshot.version;
457
459
  const storedVersion = parseVersion(storedVersionStr);
@@ -469,10 +471,9 @@ var TourProvider = ({
469
471
  continue;
470
472
  }
471
473
  const stepIndex = Math.max(0, resolvedState.stepIndex);
472
- setEligibleAutoStart({ flow, resolvedState, stepIndex });
473
- return;
474
+ eligible.push({ flow, resolvedState, stepIndex });
474
475
  }
475
- setEligibleAutoStart(null);
476
+ setEligibleFlows(eligible);
476
477
  };
477
478
  void findEligible();
478
479
  return () => {
@@ -480,32 +481,32 @@ var TourProvider = ({
480
481
  };
481
482
  }, [flows, storageAdapter, storageNamespace]);
482
483
  useEffect2(() => {
483
- if (!eligibleAutoStart) {
484
+ if (eligibleFlows.length === 0) {
484
485
  autoStartRequestedRef.current = null;
485
486
  return;
486
487
  }
487
488
  if (activeFlowId) return;
488
- if (autoStartRequestedRef.current === eligibleAutoStart.flow.id) return;
489
- const { flow, stepIndex } = eligibleAutoStart;
490
- const step = flow.steps[stepIndex];
491
- if (!step?.route) {
492
- autoStartRequestedRef.current = flow.id;
493
- startFlow(flow.id, { resume: true });
494
- return;
495
- }
496
- const currentPath = getCurrentRoutePath();
497
- if (matchRoute({ pattern: step.route, path: currentPath })) {
498
- autoStartRequestedRef.current = flow.id;
499
- startFlow(flow.id, { resume: true });
500
- return;
501
- }
502
- const unsubscribe = subscribeToRouteChanges((path) => {
489
+ const findMatchingFlow = (path) => {
490
+ for (const { flow, stepIndex } of eligibleFlows) {
491
+ const step = flow.steps[stepIndex];
492
+ if (!step.route || matchRoute({ pattern: step.route, path })) {
493
+ return flow;
494
+ }
495
+ }
496
+ return null;
497
+ };
498
+ const tryStart = (path) => {
503
499
  if (activeFlowId) return;
504
- if (autoStartRequestedRef.current === flow.id) return;
505
- if (matchRoute({ pattern: step.route, path })) {
500
+ const flow = findMatchingFlow(path);
501
+ if (flow && autoStartRequestedRef.current !== flow.id) {
506
502
  autoStartRequestedRef.current = flow.id;
507
503
  startFlow(flow.id, { resume: true });
508
504
  }
505
+ };
506
+ const currentPath = getCurrentRoutePath();
507
+ tryStart(currentPath);
508
+ const unsubscribe = subscribeToRouteChanges((path) => {
509
+ tryStart(path);
509
510
  });
510
511
  return () => {
511
512
  unsubscribe();
@@ -513,7 +514,7 @@ var TourProvider = ({
513
514
  autoStartRequestedRef.current = null;
514
515
  }
515
516
  };
516
- }, [activeFlowId, eligibleAutoStart, startFlow]);
517
+ }, [activeFlowId, eligibleFlows, startFlow]);
517
518
  const next = useCallback(() => getActiveStore().next(), [getActiveStore]);
518
519
  const back = useCallback(() => getActiveStore().back(), [getActiveStore]);
519
520
  const goToStep = useCallback(
@@ -1618,10 +1619,6 @@ var useAdvanceRules = (target) => {
1618
1619
  // src/hooks/useHiddenTargetFallback.ts
1619
1620
  import { useEffect as useEffect5, useMemo as useMemo3, useRef as useRef3, useState as useState4 } from "react";
1620
1621
  var DEFAULT_DELAY_MS = 900;
1621
- var HIDDEN_VISIBILITIES = [
1622
- "hidden",
1623
- "detached"
1624
- ];
1625
1622
  var useHiddenTargetFallback = ({
1626
1623
  step,
1627
1624
  target,
@@ -1652,7 +1649,9 @@ var useHiddenTargetFallback = ({
1652
1649
  if (!isBrowser) return void 0;
1653
1650
  if (!step) return void 0;
1654
1651
  clearPendingTimeout();
1655
- const shouldHandleHiddenTarget = HIDDEN_VISIBILITIES.includes(target.visibility) && !target.isScreen && target.status === "ready";
1652
+ const isHiddenOrDetached = (target.visibility === "hidden" || target.visibility === "detached") && target.status === "ready";
1653
+ const isMissingWithNoRect = target.visibility === "missing" && target.status === "resolving" && target.rect === null && target.lastResolvedRect === null;
1654
+ const shouldHandleHiddenTarget = !target.isScreen && (isHiddenOrDetached || isMissingWithNoRect);
1656
1655
  if (!shouldHandleHiddenTarget) {
1657
1656
  setUsingScreenFallback(false);
1658
1657
  return void 0;
@@ -1676,6 +1675,8 @@ var useHiddenTargetFallback = ({
1676
1675
  target.visibility,
1677
1676
  target.isScreen,
1678
1677
  target.status,
1678
+ target.rect,
1679
+ target.lastResolvedRect,
1679
1680
  hiddenMode,
1680
1681
  hiddenDelayMs,
1681
1682
  onSkip
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowsterix/react",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "React bindings for Flowsterix - guided tours and onboarding flows",
5
5
  "license": "MIT",
6
6
  "repository": {