@crystaldesign/widget-library 25.9.0-rc.9 → 25.10.0-beta.10

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,4 +1,4 @@
1
- import { useEffect, useMemo, useCallback, useState, useRef, forwardRef } from 'react';
1
+ import { useEffect, useMemo, useCallback, useState, forwardRef, useRef } from 'react';
2
2
  import { useDivaCore, getLogger, DivaError, useTranslation } from '@crystaldesign/diva-core';
3
3
  import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
4
4
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
@@ -805,23 +805,23 @@ function useGallery(_ref) {
805
805
  add2DImage: add2DImage,
806
806
  add3DImageAsFallback: add3DImageAsFallback
807
807
  });
808
- useRef(false);
809
808
 
810
809
  // Update currentMediaIndex when currentProductIndex changes from outside
811
810
  useEffect(function () {
812
811
  var _medias$currentMediaI;
813
812
  if (currentProductId !== undefined && ((_medias$currentMediaI = medias[currentMediaIndex]) === null || _medias$currentMediaI === void 0 ? void 0 : _medias$currentMediaI.productId) !== currentProductId) {
814
- // Find the first media index that corresponds to this product index
815
813
  var mediaIndex = medias.findIndex(function (media) {
816
814
  return media.productId === currentProductId;
817
815
  });
818
- if (mediaIndex !== -1 && mediaIndex !== currentMediaIndex) {
819
- var _swiper$params;
816
+ if (mediaIndex !== -1 && mediaIndex !== currentMediaIndex && swiper) {
820
817
  setCurrentMediaIndex(mediaIndex);
821
- if (swiper !== null && swiper !== void 0 && (_swiper$params = swiper.params) !== null && _swiper$params !== void 0 && _swiper$params.loop) {
822
- swiper === null || swiper === void 0 || swiper.slideToLoop(mediaIndex, 0);
823
- } else {
824
- swiper === null || swiper === void 0 || swiper.slideTo(mediaIndex, 0);
818
+ if (swiper.realIndex !== mediaIndex) {
819
+ var _swiper$params;
820
+ if ((_swiper$params = swiper.params) !== null && _swiper$params !== void 0 && _swiper$params.loop) {
821
+ swiper.slideToLoop(mediaIndex, 0);
822
+ } else {
823
+ swiper.slideTo(mediaIndex, 0);
824
+ }
825
825
  }
826
826
  }
827
827
  }
@@ -849,23 +849,19 @@ function useGallery(_ref) {
849
849
  sirvLoaded = _useSirv.sirvLoaded;
850
850
  var onSlideChange = function onSlideChange(swiper) {
851
851
  if (swiper.el.classList.contains('gallery-main-nested-swiper')) return;
852
-
853
- // Ensure the onSlideChange logic is not executed during the initial setup of the Swiper instance.
852
+ var newMediaIndex = swiper.realIndex;
853
+ var media = medias[newMediaIndex];
854
854
  if (!swiperIsInitialized) {
855
855
  setSwiperIsInitialized(true);
856
856
  return;
857
857
  }
858
- if (swiper.isBeginning) return;
859
- var newMediaIndex = swiper.realIndex;
860
- var media = medias[newMediaIndex];
861
- setCurrentMediaIndex(newMediaIndex);
862
- if (setCurrentProductId && media) {
863
- setCurrentProductId(media.productId);
858
+ if (newMediaIndex !== currentMediaIndex) {
859
+ setCurrentMediaIndex(newMediaIndex);
860
+ if (setCurrentProductId && (media === null || media === void 0 ? void 0 : media.productId) !== currentProductId) {
861
+ setCurrentProductId(media.productId);
862
+ }
864
863
  }
865
864
  };
866
-
867
- // Get the current product index based on the current media index
868
- medias[currentMediaIndex];
869
865
  return {
870
866
  medias: medias,
871
867
  sirvLoaded: sirvLoaded,
@@ -976,6 +972,108 @@ var ArViewer = /*#__PURE__*/forwardRef(function (_ref, ref) {
976
972
  });
977
973
  });
978
974
 
975
+ var ImageItem = function ImageItem(_ref) {
976
+ var url = _ref.url,
977
+ onClick = _ref.onClick,
978
+ className = _ref.className,
979
+ sirvProps = _ref.sirvProps;
980
+ var _useState = useState(''),
981
+ _useState2 = _slicedToArray(_useState, 2),
982
+ loadedMediaUrl = _useState2[0],
983
+ setLoadedMediaUrl = _useState2[1];
984
+ var _useState3 = useState(false),
985
+ _useState4 = _slicedToArray(_useState3, 2),
986
+ hasError = _useState4[0],
987
+ setHasError = _useState4[1];
988
+ useEffect(function () {
989
+ if (!url) return;
990
+
991
+ // Don't start loading if we're already loading the same URL
992
+ if (url === loadedMediaUrl && !hasError) return;
993
+ var preloadImage = /*#__PURE__*/function () {
994
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(imageUrl) {
995
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
996
+ while (1) switch (_context.prev = _context.next) {
997
+ case 0:
998
+ return _context.abrupt("return", new Promise(function (resolve) {
999
+ var img = new Image();
1000
+ img.onload = function () {
1001
+ resolve(true); // Successfully loaded
1002
+ };
1003
+ img.src = imageUrl;
1004
+ }));
1005
+ case 1:
1006
+ case "end":
1007
+ return _context.stop();
1008
+ }
1009
+ }, _callee);
1010
+ }));
1011
+ return function preloadImage(_x) {
1012
+ return _ref2.apply(this, arguments);
1013
+ };
1014
+ }();
1015
+ var preloadAndSet = /*#__PURE__*/function () {
1016
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
1017
+ var success, finalUrl, urlObj;
1018
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
1019
+ while (1) switch (_context2.prev = _context2.next) {
1020
+ case 0:
1021
+ setHasError(false);
1022
+ _context2.next = 3;
1023
+ return preloadImage(url);
1024
+ case 3:
1025
+ success = _context2.sent;
1026
+ if (success) {
1027
+ finalUrl = url;
1028
+ if (sirvProps && url) {
1029
+ urlObj = new URL(url);
1030
+ Object.entries(sirvProps).forEach(function (_ref4) {
1031
+ var _ref5 = _slicedToArray(_ref4, 2),
1032
+ key = _ref5[0],
1033
+ value = _ref5[1];
1034
+ urlObj.searchParams.append(key, value);
1035
+ });
1036
+ finalUrl = urlObj.toString();
1037
+ }
1038
+ setLoadedMediaUrl(finalUrl);
1039
+ setHasError(false);
1040
+ } else {
1041
+ setHasError(true);
1042
+ }
1043
+ case 5:
1044
+ case "end":
1045
+ return _context2.stop();
1046
+ }
1047
+ }, _callee2);
1048
+ }));
1049
+ return function preloadAndSet() {
1050
+ return _ref3.apply(this, arguments);
1051
+ };
1052
+ }();
1053
+ preloadAndSet();
1054
+ }, [url]);
1055
+
1056
+ // Don't render anything if no URL is provided
1057
+ if (!url) {
1058
+ return null;
1059
+ }
1060
+
1061
+ // Only render the image if we have a loaded URL
1062
+ if (loadedMediaUrl) {
1063
+ return /*#__PURE__*/jsx("img", {
1064
+ className: classNames('diva-widget-mediaitem', className),
1065
+ src: loadedMediaUrl,
1066
+ style: {
1067
+ cursor: onClick ? 'pointer' : 'default'
1068
+ },
1069
+ onClick: onClick
1070
+ });
1071
+ }
1072
+
1073
+ // Fallback: render nothing if we don't have a loaded image
1074
+ return null;
1075
+ };
1076
+
979
1077
  var MediaItem = /*#__PURE__*/forwardRef(function (_ref, ref) {
980
1078
  var _media$url;
981
1079
  var media = _ref.media,
@@ -983,7 +1081,8 @@ var MediaItem = /*#__PURE__*/forwardRef(function (_ref, ref) {
983
1081
  videoAutoplay = _ref.videoAutoplay,
984
1082
  config = _ref.config,
985
1083
  isCurrentlyVisible = _ref.isCurrentlyVisible,
986
- onClick = _ref.onClick;
1084
+ onClick = _ref.onClick,
1085
+ className = _ref.className;
987
1086
  var useSirv = false;
988
1087
  var _useDivaCore = useDivaCore(),
989
1088
  baseSirvUrls = _useDivaCore.state.apiConfig.baseSirvUrls;
@@ -1052,14 +1151,12 @@ var MediaItem = /*#__PURE__*/forwardRef(function (_ref, ref) {
1052
1151
  })
1053
1152
  });
1054
1153
  }
1055
- return /*#__PURE__*/jsx("img", {
1056
- className: "diva-widget-mediaitem",
1057
- src: url,
1154
+ return /*#__PURE__*/jsx(ImageItem, {
1155
+ url: url,
1058
1156
  onClick: onClick,
1059
- style: {
1060
- cursor: onClick ? 'pointer' : 'default'
1061
- }
1062
- }, url);
1157
+ className: classNames('diva-widget-mediaitem', className),
1158
+ sirvProps: config.sirvProps
1159
+ });
1063
1160
  });
