@wlloyalty/wll-react-sdk 1.6.0 → 1.6.9-alpha.20251218052322.cca85de

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/native.js CHANGED
@@ -2401,6 +2401,7 @@ var styles$7 = reactNative.StyleSheet.create({
2401
2401
  justifyContent: 'center',
2402
2402
  width: '100%',
2403
2403
  height: '100%',
2404
+ minHeight: 130,
2404
2405
  },
2405
2406
  });
2406
2407
 
@@ -2420,7 +2421,7 @@ var Text = function (_a) {
2420
2421
  case 'body':
2421
2422
  return {
2422
2423
  color: theme.derivedSurfaceText[20],
2423
- fontSize: useResponsiveValue(theme.sizes.md, theme.sizes.xs, isDesktop, isTablet),
2424
+ fontSize: useResponsiveValue(theme.sizes.md, theme.sizes.sm, isDesktop, isTablet),
2424
2425
  };
2425
2426
  case 'caption':
2426
2427
  return __assign(__assign({}, baseStyle), { fontWeight: 'bold', fontSize: useResponsiveValue(theme.sizes.xxl, theme.sizes.xl, isDesktop, isTablet), color: theme.primary });
@@ -2783,6 +2784,7 @@ var baseStyles = reactNative.StyleSheet.create({
2783
2784
  position: 'relative',
2784
2785
  },
2785
2786
  container: {
2787
+ flex: 1,
2786
2788
  width: '100%',
2787
2789
  height: '100%',
2788
2790
  overflow: 'hidden',
@@ -2834,8 +2836,19 @@ var useBaseTileStyles = function () {
2834
2836
  var sizeInfo = useTileSize(tileContext);
2835
2837
  var isHalfSize = (sizeInfo === null || sizeInfo === void 0 ? void 0 : sizeInfo.isHalfSize) || false;
2836
2838
  var _b = tileContext.configuration, artworkUrl = _b.artworkUrl, title = _b.title, body = _b.body;
2839
+ // Access showDetails safely only for Reward tiles to avoid type errors on ContentTileConfig
2840
+ var rewardShowDetails = tileContext.type === 'REWARD'
2841
+ ? tileContext.configuration
2842
+ .showDetails
2843
+ : undefined;
2844
+ // In Reward tiles that show details (title, summary, points), the content height
2845
+ // can exceed a square aspect ratio. To prevent clipping (e.g., points cut off in
2846
+ // TwoPerRow), allow the container to naturally size and do not enforce aspectRatio.
2847
+ var isRewardWithDetails = tileContext.type === 'REWARD' && rewardShowDetails !== false;
2837
2848
  return reactNative.StyleSheet.create({
2838
- container: __assign(__assign({}, baseStyles.container), { backgroundColor: theme.surface, aspectRatio: isHalfSize ? 2 : 1, borderRadius: useResponsiveValue(theme.sizes.borderRadiusLg, theme.sizes.borderRadiusSm, isDesktop, isTablet), justifyContent: 'center', alignItems: 'center' }),
2849
+ container: __assign(__assign(__assign(__assign({}, baseStyles.container), { backgroundColor: theme.surface }), (isRewardWithDetails
2850
+ ? { height: undefined }
2851
+ : { height: '100%' })), { borderRadius: useResponsiveValue(theme.sizes.borderRadiusLg, theme.sizes.borderRadiusSm, isDesktop, isTablet), justifyContent: 'center', alignItems: 'center' }),
2839
2852
  content: __assign(__assign({}, baseStyles.content), { justifyContent: 'center', height: !artworkUrl ? '100%' : undefined }),
2840
2853
  header: {
2841
2854
  marginBottom: useResponsiveValue(theme.sizes.xxs, theme.sizes.xxxs, isDesktop, isTablet),
@@ -2981,7 +2994,10 @@ var BaseTileContainer = function (_a) {
2981
2994
  var _b = tile.configuration, _c = _b.ctaLink, ctaLink = _c === void 0 ? '' : _c, ctaLinkTarget = _b.ctaLinkTarget, _d = _b.title, title = _d === void 0 ? 'Tile' : _d;
2982
2995
  var theme = (sdk === null || sdk === void 0 ? void 0 : sdk.theme) || { surface: '#ffffff' };
2983
2996
  var handlePress = useHandleTilePress(tile, ctaLink, ctaLinkTarget);
2984
- var isInteractive = Boolean(ctaLink || tile.type === 'REWARD' || tile.type === 'REWARD_CATEGORY' || tile.type === 'VENUE');
2997
+ var isInteractive = Boolean(ctaLink ||
2998
+ tile.type === 'REWARD' ||
2999
+ tile.type === 'REWARD_CATEGORY' ||
3000
+ tile.type === 'VENUE');
2985
3001
  var layout = {
2986
3002
  flexDirection: 'column',
2987
3003
  justifyContent: isHalfSize ? 'center' : 'flex-start',
@@ -3115,7 +3131,6 @@ var SkeletonTile = function (_a) {
3115
3131
  };
3116
3132
  var styles$4 = reactNative.StyleSheet.create({
3117
3133
  container: {
3118
- aspectRatio: 1,
3119
3134
  overflow: 'hidden',
3120
3135
  },
3121
3136
  });
@@ -3184,10 +3199,6 @@ var styles$3 = reactNative.StyleSheet.create({
3184
3199
  skeleton: {
3185
3200
  overflow: 'hidden',
3186
3201
  },
3187
- square: {
3188
- width: 1000 / 4,
3189
- aspectRatio: 1,
3190
- },
3191
3202
  });
3192
3203
 
3193
3204
  function withTileFetching(WrappedComponent) {
@@ -3310,8 +3321,9 @@ var handleLastEarnedDate = function (date, userLocale) {
3310
3321
  */
3311
3322
  var BadgeTileDateEarned = function () {
3312
3323
  var tileContext = useTileContext();
3313
- if (!isContextValid(tileContext))
3324
+ if (!isContextValid(tileContext)) {
3314
3325
  return null;
3326
+ }
3315
3327
  var _a = tileContext.configuration, count = _a.count, awardedDatePrefix = _a.awardedDatePrefix, lastEarnedAt = _a.lastEarnedAt, badgeNotEarnedMessage = _a.badgeNotEarnedMessage, type = _a.type, locale = _a.locale;
3316
3328
  // Don't show for Latest type with count=0
3317
3329
  if (type === exports.BadgeTileType.Latest && count === 0) {
@@ -3393,7 +3405,6 @@ var useBadgeTileStyles = function () {
3393
3405
  fontWeight: 'bold',
3394
3406
  },
3395
3407
  header: {
3396
- flexBasis: '50%',
3397
3408
  alignItems: 'center',
3398
3409
  justifyContent: 'center',
3399
3410
  position: 'relative',
@@ -3445,8 +3456,9 @@ var BadgeTileMedia = function (_a) {
3445
3456
  var BadgeTileStatus = function () {
3446
3457
  var styles = useBadgeTileStyles();
3447
3458
  var tileContext = useTileContext();
3448
- if (!isContextValid(tileContext))
3459
+ if (!isContextValid(tileContext)) {
3449
3460
  return null;
3461
+ }
3450
3462
  var _a = tileContext.configuration, count = _a.count, type = _a.type;
3451
3463
  if (type !== exports.BadgeTileType.Specific || count === 1) {
3452
3464
  return null;
@@ -3675,13 +3687,6 @@ var useContentTileStyles = function (hasArtwork) {
3675
3687
  overflow: 'hidden',
3676
3688
  },
3677
3689
  image: {
3678
- position: 'absolute',
3679
- top: -1,
3680
- left: -1,
3681
- bottom: -1,
3682
- right: -1,
3683
- width: '102%',
3684
- height: '102%',
3685
3690
  resizeMode: 'cover',
3686
3691
  },
3687
3692
  content: {
@@ -3795,7 +3800,7 @@ var ContentTileRoot = function (_a) {
3795
3800
  var configuration = tile.configuration;
3796
3801
  var hasArtwork = Boolean(configuration.artworkUrl);
3797
3802
  var styles = useContentTileStyles(hasArtwork);
3798
- return (jsxRuntimeExports.jsxs(BaseTile, { tile: tile, children: [jsxRuntimeExports.jsx(ContentTile.Media, { isArtworkOnly: isArtworkOnly$1(configuration) }), jsxRuntimeExports.jsxs(Layout, { justify: hasArtwork ? 'start' : 'center', style: { paddingBottom: 0, marginBottom: 0 }, children: [jsxRuntimeExports.jsxs(Row, { justify: "between", align: "center", style: styles.header, children: [jsxRuntimeExports.jsx(ContentTile.Title, {}), jsxRuntimeExports.jsx(ContentTile.Chevron, {})] }), jsxRuntimeExports.jsx(ContentTile.Summary, {})] })] }));
3803
+ return (jsxRuntimeExports.jsxs(BaseTile, { tile: tile, children: [jsxRuntimeExports.jsx(ContentTile.Media, { isArtworkOnly: isArtworkOnly$1(configuration) }), !isArtworkOnly$1(configuration) && (jsxRuntimeExports.jsxs(Layout, { justify: hasArtwork ? 'start' : 'center', style: { paddingBottom: 0, marginBottom: 0 }, children: [jsxRuntimeExports.jsxs(Row, { justify: "between", align: "center", style: styles.header, children: [jsxRuntimeExports.jsx(ContentTile.Title, {}), jsxRuntimeExports.jsx(ContentTile.Chevron, {})] }), jsxRuntimeExports.jsx(ContentTile.Summary, {})] }))] }));
3799
3804
  };
3800
3805
  /**
3801
3806
  * The ContentTile component with subcomponents attached.
@@ -4283,8 +4288,6 @@ var Grid = function (_a) {
4283
4288
  return {
4284
4289
  width: "calc(".concat(100 / columns, "% - ").concat(((columns - 1) * GRID_GAP) / columns, "px)"),
4285
4290
  marginBottom: GRID_GAP,
4286
- height: 'auto',
4287
- aspectRatio: 1,
4288
4291
  };
4289
4292
  }
4290
4293
  else {
@@ -4294,7 +4297,6 @@ var Grid = function (_a) {
4294
4297
  return {
4295
4298
  width: tileWidth,
4296
4299
  marginBottom: GRID_GAP,
4297
- aspectRatio: 1,
4298
4300
  };
4299
4301
  }
4300
4302
  }, []);
@@ -4717,7 +4719,7 @@ var Column = function (_a) {
4717
4719
  */
4718
4720
  var FullFlex = function (_a) {
4719
4721
  var children = _a.children, style = _a.style, rest = __rest(_a, ["children", "style"]);
4720
- return (jsxRuntimeExports.jsx(reactNative.View, __assign({ style: [{ flex: 1 }, style] }, rest, { children: children })));
4722
+ return (jsxRuntimeExports.jsx(reactNative.View, __assign({ style: [{ flex: 1, direction: 'inherit' }, style] }, rest, { children: children })));
4721
4723
  };
4722
4724
 
4723
4725
  /**
@@ -4735,7 +4737,7 @@ var Layout = function (_a) {
4735
4737
  var _f = useResponsive$1(), isDesktop = _f.isDesktop, isTablet = _f.isTablet;
4736
4738
  var dynamicStyles = reactNative.StyleSheet.create({
4737
4739
  container: {
4738
- flex: 1,
4740
+ flexGrow: 1,
4739
4741
  paddingHorizontal: useResponsiveValue(theme.sizes.sm, theme.sizes.xxs, isDesktop, isTablet),
4740
4742
  paddingBottom: useResponsiveValue(theme.sizes.sm, theme.sizes.xxs, isDesktop, isTablet),
4741
4743
  justifyContent: justifyMap[justify],
@@ -5012,7 +5014,7 @@ var RewardCategoryTileRoot = function (_a) {
5012
5014
  var tile = _a.tile;
5013
5015
  if (!tile || !tile.active || !tile.configuration)
5014
5016
  return null;
5015
- return (jsxRuntimeExports.jsxs(BaseTile, { tile: tile, children: [jsxRuntimeExports.jsx(RewardCategoryTile.Header, {}), jsxRuntimeExports.jsx(RewardCategoryTile.Media, {})] }));
5017
+ return (jsxRuntimeExports.jsx(BaseTile, { tile: tile, children: jsxRuntimeExports.jsxs(reactNative.View, { style: { aspectRatio: 1 }, children: [jsxRuntimeExports.jsx(RewardCategoryTile.Header, {}), jsxRuntimeExports.jsx(RewardCategoryTile.Media, {})] }) }));
5016
5018
  };
5017
5019
  /**
5018
5020
  * The RewardCategoryTile component with subcomponents attached.
@@ -5046,17 +5048,13 @@ var useRewardTileStyles = function () {
5046
5048
  return reactNative.StyleSheet.create({
5047
5049
  imageContainer: {
5048
5050
  width: '100%',
5051
+ minHeight: 130,
5049
5052
  marginBottom: useResponsiveValue(theme.sizes.sm, theme.sizes.xxs, isDesktop, isTablet),
5050
5053
  },
5051
5054
  image: {
5052
- position: 'absolute',
5053
- top: 0,
5054
- left: 0,
5055
- bottom: 0,
5056
- right: 0,
5057
5055
  width: '100%',
5058
5056
  height: '100%',
5059
- resizeMode: 'cover',
5057
+ objectFit: 'cover',
5060
5058
  },
5061
5059
  lockIcon: {
5062
5060
  position: 'absolute',
@@ -5069,7 +5067,6 @@ var useRewardTileStyles = function () {
5069
5067
  },
5070
5068
  content: {
5071
5069
  paddingHorizontal: useResponsiveValue(theme.sizes.sm, theme.sizes.xxs, isDesktop, isTablet),
5072
- flex: 1,
5073
5070
  },
5074
5071
  footer: {
5075
5072
  marginTop: 8,
@@ -5118,9 +5115,22 @@ var RewardTileMedia = function (_a) {
5118
5115
  var _b = tileContext.configuration, artworkUrl = _b.artworkUrl, _c = _b.showArtwork, showArtwork = _c === void 0 ? true : _c, _d = _b.name, name = _d === void 0 ? 'Reward' : _d, _e = _b.isLocked, isLocked = _e === void 0 ? false : _e;
5119
5116
  if (!artworkUrl || !showArtwork)
5120
5117
  return null;
5121
- var containerStyle = {
5122
- flexBasis: isArtworkOnly ? '100%' : '50%',
5123
- };
5118
+ // When artwork-only, the media should occupy the full tile height and compensate
5119
+ // for any content layout that might be hidden. We therefore force the media
5120
+ // container to flex and take the entire available height, removing default
5121
+ // bottom margins and min-heights coming from styles.
5122
+ var containerStyle = isArtworkOnly
5123
+ ? {
5124
+ flexBasis: '100%',
5125
+ flex: 1,
5126
+ height: '100%',
5127
+ marginBottom: 0,
5128
+ minHeight: 0,
5129
+ aspectRatio: 1,
5130
+ }
5131
+ : {
5132
+ flexBasis: '50%',
5133
+ };
5124
5134
  return (jsxRuntimeExports.jsxs(reactNative.View, { style: [styles.imageContainer, containerStyle], testID: "reward-tile-media", role: "img", accessibilityLabel: "Reward image for ".concat(name), children: [jsxRuntimeExports.jsx(ProgressiveImage, { source: { uri: artworkUrl }, style: styles.image, alt: "Reward image for ".concat(name) }), isLocked && (jsxRuntimeExports.jsx(reactNative.View, { style: styles.lockOverlay, testID: "lock-overlay", children: jsxRuntimeExports.jsx(Icon, { name: "LockKeyhole", size: 48, color: "white" }) }))] }));
5125
5135
  };
5126
5136
 
@@ -5139,7 +5149,7 @@ var RewardTilePoints = function () {
5139
5149
  return null;
5140
5150
  var calculatedPoints = applyMultiplier(price, pointsMultiplier);
5141
5151
  var accessibilityLabel = getPointsLabel('Reward points:', calculatedPoints, pointsPrefix, pointsSuffix);
5142
- return (jsxRuntimeExports.jsx(reactNative.View, { testID: "reward-tile-points", role: "article", accessibilityLabel: accessibilityLabel, children: jsxRuntimeExports.jsxs(Row, { align: "center", justify: "start", style: { marginTop: 8 }, children: [pointsPrefix ? jsxRuntimeExports.jsx(Text, { variant: "caption", children: pointsPrefix }) : null, jsxRuntimeExports.jsx(Text, { variant: "caption", testID: "reward-tile-points-value", children: calculatedPoints }), pointsSuffix ? (jsxRuntimeExports.jsx(Text, { variant: "caption", style: styles.suffix, children: pointsSuffix })) : null] }) }));
5152
+ return (jsxRuntimeExports.jsx(reactNative.View, { style: { marginTop: 'auto' }, testID: "reward-tile-points", role: "article", accessibilityLabel: accessibilityLabel, children: jsxRuntimeExports.jsxs(Row, { align: "center", justify: "start", children: [pointsPrefix ? jsxRuntimeExports.jsx(Text, { variant: "caption", children: pointsPrefix }) : null, jsxRuntimeExports.jsx(Text, { variant: "caption", testID: "reward-tile-points-value", children: calculatedPoints }), pointsSuffix ? (jsxRuntimeExports.jsx(Text, { variant: "caption", style: styles.suffix, children: pointsSuffix })) : null] }) }));
5143
5153
  };
5144
5154
 
5145
5155
  /**
@@ -5153,7 +5163,7 @@ var RewardTileSummary = function () {
5153
5163
  return null;
5154
5164
  var _a = tileContext.configuration, summary = _a.summary, _b = _a.showPrice, showPrice = _b === void 0 ? true : _b, price = _a.price;
5155
5165
  var shouldShowPrice = showPrice && price !== undefined && price !== null && price !== 0;
5156
- var numberOfLines = shouldShowPrice ? 1 : 3;
5166
+ var numberOfLines = shouldShowPrice ? 2 : 3;
5157
5167
  if (!summary)
5158
5168
  return null;
5159
5169
  return (jsxRuntimeExports.jsx(Text, { variant: "body", role: "article", accessibilityLabel: summary, testID: "reward-tile-summary", numberOfLines: numberOfLines, ellipsizeMode: "tail", children: summary }));
@@ -5207,7 +5217,8 @@ var RewardTileRoot = function (_a) {
5207
5217
  !tile.configuration)
5208
5218
  return null;
5209
5219
  var configuration = tile.configuration;
5210
- return (jsxRuntimeExports.jsxs(BaseTile, { tile: tile, children: [jsxRuntimeExports.jsx(RewardTile.Media, { isArtworkOnly: isArtworkOnly(configuration) }), jsxRuntimeExports.jsxs(Layout, { children: [jsxRuntimeExports.jsxs(Row, { justify: "between", align: "center", style: styles.header, children: [jsxRuntimeExports.jsx(RewardTile.Title, {}), jsxRuntimeExports.jsx(RewardTile.Chevron, {})] }), jsxRuntimeExports.jsx(RewardTile.Summary, {}), jsxRuntimeExports.jsx(RewardTile.Points, {})] })] }));
5220
+ var artworkOnly = isArtworkOnly(configuration);
5221
+ return (jsxRuntimeExports.jsxs(BaseTile, { tile: tile, children: [jsxRuntimeExports.jsx(RewardTile.Media, { isArtworkOnly: artworkOnly }), !artworkOnly && (jsxRuntimeExports.jsxs(Layout, { children: [jsxRuntimeExports.jsxs(Row, { justify: "between", align: "center", style: styles.header, children: [jsxRuntimeExports.jsx(RewardTile.Title, {}), jsxRuntimeExports.jsx(RewardTile.Chevron, {})] }), jsxRuntimeExports.jsx(reactNative.View, { style: { width: '100%', maxWidth: '100%', minWidth: 0 }, children: jsxRuntimeExports.jsx(RewardTile.Summary, {}) }), jsxRuntimeExports.jsx(RewardTile.Points, {})] }))] }));
5211
5222
  };
5212
5223
  /**
5213
5224
  * The RewardTile component with subcomponents attached.
@@ -5226,7 +5237,6 @@ var useTierTileStyles = function () {
5226
5237
  var theme = useWllSdk().theme;
5227
5238
  return reactNative.StyleSheet.create({
5228
5239
  header: {
5229
- flexBasis: '50%',
5230
5240
  width: '100%',
5231
5241
  overflow: 'hidden',
5232
5242
  marginBottom: useResponsiveValue(theme.sizes.sm, theme.sizes.xxs, isDesktop, isTablet),
@@ -5638,7 +5648,7 @@ var TileContainer = function (_a) {
5638
5648
  var allHalfHeight = tiles.length > 0 &&
5639
5649
  tiles.every(function (tile) { return tile.tileHeight === exports.TileHeight.Half; });
5640
5650
  var halfHeightGap = allHalfHeight ? GRID_GAP / 2 : GRID_GAP;
5641
- return (jsxRuntimeExports.jsx(reactNative.View, { style: [styles.container, allHalfHeight && styles.aspectContainer], testID: "tile-container", children: tiles.map(function (tile, index) {
5651
+ return (jsxRuntimeExports.jsx(reactNative.View, { style: styles.container, testID: "tile-container", children: tiles.map(function (tile, index) {
5642
5652
  var TileComponent = TILE_COMPONENTS[tile.type];
5643
5653
  var isHalfHeight = tile.tileHeight === exports.TileHeight.Half;
5644
5654
  return (jsxRuntimeExports.jsx(reactNative.View, { style: [
@@ -5655,9 +5665,6 @@ var styles = reactNative.StyleSheet.create({
5655
5665
  flex: 1,
5656
5666
  width: '100%',
5657
5667
  },
5658
- aspectContainer: {
5659
- aspectRatio: 1,
5660
- },
5661
5668
  tileWrapper: {
5662
5669
  flex: 1,
5663
5670
  width: '100%',
@@ -5709,7 +5716,7 @@ var mapLiveRegion = function (ariaLive) {
5709
5716
  }
5710
5717
  };
5711
5718
  var Chip = function (_a) {
5712
- var label = _a.label, _b = _a.variant, variant = _b === void 0 ? exports.StatusVariant.PRIMARY : _b, _c = _a.role, role = _c === void 0 ? 'status' : _c, _d = _a.ariaLive, ariaLive = _d === void 0 ? 'polite' : _d, accessibilityLabel = _a.accessibilityLabel, testID = _a.testID, style = _a.style, labelStyle = _a.labelStyle;
5719
+ var label = _a.label, _b = _a.variant, variant = _b === void 0 ? exports.StatusVariant.PRIMARY : _b, _c = _a.role, role = _c === void 0 ? 'text' : _c, _d = _a.ariaLive, ariaLive = _d === void 0 ? 'polite' : _d, accessibilityLabel = _a.accessibilityLabel, testID = _a.testID, style = _a.style, labelStyle = _a.labelStyle;
5713
5720
  var styles = useChipStyles();
5714
5721
  var theme = useWllSdk().theme;
5715
5722
  var variantStyles = React.useMemo(function () {