@thecb/components 11.3.1 → 11.3.2-beta.1

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/index.d.ts CHANGED
@@ -513,32 +513,45 @@ declare function useConditionallyAddValidator(
513
513
  * @param {string} verifyURL - The URL of the Turnstile verification script.
514
514
  */
515
515
  declare const useTurnstileScript = verifyURL => {
516
- const [isLoaded, setIsLoaded] = useState(false);
516
+ const [scriptLoaded, setScriptLoaded] = useState(false);
517
+ const [scriptError, setScriptError] = useState(false);
518
+
519
+ const handleScriptError = () => {
520
+ setScriptError(true);
521
+ setScriptLoaded(false);
522
+ };
517
523
 
518
524
  useEffect(() => {
519
525
  if (typeof window === "undefined") {
520
- setIsLoaded(false);
526
+ setScriptLoaded(false);
521
527
  return;
522
528
  }
523
529
  if (window.turnstile && window.turnstile.render) {
524
- setIsLoaded(true);
530
+ setScriptLoaded(true);
525
531
  return;
526
532
  }
527
533
 
528
534
  const script = document.createElement("script");
529
535
  script.src = `${verifyURL}?render=explicit`;
530
536
  script.onload = () => {
531
- setIsLoaded(true);
537
+ setScriptLoaded(true);
538
+ };
539
+ script.onerror = () => {
540
+ handleScriptError();
541
+ };
542
+ script.onabort = () => {
543
+ handleScriptError();
532
544
  };
533
545
  script.defer = true;
534
546
  document.getElementsByTagName("head")[0].appendChild(script);
535
547
 
536
548
  return () => {
537
- setIsLoaded(false);
549
+ setScriptLoaded(false);
550
+ setScriptError(false);
538
551
  };
539
552
  }, [verifyURL]);
540
553
 
541
- return isLoaded;
554
+ return { scriptLoaded, scriptError };
542
555
  };
543
556
 
544
557
 
package/dist/index.esm.js CHANGED
@@ -24404,29 +24404,47 @@ function useConditionallyAddValidator(condition, validatorFn, addValidator, remo
24404
24404
  var useTurnstileScript = function useTurnstileScript(verifyURL) {
24405
24405
  var _useState = useState(false),
24406
24406
  _useState2 = _slicedToArray(_useState, 2),
24407
- isLoaded = _useState2[0],
24408
- setIsLoaded = _useState2[1];
24407
+ scriptLoaded = _useState2[0],
24408
+ setScriptLoaded = _useState2[1];
24409
+ var _useState3 = useState(false),
24410
+ _useState4 = _slicedToArray(_useState3, 2),
24411
+ scriptError = _useState4[0],
24412
+ setScriptError = _useState4[1];
24413
+ var handleScriptError = function handleScriptError() {
24414
+ setScriptError(true);
24415
+ setScriptLoaded(false);
24416
+ };
24409
24417
  useEffect$1(function () {
24410
24418
  if (typeof window === "undefined") {
24411
- setIsLoaded(false);
24419
+ setScriptLoaded(false);
24412
24420
  return;
24413
24421
  }
24414
24422
  if (window.turnstile && window.turnstile.render) {
24415
- setIsLoaded(true);
24423
+ setScriptLoaded(true);
24416
24424
  return;
24417
24425
  }
24418
24426
  var script = document.createElement("script");
24419
24427
  script.src = "".concat(verifyURL, "?render=explicit");
24420
24428
  script.onload = function () {
24421
- setIsLoaded(true);
24429
+ setScriptLoaded(true);
24430
+ };
24431
+ script.onerror = function () {
24432
+ handleScriptError();
24433
+ };
24434
+ script.onabort = function () {
24435
+ handleScriptError();
24422
24436
  };
24423
24437
  script.defer = true;
24424
24438
  document.getElementsByTagName("head")[0].appendChild(script);
24425
24439
  return function () {
24426
- setIsLoaded(false);
24440
+ setScriptLoaded(false);
24441
+ setScriptError(false);
24427
24442
  };
24428
24443
  }, [verifyURL]);
24429
- return isLoaded;
24444
+ return {
24445
+ scriptLoaded: scriptLoaded,
24446
+ scriptError: scriptError
24447
+ };
24430
24448
  };
24431
24449
 
24432
24450
 
@@ -49980,89 +49998,169 @@ var HeroImage$1 = withWindowSize(themeComponent(HeroImage, "HeroImage", fallback
49980
49998
  var TurnstileWidgetContainer = styled(Box).withConfig({
49981
49999
  displayName: "TurnstileWidget__TurnstileWidgetContainer",
49982
50000
  componentId: "sc-btaugr-0"
49983
- })(["display:flex;padding:", ";justify-content:", ";width:100%;"], function (_ref) {
50001
+ })(["display:flex;flex-direction:column;padding:", ";justify-content:", ";align-items:", ";width:100%;"], function (_ref) {
49984
50002
  var padding = _ref.padding;
49985
50003
  return padding;
49986
50004
  }, function (_ref2) {
49987
50005
  var justify = _ref2.justify;
49988
50006
  return justify;
50007
+ }, function (_ref3) {
50008
+ var align = _ref3.align;
50009
+ return align;
49989
50010
  });
49990
- var TurnstileWidget = /*#__PURE__*/forwardRef(function (_ref3, ref) {
49991
- var verifyURL = _ref3.verifyURL,
49992
- siteKey = _ref3.siteKey,
49993
- _ref3$onSuccess = _ref3.onSuccess,
49994
- onSuccess = _ref3$onSuccess === void 0 ? noop$1 : _ref3$onSuccess,
49995
- _ref3$onError = _ref3.onError,
49996
- onError = _ref3$onError === void 0 ? noop$1 : _ref3$onError,
49997
- _ref3$onExpired = _ref3.onExpired,
49998
- onExpired = _ref3$onExpired === void 0 ? noop$1 : _ref3$onExpired,
49999
- _ref3$padding = _ref3.padding,
50000
- padding = _ref3$padding === void 0 ? "1rem" : _ref3$padding,
50001
- _ref3$justify = _ref3.justify,
50002
- justify = _ref3$justify === void 0 ? "flex-end" : _ref3$justify,
50003
- _ref3$size = _ref3.size,
50004
- size = _ref3$size === void 0 ? "normal" : _ref3$size,
50005
- _ref3$tabindex = _ref3.tabindex,
50006
- tabindex = _ref3$tabindex === void 0 ? 0 : _ref3$tabindex,
50007
- _ref3$retry = _ref3.retry,
50008
- retry = _ref3$retry === void 0 ? "auto" : _ref3$retry,
50009
- _ref3$theme = _ref3.theme,
50010
- theme = _ref3$theme === void 0 ? "auto" : _ref3$theme,
50011
- _ref3$extraStyles = _ref3.extraStyles,
50012
- extraStyles = _ref3$extraStyles === void 0 ? "" : _ref3$extraStyles;
50011
+ var FATAL_ERROR_CODES = [
50012
+ // Configuration errors
50013
+ /^100/, /^105/, /^110100$/, /^110110$/, /^110200$/, /^110420$/, /^110430$/, /^400020$/, /^400030$/, /^400040$/,
50014
+ // Browser/environment errors
50015
+ /^110500$/, /^110510$/, /^200010$/, /^200100$/,
50016
+ // Internal errors
50017
+ /^120/];
50018
+ var TurnstileWidget = /*#__PURE__*/forwardRef(function (_ref4, ref) {
50019
+ var verifyURL = _ref4.verifyURL,
50020
+ siteKey = _ref4.siteKey,
50021
+ _ref4$onSuccess = _ref4.onSuccess,
50022
+ onSuccess = _ref4$onSuccess === void 0 ? noop$1 : _ref4$onSuccess,
50023
+ _ref4$onError = _ref4.onError,
50024
+ onError = _ref4$onError === void 0 ? noop$1 : _ref4$onError,
50025
+ _ref4$onExpired = _ref4.onExpired,
50026
+ onExpired = _ref4$onExpired === void 0 ? noop$1 : _ref4$onExpired,
50027
+ _ref4$padding = _ref4.padding,
50028
+ padding = _ref4$padding === void 0 ? "1rem" : _ref4$padding,
50029
+ _ref4$justify = _ref4.justify,
50030
+ justify = _ref4$justify === void 0 ? "flex-end" : _ref4$justify,
50031
+ _ref4$align = _ref4.align,
50032
+ align = _ref4$align === void 0 ? "flex-end" : _ref4$align,
50033
+ _ref4$size = _ref4.size,
50034
+ size = _ref4$size === void 0 ? "normal" : _ref4$size,
50035
+ _ref4$tabindex = _ref4.tabindex,
50036
+ tabindex = _ref4$tabindex === void 0 ? 0 : _ref4$tabindex,
50037
+ _ref4$retry = _ref4.retry,
50038
+ retry = _ref4$retry === void 0 ? "never" : _ref4$retry,
50039
+ _ref4$theme = _ref4.theme,
50040
+ theme = _ref4$theme === void 0 ? "light" : _ref4$theme,
50041
+ _ref4$extraStyles = _ref4.extraStyles,
50042
+ extraStyles = _ref4$extraStyles === void 0 ? "" : _ref4$extraStyles,
50043
+ _ref4$maxErrorRetries = _ref4.maxErrorRetries,
50044
+ maxErrorRetries = _ref4$maxErrorRetries === void 0 ? 3 : _ref4$maxErrorRetries;
50013
50045
  if (!verifyURL || !siteKey) return null;
50014
50046
  var widgetRef = useRef(null);
50047
+ var widgetIdRef = useRef(null);
50048
+ var retryCountRef = useRef(0);
50015
50049
  var _useState = useState(null),
50016
50050
  _useState2 = _slicedToArray(_useState, 2),
50017
- widgetId = _useState2[0],
50018
- setWidgetId = _useState2[1];
50019
- var isTurnstileLoaded = useTurnstileScript(verifyURL);
50051
+ error = _useState2[0],
50052
+ setError = _useState2[1];
50053
+ var _useTurnstileScript = useTurnstileScript(verifyURL),
50054
+ scriptLoaded = _useTurnstileScript.scriptLoaded,
50055
+ scriptError = _useTurnstileScript.scriptError;
50056
+
50057
+ // Clear the error state and reset retry count
50058
+ var clearError = function clearError() {
50059
+ setError(null);
50060
+ retryCountRef.current = 0;
50061
+ };
50062
+
50063
+ // Handle errors based on the retry strategy
50064
+ var handleError = function handleError(errorCode) {
50065
+ retryCountRef.current += 1;
50066
+ var currentRetryCount = retryCountRef.current;
50067
+
50068
+ // If we haven't exceeded max retries, reset and try again
50069
+ if (currentRetryCount <= maxErrorRetries) {
50070
+ window.turnstile.reset(widgetIdRef.current);
50071
+ setError(null);
50072
+ return;
50073
+ }
50074
+
50075
+ // Max retries exceeded - show appropriate error message
50076
+ if (errorCode) {
50077
+ var errorMessage = getErrorMessage(errorCode);
50078
+ setError(errorMessage);
50079
+ }
50080
+ };
50081
+ var getErrorMessage = function getErrorMessage(errorCode) {
50082
+ var isFatalError = FATAL_ERROR_CODES.some(function (pattern) {
50083
+ return pattern.test(errorCode);
50084
+ });
50085
+ if (isFatalError) {
50086
+ return "Browser or system error. Please refresh the page or update your browser.";
50087
+ }
50088
+ return "Something went wrong. Please refresh and try again.";
50089
+ };
50090
+
50091
+ // Reset the Turnstile widget when requested
50092
+ var resetWidget = useCallback(function () {
50093
+ if (widgetIdRef.current && window.turnstile) {
50094
+ window.turnstile.reset(widgetIdRef.current);
50095
+ clearError();
50096
+ }
50097
+ }, [clearError]);
50020
50098
 
50021
50099
  // Allow the parent component to reset the Turnstile widget
50022
50100
  useImperativeHandle(ref, function () {
50023
50101
  return {
50024
- reset: function reset() {
50025
- if (widgetId && window.turnstile) {
50026
- window.turnstile.reset(widgetId);
50027
- }
50028
- }
50102
+ reset: resetWidget
50029
50103
  };
50030
- }, [widgetId]);
50104
+ }, [resetWidget]);
50031
50105
  useEffect$1(function () {
50032
- if (!widgetRef.current || !window.turnstile) return;
50033
- if (!widgetId) {
50034
- var newWidgetId = window.turnstile.render(widgetRef.current, {
50106
+ if (scriptError) {
50107
+ setError("Unable to load security verification. Please refresh the page.");
50108
+ onError === null || onError === void 0 || onError({
50109
+ type: "script_load_failed",
50110
+ error: scriptError
50111
+ });
50112
+ return;
50113
+ }
50114
+ if (widgetIdRef.current || !window.turnstile || !scriptLoaded) return;
50115
+ try {
50116
+ widgetIdRef.current = window.turnstile.render(widgetRef.current, {
50035
50117
  sitekey: siteKey,
50036
50118
  size: size,
50037
50119
  retry: retry,
50038
50120
  tabindex: tabindex,
50039
50121
  theme: theme,
50040
50122
  callback: function callback(token) {
50041
- return onSuccess(token);
50123
+ clearError();
50124
+ onSuccess(token);
50042
50125
  },
50043
- "error-callback": function errorCallback() {
50044
- return onError();
50126
+ "error-callback": function errorCallback(errorCode) {
50127
+ if (retry === "never") {
50128
+ handleError(errorCode);
50129
+ }
50130
+ onError === null || onError === void 0 || onError(errorCode);
50045
50131
  },
50046
50132
  "expired-callback": function expiredCallback() {
50047
- return onExpired();
50133
+ clearError();
50134
+ onExpired === null || onExpired === void 0 || onExpired();
50048
50135
  }
50049
50136
  });
50050
- setWidgetId(newWidgetId);
50137
+ } catch (error) {
50138
+ setError("Unable to load security verification. Please refresh the page.");
50139
+ onError === null || onError === void 0 || onError({
50140
+ type: "render_failed",
50141
+ error: error
50142
+ });
50051
50143
  }
50052
50144
  return function () {
50053
- if (widgetId && window.turnstile) {
50054
- window.turnstile.remove(widgetId);
50055
- setWidgetId(null);
50145
+ if (widgetIdRef.current && window.turnstile) {
50146
+ window.turnstile.remove(widgetIdRef.current);
50147
+ widgetIdRef.current = null;
50148
+ clearError();
50056
50149
  }
50057
50150
  };
50058
- }, [isTurnstileLoaded, siteKey, widgetId]);
50059
- return /*#__PURE__*/React__default.createElement(TurnstileWidgetContainer, {
50151
+ }, [scriptLoaded, siteKey]);
50152
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(TurnstileWidgetContainer, {
50060
50153
  padding: padding,
50061
50154
  justify: justify,
50155
+ align: align,
50062
50156
  extraStyles: extraStyles
50063
50157
  }, /*#__PURE__*/React__default.createElement("div", {
50064
50158
  ref: widgetRef
50065
- }));
50159
+ }), error && /*#__PURE__*/React__default.createElement(Text$1, {
50160
+ color: ERROR_COLOR,
50161
+ variant: "pXS",
50162
+ extraStyles: "\n word-break: break-word;\n text-align: end;\n "
50163
+ }, error)));
50066
50164
  });
50067
50165
 
50068
50166
  var pageBackground = "#FBFCFD";