1064
1161
 
1065
1162
  var Thumb = function Thumb(_ref) {
@@ -1 +1 @@
1
- {"version":3,"file":"useGallery.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Gallery/useGallery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAI9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,EACR,MAAM,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,EAC3D,gBAAgB,EAChB,mBAAmB,GACpB,EAAE,YAAY;;;;;;;;4BAsCkB,WAAW;EAiC3C"}
1
+ {"version":3,"file":"useGallery.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Gallery/useGallery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAI9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,EACR,MAAM,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,EAC3D,gBAAgB,EAChB,mBAAmB,GACpB,EAAE,YAAY;;;;;;;;4BAuCkB,WAAW;EA6B3C"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ url?: string;
4
+ onClick?: () => void;
5
+ className: string;
6
+ sirvProps?: {
7
+ [data: string]: string;
8
+ };
9
+ };
10
+ declare const ImageItem: ({ url, onClick, className, sirvProps }: Props) => React.JSX.Element | null;
11
+ export default ImageItem;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/MediaItem/ImageItem/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,KAAK,KAAK,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE/G,QAAA,MAAM,SAAS,2CAA4C,KAAK,6BA6D/D,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -9,6 +9,7 @@ type Props = {
9
9
  isCurrentlyVisible: boolean;
10
10
  videoAutoplay?: boolean;
11
11
  onClick?: () => void;
12
+ className?: string;
12
13
  };
13
14
  export declare const MediaItem: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLArViewerElement>>;
14
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/MediaItem/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAwC,MAAM,OAAO,CAAC;AAE7D,OAAiB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEzD,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,SAAS,mFA0EpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/MediaItem/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAe,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAwC,MAAM,OAAO,CAAC;AAE7D,OAAiB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAIzD,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,SAAS,mFA4ErB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crystaldesign/widget-library",
3
- "version": "25.9.0-rc.9",
3
+ "version": "25.10.0-beta.10",
4
4
  "license": "MIT",
5
5
  "scripts": {
6
6
  "storybook": "storybook dev -p 6006",
@@ -36,5 +36,5 @@
36
36
  "suiteName": "widget-library",
37
37
  "outputDirectory": "./test-reports"
38
38
  },
39
- "gitHead": "9d015c6b69a9315e9914b570bc522e291a1a5bdd"
39
+ "gitHead": "4e37b1b537663ccc501f024d16a771a526c5cc44"
40
40
  }