@riosst100/pwa-marketplace 1.7.0 → 1.7.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.
Files changed (62) hide show
  1. package/package.json +1 -1
  2. package/src/componentOverrideMapping.js +4 -0
  3. package/src/components/CollectibleGameSets/collectibleGameSets.js +0 -4
  4. package/src/components/FilterTop/filterTop.js +0 -2
  5. package/src/components/FilterTopBackup/CustomFilters/customFilters.js +0 -1
  6. package/src/components/ProductLabel/index.js +13 -5
  7. package/src/components/ProductListTab/productListTab.js +1 -3
  8. package/src/components/RelatedProduct/relatedProduct.js +1 -1
  9. package/src/components/ShopBy/shopBy copy.js +0 -1
  10. package/src/components/ShopBy/shopBy.js +0 -1
  11. package/src/components/ShopBySets/shopBySets.js +0 -3
  12. package/src/components/SportCardsSets/index.js +2 -0
  13. package/src/components/SportCardsSets/sportCardsSets.js +372 -0
  14. package/src/components/SportCardsSets/sportCardsSets.module.css +76 -0
  15. package/src/components/SportCardsSets/sportCardsSets.shimmer.js +50 -0
  16. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/Carousel/__fixtures__/apolloMocks.js +33 -0
  17. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/Carousel/carousel.gql.ce.js +16 -0
  18. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/Carousel/carousel.gql.ee.js +17 -0
  19. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/Carousel/carousel.js +38 -0
  20. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/Carousel/index.js +1 -0
  21. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/Carousel/useCarousel.js +25 -0
  22. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/configAggregator.js +26 -0
  23. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/index.js +1 -0
  24. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/products.js +369 -0
  25. package/src/overwrites/pagebuilder/lib/ContentTypes/Products/products.module.css +0 -0
  26. package/src/overwrites/pagebuilder/lib/ContentTypes/Slider/banner.module.css +103 -0
  27. package/src/overwrites/pagebuilder/lib/ContentTypes/Slider/configAggregator.js +17 -0
  28. package/src/overwrites/pagebuilder/lib/ContentTypes/Slider/index.js +2 -0
  29. package/src/overwrites/pagebuilder/lib/ContentTypes/Slider/slider.js +221 -0
  30. package/src/overwrites/pagebuilder/lib/ContentTypes/Slider/slider.module.css +231 -0
  31. package/src/overwrites/pagebuilder/lib/ContentTypes/Slider/slider.shimmer.js +126 -0
  32. package/src/overwrites/pagebuilder/lib/ContentTypes/Slider/slider.shimmer.module.css +5 -0
  33. package/src/overwrites/pagebuilder/lib/utils.js +224 -0
  34. package/src/overwrites/peregrine/lib/talons/FilterSidebar/useFilterSidebar.js +1 -1
  35. package/src/overwrites/peregrine/lib/talons/ProductFullDetail/useProductFullDetail.js +3 -1
  36. package/src/overwrites/peregrine/lib/talons/RootComponents/Category/categoryFragments.gql.js +3 -0
  37. package/src/overwrites/peregrine/lib/talons/RootComponents/Product/productDetailFragment.gql.js +39 -0
  38. package/src/overwrites/venia-ui/lib/RootComponents/CMS/cms.js +73 -0
  39. package/src/overwrites/venia-ui/lib/RootComponents/CMS/cms.module.css +25 -0
  40. package/src/overwrites/venia-ui/lib/RootComponents/CMS/cms.shimmer.js +18 -0
  41. package/src/overwrites/venia-ui/lib/RootComponents/CMS/index.js +7 -0
  42. package/src/overwrites/venia-ui/lib/RootComponents/Category/category.js +12 -1
  43. package/src/overwrites/venia-ui/lib/RootComponents/Category/categoryContent.js +1 -13
  44. package/src/overwrites/venia-ui/lib/components/App/app.js +131 -0
  45. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilters.js +1 -1
  46. package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.js +1 -1
  47. package/src/overwrites/venia-ui/lib/components/Gallery/item.js +9 -2
  48. package/src/overwrites/venia-ui/lib/components/Gallery/item.module.css +1 -1
  49. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/components/auctionDetail.js +176 -138
  50. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/components/preOrderDetail.js +1 -4
  51. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.js +1 -1
  52. package/src/overwrites/venia-ui/lib/components/RichContent/richContent.module.css +3 -3
  53. package/src/overwrites/venia-ui/lib/components/SearchBar/searchBar.js +0 -1
  54. package/src/overwrites/venia-ui/lib/index.module.css +137 -0
  55. package/src/overwrites/venia-ui/lib/tokens.module.css +167 -0
  56. package/src/talons/CollectibleGameSets/collectibleGameSets.gql.js +15 -1
  57. package/src/talons/CollectibleGameSets/useCollectibleGameSets.js +0 -11
  58. package/src/talons/FilterTop/useFilterTop.js +0 -2
  59. package/src/talons/ShopBy/useShopBy.js +0 -22
  60. package/src/talons/SportCardsSets/sportCardsSets.gql.js +46 -0
  61. package/src/talons/SportCardsSets/useSportCardsSets.js +170 -0
  62. package/src/talons/SubCategoryPage/useSubCategoryPage.js +0 -3
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Retrieve background images from a master format node
3
+ *
4
+ * @param node
5
+ * @returns {{mobileImage: null, desktopImage: null}}
6
+ */
7
+ export function getBackgroundImages(node) {
8
+ const images = node.getAttribute('data-background-images');
9
+ const response = {
10
+ desktopImage: null,
11
+ mobileImage: null,
12
+ backgroundSize: node.style.backgroundSize,
13
+ backgroundPosition: node.style.backgroundPosition,
14
+ backgroundAttachment: node.style.backgroundAttachment,
15
+ backgroundRepeat: node.style.backgroundRepeat || 'repeat'
16
+ };
17
+
18
+ if (images) {
19
+ const imagesStructure = JSON.parse(images.replace(/\\"/g, '"'));
20
+ if (imagesStructure.desktop_image) {
21
+ response.desktopImage = imagesStructure.desktop_image;
22
+ }
23
+ if (imagesStructure.mobile_image) {
24
+ response.mobileImage = imagesStructure.mobile_image;
25
+ }
26
+ }
27
+
28
+ return response;
29
+ }
30
+
31
+ const alignmentToFlex = {
32
+ top: 'flex-start',
33
+ middle: 'center',
34
+ bottom: 'flex-end'
35
+ };
36
+
37
+ /**
38
+ * Retrieve vertical alignment from a master format node
39
+ *
40
+ * @param node
41
+ * @returns {{verticalAlignment: null}}
42
+ */
43
+ export function getVerticalAlignment(node) {
44
+ let verticalAlignment = null;
45
+ if (node.style.justifyContent) {
46
+ verticalAlignment = flexToVerticalAlignment(node.style.justifyContent);
47
+ }
48
+
49
+ return {
50
+ verticalAlignment
51
+ };
52
+ }
53
+
54
+ /**
55
+ * Convert vertical alignment values to flex values
56
+ *
57
+ * @param alignment
58
+ * @returns {*}
59
+ */
60
+ export function verticalAlignmentToFlex(alignment) {
61
+ return alignmentToFlex[alignment];
62
+ }
63
+
64
+ /**
65
+ * Convert flex to vertical alignment values
66
+ *
67
+ * @param flex
68
+ * @returns {*}
69
+ */
70
+ export function flexToVerticalAlignment(flex) {
71
+ const flexToAlignment = Object.assign(
72
+ {},
73
+ ...Object.entries(alignmentToFlex).map(([a, b]) => ({ [b]: a }))
74
+ );
75
+ return flexToAlignment[flex];
76
+ }
77
+
78
+ /**
79
+ * Retrieve advanced props from content type node
80
+ *
81
+ * @param node
82
+ * @returns {{border: (string|string[]|string), marginRight: (*|string), borderColor: *, paddingBottom: (*|number|string), borderRadius: *, borderWidth: *, paddingRight: (*|number|string), marginBottom: (*|string), paddingTop: (*|string), paddingLeft: (*|string), marginTop: (*|string), marginLeft: (*|string|{get}|number)}}
83
+ */
84
+ export function getAdvanced(node) {
85
+ return {
86
+ ...getPadding(node),
87
+ ...getMargin(node),
88
+ ...getBorder(node),
89
+ ...getTextAlign(node),
90
+ ...getCssClasses(node),
91
+ ...getIsHidden(node)
92
+ };
93
+ }
94
+
95
+ /**
96
+ * Retrieve the padding from a content type node
97
+ *
98
+ * @param node
99
+ * @returns {{paddingBottom: *, paddingRight: *, paddingTop: *, paddingLeft: *}}
100
+ */
101
+ export function getPadding(node) {
102
+ return {
103
+ paddingTop: node.style.paddingTop,
104
+ paddingRight: node.style.paddingRight,
105
+ paddingBottom: node.style.paddingBottom,
106
+ paddingLeft: node.style.paddingLeft
107
+ };
108
+ }
109
+
110
+ /**
111
+ * Retrieve the margin from a content type node
112
+ *
113
+ * @param node
114
+ * @returns {{marginRight: *, marginBottom: *, marginTop: *, marginLeft: *}}
115
+ */
116
+ export function getMargin(node) {
117
+ return {
118
+ marginTop: node.style.marginTop,
119
+ marginRight: node.style.marginRight,
120
+ marginBottom: node.style.marginBottom,
121
+ marginLeft: node.style.marginLeft
122
+ };
123
+ }
124
+
125
+ /**
126
+ * Retrieve the border from a content type node
127
+ *
128
+ * @param node
129
+ * @returns {{border: (string|string), borderColor: *, borderRadius: *, borderWidth: *}}
130
+ */
131
+ export function getBorder(node) {
132
+ return {
133
+ border: node.style.borderStyle,
134
+ borderColor: node.style.borderColor,
135
+ borderWidth: node.style.borderWidth,
136
+ borderRadius: node.style.borderRadius
137
+ };
138
+ }
139
+
140
+ /**
141
+ * Retrieve the text align from a content type node
142
+ *
143
+ * @param node
144
+ * @returns {{textAlign: *}}
145
+ */
146
+ export function getTextAlign(node) {
147
+ return {
148
+ textAlign: node.style.textAlign
149
+ };
150
+ }
151
+
152
+ /**
153
+ * Retrieve the CSS classes from a content type node
154
+ * @param node
155
+ * @returns {{cssClasses: any}}
156
+ */
157
+ export function getCssClasses(node) {
158
+ return {
159
+ cssClasses: node.getAttribute('class')
160
+ ? node.getAttribute('class').split(' ')
161
+ : []
162
+ };
163
+ }
164
+
165
+ /**
166
+ * Retrieve if CSS display property is set to none from a content type node
167
+ *
168
+ * @param node
169
+ * @returns {{isHidden: boolean}}
170
+ */
171
+ export function getIsHidden(node) {
172
+ return {
173
+ isHidden: node.style.display === 'none'
174
+ };
175
+ }
176
+
177
+ /**
178
+ * Converts a CSS string style into a JSX object inline style
179
+ *
180
+ * @param {String} style
181
+ * @returns {Object}
182
+ */
183
+ export function cssToJSXStyle(style) {
184
+ const toCamelCase = str => str.replace(/-(.)/g, (_, p) => p.toUpperCase());
185
+ const result = {};
186
+ style.split(';').forEach(el => {
187
+ const [prop, value] = el.split(':');
188
+ if (prop) {
189
+ result[toCamelCase(prop.trim())] = value.trim();
190
+ }
191
+ });
192
+
193
+ return result;
194
+ }
195
+
196
+ /**
197
+ * Retrieve media queries from a master format node
198
+ *
199
+ * @param node
200
+ * @param {Array} mediaQueries
201
+ *
202
+ * @returns {{mediaQueries: {media: string, style: string}}}
203
+ */
204
+ export function getMediaQueries(node) {
205
+ const response = [];
206
+ const dataset = Object.keys(node.dataset);
207
+
208
+ const medias = dataset
209
+ .filter(key => key.match(/media-/))
210
+ .map(key => node.dataset[key]);
211
+
212
+ const styles = dataset
213
+ .filter(key => key.match(/mediaStyle/))
214
+ .map(key => node.dataset[key]);
215
+
216
+ medias.forEach((media, i) => {
217
+ response.push({
218
+ media,
219
+ style: cssToJSXStyle(styles[i])
220
+ });
221
+ });
222
+
223
+ return { mediaQueries: response };
224
+ }
@@ -160,7 +160,7 @@ export const useFilterSidebar = props => {
160
160
  },
161
161
  {
162
162
  'label': 'Sale',
163
- 'value': 'sale',
163
+ 'value': 'special_price',
164
164
  'path': '',
165
165
  'options': [
166
166
  {'value':'0','label':'No','title':'No'},
@@ -552,11 +552,13 @@ export const useProductFullDetail = props => {
552
552
  shortDescription: product.short_description,
553
553
  name: product.name,
554
554
  price: productPrice?.final_price,
555
+ price_range: product?.price_range,
555
556
  sku: product.sku,
556
557
  term_and_conditions: product.term_and_conditions,
557
558
  shipping_policy: product.shipping_policy,
558
559
  return_policy: product.return_policy,
559
- preorder: product.preorder
560
+ preorder: product.preorder,
561
+ auction_data: product.auction_data
560
562
  };
561
563
 
562
564
  const sellerDetails = {
@@ -21,6 +21,9 @@ export const ProductsFragment = gql`
21
21
  preorder_notes
22
22
  preorder_availability
23
23
  }
24
+ auction_data {
25
+ is_auction
26
+ }
24
27
  seller {
25
28
  name
26
29
  }
@@ -34,6 +34,9 @@ export const ProductDetailsFragment = gql`
34
34
  }
35
35
  meta_description
36
36
  name
37
+ special_price
38
+ special_from_date
39
+ special_to_date
37
40
  price {
38
41
  regularPrice {
39
42
  amount {
@@ -48,12 +51,48 @@ export const ProductDetailsFragment = gql`
48
51
  currency
49
52
  value
50
53
  }
54
+ regular_price {
55
+ currency
56
+ value
57
+ }
51
58
  discount {
52
59
  amount_off
53
60
  }
54
61
  }
55
62
  }
56
63
  sku
64
+ auction_data {
65
+ is_auction
66
+ status
67
+ customer_id
68
+ starting_price
69
+ reserve_price
70
+ days
71
+ min_qty
72
+ max_qty
73
+ start_auction_time
74
+ stop_auction_time
75
+ auction_status
76
+ increment_opt
77
+ increment_price
78
+ auto_auction_opt
79
+ featured_auction
80
+ buy_it_now
81
+ max_amount
82
+ min_amount
83
+ current_time_stamp
84
+ continue_time
85
+ limit_bids
86
+ time_zone
87
+ stop_auction_utc_time
88
+ start_auction_utc_time
89
+ today_time
90
+ start_auction_time_stamp
91
+ stop_auction_time_stamp
92
+ new_auction_start
93
+ customer_name
94
+ max_bids
95
+ }
57
96
  preorder {
58
97
  is_preorder
59
98
  preorder_notes
@@ -0,0 +1,73 @@
1
+ import React, { Fragment } from 'react';
2
+ import { shape, string } from 'prop-types';
3
+
4
+ import CMSPageShimmer from './cms.shimmer';
5
+ import { useCmsPage } from '@magento/peregrine/lib/talons/Cms/useCmsPage';
6
+ import RichContent from '@magento/venia-ui/lib/components/RichContent';
7
+ import { Meta, StoreTitle } from '@magento/venia-ui/lib/components/Head';
8
+ import { useStyle } from '@magento/venia-ui/lib/classify';
9
+ import { toCamelCase } from '@magento/venia-ui/lib/util/toCamelCase';
10
+
11
+ import defaultClasses from './cms.module.css';
12
+
13
+ const CMSPage = props => {
14
+ const { identifier } = props;
15
+
16
+ const talonProps = useCmsPage({ identifier });
17
+ const { cmsPage, shouldShowLoadingIndicator } = talonProps;
18
+ const classes = useStyle(defaultClasses, props.classes);
19
+
20
+ if (shouldShowLoadingIndicator) {
21
+ return <CMSPageShimmer classes={classes} />;
22
+ }
23
+
24
+ const {
25
+ content_heading,
26
+ title,
27
+ meta_title,
28
+ meta_description,
29
+ page_layout,
30
+ content
31
+ } = cmsPage;
32
+
33
+ const headingElement =
34
+ content_heading !== '' ? (
35
+ <h1 data-cy="Cms-contentHeading" className={classes.heading}>
36
+ {content_heading}
37
+ </h1>
38
+ ) : null;
39
+
40
+ const pageTitle = meta_title || title;
41
+ const rootClassName = page_layout
42
+ ? classes[`root_${toCamelCase(page_layout)}`]
43
+ : classes.root;
44
+ return (
45
+ <Fragment>
46
+ <StoreTitle>{pageTitle}</StoreTitle>
47
+ <Meta name="title" content={pageTitle} />
48
+ <Meta name="description" content={meta_description} />
49
+ <article className={rootClassName}>
50
+ {headingElement}
51
+ <RichContent html={content} />
52
+ </article>
53
+ </Fragment>
54
+ );
55
+ };
56
+
57
+ CMSPage.propTypes = {
58
+ identifier: string,
59
+ classes: shape({
60
+ root: string,
61
+ heading: string,
62
+ root_empty: string,
63
+ root_1column: string,
64
+ root_2columnsLeft: string,
65
+ root_2columnsRight: string,
66
+ root_3columns: string,
67
+ root_cmsFullWidth: string,
68
+ root_categoryFullWidth: string,
69
+ root_productFullWidth: string
70
+ })
71
+ };
72
+
73
+ export default CMSPage;
@@ -0,0 +1,25 @@
1
+ .root {
2
+ composes: px-0 from global;
3
+ }
4
+
5
+ .heading {
6
+ composes: mb-2 from global;
7
+ composes: mt-4 from global;
8
+ composes: text-center from global;
9
+ composes: text-3xl from global;
10
+
11
+ /* Medium */
12
+ composes: md_mb-10 from global;
13
+ composes: md_text-4xl from global;
14
+ }
15
+
16
+ .root_empty,
17
+ .root_1column,
18
+ .root_2columnsLeft,
19
+ .root_2columnsRight,
20
+ .root_3columns,
21
+ .root_cmsFullWidth,
22
+ .root_categoryFullWidth,
23
+ .root_productFullWidth {
24
+ composes: root;
25
+ }
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+
3
+ import Shimmer from '@magento/venia-ui/lib/components/Shimmer/shimmer.js';
4
+ import { useStyle } from '@magento/venia-ui/lib/classify';
5
+
6
+ import defaultClasses from './cms.module.css';
7
+
8
+ const CMSPageShimmer = props => {
9
+ const classes = useStyle(defaultClasses, props.classes);
10
+
11
+ return (
12
+ <div className={classes.root} aria-live="polite" aria-busy="true">
13
+ <Shimmer width="100%" height="880px" key="banner" />
14
+ </div>
15
+ );
16
+ };
17
+
18
+ export default CMSPageShimmer;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @RootComponent
3
+ * description = 'Basic CMS Page'
4
+ * pageTypes = CMS_PAGE
5
+ */
6
+
7
+ export { default } from './cms';
@@ -12,6 +12,8 @@ import { useIntl } from 'react-intl';
12
12
  import ShopBy from '@riosst100/pwa-marketplace/src/components/ShopBy/shopBy';
13
13
  import SubCategoryPage from '@riosst100/pwa-marketplace/src/components/CustomSubCategoryPage/subCategoryPage';
14
14
  import ShopBySets from '@riosst100/pwa-marketplace/src/components/ShopBySets/shopBySets';
15
+ import { useLocation } from 'react-router-dom';
16
+ import SportCardsSets from '@riosst100/pwa-marketplace/src/components/SportCardsSets/sportCardsSets';
15
17
 
16
18
  const MESSAGES = new Map().set(
17
19
  'NOT_FOUND',
@@ -24,6 +26,12 @@ const Category = props => {
24
26
 
25
27
  const { location } = globalThis;
26
28
 
29
+ const { pathname } = useLocation();
30
+
31
+ const pathnameArr = pathname.split('/');
32
+
33
+ const parentCategoryUrlKey = pathnameArr[pathnameArr.length - 2].replace('.html','');
34
+
27
35
  const query = new URLSearchParams(location.search);
28
36
  const shopby = query.get('shopby') || null;
29
37
  const showSubcategory = query.get('show_subcategory') || null;
@@ -76,7 +84,10 @@ const Category = props => {
76
84
  categoryId={uid}
77
85
  isLoading={loading} />
78
86
  ) : (
79
- shopby == "sets" || shopby == "expansion_sets" || shopby == "release_year" ? <ShopBySets
87
+ shopby == "release" && parentCategoryUrlKey == "sport-cards" ? <SportCardsSets
88
+ categoryId={uid}
89
+ shopby={shopby}
90
+ isLoading={loading} /> : shopby == "sets" || shopby == "expansion_sets" || shopby == "release_year" ? <ShopBySets
80
91
  categoryId={uid}
81
92
  shopby={shopby}
82
93
  isLoading={loading} /> : (shopby ? (
@@ -108,25 +108,13 @@ const CategoryContent = props => {
108
108
  }
109
109
 
110
110
  if (activeLetter == "all" || activeLetter != "all" && firstLetter == activeLetter) {
111
- if (activeTab == "preorder") {
112
- const preorderData = item.preorder;
113
- if (preorderData) {
114
- const isPreOrder = preorderData && preorderData.is_preorder ? true : false;
115
- if (isPreOrder) {
116
- return galleryItems.push(item);
117
- }
118
- }
119
- } else {
120
- return galleryItems.push(item);
121
- }
111
+ return galleryItems.push(item);
122
112
  }
123
113
  }
124
114
  }),
125
115
  [items, activeLetter, activeTab]
126
116
  });
127
117
 
128
- console.log(galleryItems)
129
-
130
118
  const sidebarRef = useRef(null);
131
119
  const classes = useStyle(defaultClasses, props.classes);
132
120
  const shouldRenderSidebarContent = useIsInViewport({
@@ -0,0 +1,131 @@
1
+ import React, { useCallback } from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { array, func, shape, string } from 'prop-types';
4
+
5
+ import { useToasts } from '@magento/peregrine';
6
+ import { useDelayedTransition } from '@magento/peregrine/lib/hooks/useDelayedTransition';
7
+ import { useApp } from '@magento/peregrine/lib/talons/App/useApp';
8
+
9
+ import globalCSS from '../../index.module.css';
10
+ import { HeadProvider, StoreTitle } from '@magento/venia-ui/lib/components/Head';
11
+ import Main from '../Main';
12
+ import Mask from '@magento/venia-ui/lib/components/Mask';
13
+ import Navigation from '@magento/venia-ui/lib/components/Navigation';
14
+ import Routes from '@magento/venia-ui/lib/components/Routes';
15
+ import ToastContainer from '@magento/venia-ui/lib/components/ToastContainer';
16
+ import Icon from '@magento/venia-ui/lib/components/Icon';
17
+
18
+ import {
19
+ AlertCircle as AlertCircleIcon,
20
+ CloudOff as CloudOffIcon,
21
+ Wifi as WifiIcon
22
+ } from 'react-feather';
23
+
24
+ const OnlineIcon = <Icon src={WifiIcon} attrs={{ width: 18 }} />;
25
+ const OfflineIcon = <Icon src={CloudOffIcon} attrs={{ width: 18 }} />;
26
+ const ErrorIcon = <Icon src={AlertCircleIcon} attrs={{ width: 18 }} />;
27
+
28
+ const App = props => {
29
+ const { markErrorHandled, renderError, unhandledErrors } = props;
30
+ const { formatMessage } = useIntl();
31
+ const [, { addToast }] = useToasts();
32
+ useDelayedTransition();
33
+
34
+ const ERROR_MESSAGE = formatMessage({
35
+ id: 'app.errorUnexpected',
36
+ defaultMessage: 'Sorry! An unexpected error occurred.'
37
+ });
38
+
39
+ const handleIsOffline = useCallback(() => {
40
+ addToast({
41
+ type: 'error',
42
+ icon: OfflineIcon,
43
+ message: formatMessage({
44
+ id: 'app.errorOffline',
45
+ defaultMessage:
46
+ 'You are offline. Some features may be unavailable.'
47
+ }),
48
+ timeout: 3000
49
+ });
50
+ }, [addToast, formatMessage]);
51
+
52
+ const handleIsOnline = useCallback(() => {
53
+ addToast({
54
+ type: 'info',
55
+ icon: OnlineIcon,
56
+ message: formatMessage({
57
+ id: 'app.infoOnline',
58
+ defaultMessage: 'You are online.'
59
+ }),
60
+ timeout: 3000
61
+ });
62
+ }, [addToast, formatMessage]);
63
+
64
+ const handleError = useCallback(
65
+ (error, id, loc, handleDismissError) => {
66
+ const errorToastProps = {
67
+ icon: ErrorIcon,
68
+ message: `${ERROR_MESSAGE}\nDebug: ${id} ${loc}`,
69
+ onDismiss: remove => {
70
+ handleDismissError();
71
+ remove();
72
+ },
73
+ timeout: 15000,
74
+ type: 'error'
75
+ };
76
+
77
+ addToast(errorToastProps);
78
+ },
79
+ [ERROR_MESSAGE, addToast]
80
+ );
81
+
82
+ const talonProps = useApp({
83
+ handleError,
84
+ handleIsOffline,
85
+ handleIsOnline,
86
+ markErrorHandled,
87
+ renderError,
88
+ unhandledErrors
89
+ });
90
+
91
+ const { hasOverlay, handleCloseDrawer } = talonProps;
92
+
93
+ if (renderError) {
94
+ return (
95
+ <HeadProvider>
96
+ <StoreTitle />
97
+ <Main isMasked={true} />
98
+ <Mask isActive={true} />
99
+ <ToastContainer />
100
+ </HeadProvider>
101
+ );
102
+ }
103
+
104
+ return (
105
+ <HeadProvider>
106
+ <StoreTitle />
107
+ <Main isMasked={hasOverlay}>
108
+ <Routes />
109
+ </Main>
110
+ <Mask
111
+ isActive={hasOverlay}
112
+ dismiss={handleCloseDrawer}
113
+ data-cy="App-Mask-button"
114
+ />
115
+ <Navigation />
116
+ <ToastContainer />
117
+ </HeadProvider>
118
+ );
119
+ };
120
+
121
+ App.propTypes = {
122
+ markErrorHandled: func.isRequired,
123
+ renderError: shape({
124
+ stack: string
125
+ }),
126
+ unhandledErrors: array
127
+ };
128
+
129
+ App.globalCSS = globalCSS;
130
+
131
+ export default App;
@@ -20,7 +20,7 @@ const CurrentFilters = props => {
20
20
  const { title, value } = item || {};
21
21
  const key = `${group}::${title}_${value}`;
22
22
 
23
- const customAttributeLandingPage = ['card_set', 'sc_baseball_release','auction','sale','lof_preorder'];
23
+ const customAttributeLandingPage = ['card_set', 'sc_baseball_release','auction','special_price','lof_preorder'];
24
24
 
25
25
  if (!customAttributeLandingPage.includes(group)) {
26
26
  elements.push(
@@ -91,7 +91,7 @@ const FilterSidebar = props => {
91
91
  const groupName = filterNames.get(group);
92
92
  const frontendInput = filterFrontendInput.get(group);
93
93
 
94
- const hideFilters = ['lof_preorder','auction','sale'];
94
+ const hideFilters = ['lof_preorder','auction','special_price'];
95
95
  if (!hideFilters.includes(group)) {
96
96
  // if (!allowedFilters && !allowedFiltersArr.length && group != "category_uid" || allowedFilters && allowedFiltersArr.length && allowedFiltersArr.includes(group)) {
97
97
 
@@ -97,7 +97,14 @@ const GalleryItem = props => {
97
97
  to={productLink}
98
98
  className={rootClassName}
99
99
  >
100
- <div data-cy="GalleryItem-root" className={cn(classes.root, 'border border-gray-100 rounded-lg hover_shadow-type-1 ')} ref={itemRef}>
100
+ <div
101
+ data-cy="GalleryItem-root"
102
+ className={cn(
103
+ classes.root,
104
+ 'border border-gray-100 rounded-lg hover_shadow-type-1 bg-white min-h-[388px]'
105
+ )}
106
+ ref={itemRef}
107
+ >
101
108
  <div className={cn('item-product relative z-[1]')}>
102
109
  <ProductLabel item={item} />
103
110
  <Link
@@ -125,7 +132,7 @@ const GalleryItem = props => {
125
132
  <Link
126
133
  onClick={handleLinkClick}
127
134
  to={productLink}
128
- className={classes.name}
135
+ className={cn(classes.name, 'xs_!no-underline')}
129
136
  data-cy="GalleryItem-name"
130
137
  >
131
138
  <span>{name}</span>