@faststore/components 2.0.85-alpha.0 → 2.0.87-alpha.0

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
@@ -76,6 +76,8 @@ export { default as SearchTop, SearchTopTerm } from './molecules/SearchTop';
76
76
  export type { SearchTopProps, SearchTopTermProps } from './molecules/SearchTop';
77
77
  export { default as SelectField } from './molecules/SelectField';
78
78
  export type { SelectFieldProps } from './molecules/SelectField';
79
+ export { default as SkuSelector } from './molecules/SkuSelector';
80
+ export type { SkuSelectorProps, SkuOption } from './molecules/SkuSelector';
79
81
  export { Table, TableBody, TableCell, TableFooter, TableHead, TableRow, } from './molecules/Table';
80
82
  export type { TableProps, TableBodyProps, TableCellProps, TableFooterProps, TableHeadProps, TableRowProps, } from './molecules/Table';
81
83
  export { default as Tag } from './molecules/Tag';
package/dist/index.js CHANGED
@@ -43,6 +43,7 @@ export { default as SearchHistory, SearchHistoryTerm, } from './molecules/Search
43
43
  export { default as SearchProducts, SearchProductItem, SearchProductItemImage, SearchProductItemContent, } from './molecules/SearchProducts';
44
44
  export { default as SearchTop, SearchTopTerm } from './molecules/SearchTop';
45
45
  export { default as SelectField } from './molecules/SelectField';
46
+ export { default as SkuSelector } from './molecules/SkuSelector';
46
47
  export { Table, TableBody, TableCell, TableFooter, TableHead, TableRow, } from './molecules/Table';
47
48
  export { default as Tag } from './molecules/Tag';
48
49
  export { default as Toast } from './molecules/Toast';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { FunctionComponent, HTMLAttributes } from 'react';
2
+ import React from 'react';
3
+ import { LinkProps, LinkElementType } from '../..';
4
+ import { Variant } from './useDefineVariant';
5
+ export interface SkuOption {
6
+ /**
7
+ * Alternative text description of the image.
8
+ */
9
+ alt?: string;
10
+ /**
11
+ * Image URL.
12
+ */
13
+ src?: string;
14
+ /**
15
+ * Label to describe the option when selected. This is mandatory if you want to use the `image` variant.'
16
+ */
17
+ label: string;
18
+ /**
19
+ * Current value for this option.
20
+ */
21
+ value: string;
22
+ /**
23
+ * Specifies that this option should be disabled.
24
+ */
25
+ disabled?: boolean;
26
+ /**
27
+ * Hex color code for this option. This is mandatory if you want to use the `Color` variant.
28
+ */
29
+ hexColor?: string;
30
+ }
31
+ export interface SkuSelectorProps extends HTMLAttributes<HTMLDivElement> {
32
+ /**
33
+ * ID to find this component in testing tools (e.g.: cypress,
34
+ * testing-library, and jest).
35
+ */
36
+ testId?: string;
37
+ /**
38
+ * ID of the current instance of the component.
39
+ */
40
+ id?: string;
41
+ /**
42
+ * SKU options that should be rendered.
43
+ */
44
+ availableVariations: Record<string, SkuOption[]>;
45
+ /**
46
+ * Name of the SKU property that this selector is relative to.
47
+ */
48
+ skuPropertyName: string;
49
+ /**
50
+ * Currently active variation's value.
51
+ */
52
+ activeVariations: Record<string, string>;
53
+ /**
54
+ * Optional variant type, when is not passed the type is inferred based on options properties
55
+ */
56
+ variant?: Variant;
57
+ /**
58
+ * Extends all Link Props.
59
+ */
60
+ linkProps?: Partial<LinkProps<LinkElementType>>;
61
+ /**
62
+ * Optional function to determines the href string.
63
+ */
64
+ getItemHref?: (option: SkuOption) => string;
65
+ /**
66
+ * Maps property value combinations to their respective SKU's slug
67
+ */
68
+ slugsMap: Record<string, string>;
69
+ /**
70
+ * Function that returns a React component that will be used to render images.
71
+ */
72
+ ImageComponent?: FunctionComponent<{
73
+ src: string;
74
+ alt: string;
75
+ }>;
76
+ }
77
+ declare const SkuSelector: React.ForwardRefExoticComponent<SkuSelectorProps & React.RefAttributes<HTMLDivElement>>;
78
+ export default SkuSelector;
@@ -0,0 +1,31 @@
1
+ import React, { forwardRef } from 'react';
2
+ import { Label, SROnly, Link } from '../..';
3
+ import { useDefineVariant } from './useDefineVariant';
4
+ import { useSkuSlug } from './useSkuSlug';
5
+ // TODO: Change by ImageComponent when it be right
6
+ const ImageComponentFallback = ({ src, alt, ...otherProps }) => React.createElement("img", { src: src, alt: alt, ...otherProps });
7
+ const SkuSelector = forwardRef(function SkuSelector({ availableVariations, skuPropertyName, testId, activeVariations, linkProps, slugsMap, getItemHref: getItemHrefProp, ImageComponent = ImageComponentFallback, variant: variantProp, ...otherProps }, ref) {
8
+ const activeSelectorValue = activeVariations[skuPropertyName];
9
+ const options = availableVariations[skuPropertyName];
10
+ const variant = useDefineVariant(options, variantProp);
11
+ const { getItemHref } = useSkuSlug(activeVariations, slugsMap, skuPropertyName, getItemHrefProp);
12
+ return (React.createElement("div", { ref: ref, "data-fs-sku-selector": true, "data-testid": testId, "data-fs-sku-selector-variant": variant, ...otherProps },
13
+ skuPropertyName && (React.createElement(Label, { "data-fs-sku-selector-title": true },
14
+ skuPropertyName,
15
+ ": ",
16
+ React.createElement("strong", null, activeSelectorValue))),
17
+ React.createElement("ul", { "data-fs-sku-selector-list": true }, options.map((option, index) => {
18
+ return (React.createElement("li", { key: String(index), title: option.label, "data-fs-sku-selector-option": true, "data-fs-sku-selector-disabled": option.disabled, "data-fs-sku-selector-checked": option.value === activeVariations[skuPropertyName] },
19
+ React.createElement(Link, { "data-fs-sku-selector-option-link": true, href: getItemHref(option), ...linkProps },
20
+ React.createElement(SROnly, { text: option.label })),
21
+ variant === 'label' && React.createElement("span", null, option.value),
22
+ variant === 'image' && ImageComponent && (React.createElement("span", null,
23
+ React.createElement(ImageComponent, { src: option.src ?? '', alt: option.alt ?? '', "data-fs-sku-selector-option-image": true }))),
24
+ variant === 'color' && (React.createElement("span", null,
25
+ React.createElement("div", { "data-fs-sku-selector-option-color": true, title: option.value, style: {
26
+ '--data-fs-sku-selector-option-color-bkg-color': option.hexColor,
27
+ } })))));
28
+ }))));
29
+ });
30
+ export default SkuSelector;
31
+ //# sourceMappingURL=SkuSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkuSelector.js","sourceRoot":"","sources":["../../../src/molecules/SkuSelector/SkuSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAA8B,MAAM,OAAO,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAW,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,kDAAkD;AAClD,MAAM,sBAAsB,GAAuC,CAAC,EAClE,GAAG,EACH,GAAG,EACH,GAAG,UAAU,EACd,EAAE,EAAE,CAAC,6BAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAM,UAAU,GAAI,CAAA;AA4EjD,MAAM,WAAW,GAAG,UAAU,CAC5B,SAAS,WAAW,CAClB,EACE,mBAAmB,EACnB,eAAe,EACf,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,WAAW,EAAE,eAAe,EAC5B,cAAc,GAAG,sBAAsB,EACvC,OAAO,EAAE,WAAW,EACpB,GAAG,UAAU,EACd,EACD,GAAG;IAEH,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAA;IAEpD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAEtD,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,CAAC,CAAA;IAEhG,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,+CAEK,MAAM,kCACW,OAAO,KACjC,UAAU;QAEb,eAAe,IAAI,CAClB,oBAAC,KAAK;YACH,eAAe;;YAAG,oCAAS,mBAAmB,CAAU,CACnD,CACT;QACD,iEACG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC7B,OAAO,CACL,4BACE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAClB,KAAK,EAAE,MAAM,CAAC,KAAK,wEAEY,MAAM,CAAC,QAAQ,kCAE5C,MAAM,CAAC,KAAK,KAAK,gBAAgB,CAAC,eAAe,CAAC;gBAGpD,oBAAC,IAAI,8CAEH,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,KACrB,SAAS;oBAEb,oBAAC,MAAM,IAAC,IAAI,EAAE,MAAM,CAAC,KAAK,GAAI,CACzB;gBAEN,OAAO,KAAK,OAAO,IAAI,kCAAO,MAAM,CAAC,KAAK,CAAQ;gBAElD,OAAO,KAAK,OAAO,IAAI,cAAc,IAAI,CACxC;oBACE,oBAAC,cAAc,IACb,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,EACrB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,8CAErB,CACG,CACR;gBAEA,OAAO,KAAK,OAAO,IAAI,CACtB;oBACE,wEAEE,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,KAAK,EACH;4BACE,+CAA+C,EAC7C,MAAM,CAAC,QAAQ;yBACK,GAErB,CACF,CACR,CACE,CACN,CAAA;QACH,CAAC,CAAC,CACC,CACD,CACP,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from './SkuSelector';
2
+ export type { SkuSelectorProps, SkuOption } from './SkuSelector';
@@ -0,0 +1,2 @@
1
+ export { default } from './SkuSelector';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/molecules/SkuSelector/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { SkuOption } from './SkuSelector';
2
+ export type Variant = 'image' | 'color' | 'label';
3
+ export declare const useDefineVariant: (options: SkuOption[], variant?: Variant) => Variant;
@@ -0,0 +1,27 @@
1
+ import { useMemo } from 'react';
2
+ const getImageName = (src) => {
3
+ const sourcePath = new URL(src).pathname;
4
+ const imageName = sourcePath.split('/').at(-1);
5
+ return imageName;
6
+ };
7
+ export const useDefineVariant = (options, variant) => useMemo(() => {
8
+ if (variant)
9
+ return variant;
10
+ const allOptionsHaveHexColor = options.every((option) => option.hexColor);
11
+ if (allOptionsHaveHexColor) {
12
+ return 'color';
13
+ }
14
+ const firstImageName = options[0]?.src && getImageName(options[0].src);
15
+ const areSourcesEqualsOrNull = options.every((option) => {
16
+ if (!option.src) {
17
+ return true;
18
+ }
19
+ const optionImageName = getImageName(option.src);
20
+ return optionImageName === firstImageName;
21
+ });
22
+ if (!areSourcesEqualsOrNull) {
23
+ return 'image';
24
+ }
25
+ return 'label';
26
+ }, [options, variant]);
27
+ //# sourceMappingURL=useDefineVariant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDefineVariant.js","sourceRoot":"","sources":["../../../src/molecules/SkuSelector/useDefineVariant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAK/B,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IACnC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;IACxC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAoB,EAAE,OAAiB,EAAW,EAAE,CACnF,OAAO,CAAC,GAAG,EAAE;IACX,IAAG,OAAO;QAAE,OAAO,OAAO,CAAA;IAE1B,MAAM,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzE,IAAI,sBAAsB,EAAE;QAC1B,OAAO,OAAO,CAAA;KACf;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAEtE,MAAM,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,OAAO,IAAI,CAAA;SACZ;QACD,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChD,OAAO,eAAe,KAAK,cAAc,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sBAAsB,EAAE;QAC3B,OAAO,OAAO,CAAA;KACf;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { SkuOption } from './SkuSelector';
2
+ export declare const useSkuSlug: (activeVariations: Record<string, string>, slugsMap: Record<string, string>, skuPropertyName: string, getItemHrefProp?: ((option: SkuOption) => string) | undefined) => {
3
+ getItemHref: (option: SkuOption) => string | {
4
+ getItemHrefProp: (option: SkuOption) => string;
5
+ };
6
+ };
@@ -0,0 +1,23 @@
1
+ import { useCallback } from 'react';
2
+ function getSkuSlug(slugsMap, selectedVariations, dominantVariation) {
3
+ const slugsMapKey = Object.entries(selectedVariations).flat().join('-');
4
+ if (slugsMapKey in slugsMap) {
5
+ return slugsMap[slugsMapKey];
6
+ }
7
+ const possibleVariants = Object.keys(slugsMap);
8
+ const firstVariationForDominantValue = possibleVariants.find((slug) => slug.includes(`${dominantVariation}-${selectedVariations[dominantVariation]}`));
9
+ return slugsMap[firstVariationForDominantValue ?? possibleVariants[0]];
10
+ }
11
+ export const useSkuSlug = (activeVariations, slugsMap, skuPropertyName, getItemHrefProp) => {
12
+ const getItemHref = useCallback((option) => {
13
+ if (getItemHrefProp)
14
+ return { getItemHrefProp };
15
+ const currentItemHref = `/${getSkuSlug(slugsMap, {
16
+ ...activeVariations,
17
+ [skuPropertyName]: option.value,
18
+ }, skuPropertyName)}/p`;
19
+ return currentItemHref;
20
+ }, [activeVariations, getItemHrefProp, slugsMap, skuPropertyName]);
21
+ return { getItemHref };
22
+ };
23
+ //# sourceMappingURL=useSkuSlug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSkuSlug.js","sourceRoot":"","sources":["../../../src/molecules/SkuSelector/useSkuSlug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAGnC,SAAS,UAAU,CACjB,QAAgC,EAChC,kBAA0C,EAC1C,iBAAyB;IAEzB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEvE,IAAI,WAAW,IAAI,QAAQ,EAAE;QAC3B,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAA;KAC7B;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAE9C,MAAM,8BAA8B,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACpE,IAAI,CAAC,QAAQ,CACX,GAAG,iBAAiB,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAChE,CACF,CAAA;IAED,OAAO,QAAQ,CAAC,8BAA8B,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,gBAAwC,EACxC,QAAgC,EAChC,eAAuB,EACvB,eAA+C,EAC/C,EAAE;IACF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,MAAiB,EAAE,EAAE;QACpB,IAAG,eAAe;YAAE,OAAO,EAAE,eAAe,EAAE,CAAA;QAE9C,MAAM,eAAe,GAAG,IAAI,UAAU,CACpC,QAAQ,EACR;YACE,GAAG,gBAAgB;YACnB,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,KAAK;SAChC,EACD,eAAe,CAChB,IAAI,CAAA;QACL,OAAO,eAAe,CAAA;IACxB,CAAC,EACD,CAAC,gBAAgB,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,CAAC,CAC/D,CAAA;IACD,OAAO,EAAE,WAAW,EAAE,CAAA;AACxB,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/components",
3
- "version": "2.0.85-alpha.0",
3
+ "version": "2.0.87-alpha.0",
4
4
  "module": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
6
6
  "author": "Emerson Laurentino @emersonlaurentino",
@@ -30,5 +30,5 @@
30
30
  "node": "16.18.0",
31
31
  "yarn": "1.19.1"
32
32
  },
33
- "gitHead": "24590eae428eae6be0b7c43cbec9fe236270794e"
33
+ "gitHead": "b3bf59d620318b0bd4511eb4731eb716006c0fb4"
34
34
  }
package/src/index.ts CHANGED
@@ -148,6 +148,8 @@ export { default as SearchTop, SearchTopTerm } from './molecules/SearchTop'
148
148
  export type { SearchTopProps, SearchTopTermProps } from './molecules/SearchTop'
149
149
  export { default as SelectField } from './molecules/SelectField'
150
150
  export type { SelectFieldProps } from './molecules/SelectField'
151
+ export { default as SkuSelector } from './molecules/SkuSelector'
152
+ export type { SkuSelectorProps, SkuOption } from './molecules/SkuSelector'
151
153
  export {
152
154
  Table,
153
155
  TableBody,
@@ -0,0 +1,181 @@
1
+ /* eslint-disable @next/next/no-img-element */
2
+ import type { FunctionComponent, HTMLAttributes } from 'react'
3
+ import React, { forwardRef } from 'react'
4
+ import { Label, SROnly, Link, LinkProps, LinkElementType } from '../..'
5
+ import { useDefineVariant, Variant } from './useDefineVariant'
6
+ import { useSkuSlug } from './useSkuSlug'
7
+
8
+
9
+ // TODO: Change by ImageComponent when it be right
10
+ const ImageComponentFallback: SkuSelectorProps['ImageComponent'] = ({
11
+ src,
12
+ alt,
13
+ ...otherProps
14
+ }) => <img src={src} alt={alt} {...otherProps} />
15
+
16
+ export interface SkuOption {
17
+ /**
18
+ * Alternative text description of the image.
19
+ */
20
+ alt?: string
21
+ /**
22
+ * Image URL.
23
+ */
24
+ src?: string
25
+ /**
26
+ * Label to describe the option when selected. This is mandatory if you want to use the `image` variant.'
27
+ */
28
+ label: string
29
+ /**
30
+ * Current value for this option.
31
+ */
32
+ value: string
33
+ /**
34
+ * Specifies that this option should be disabled.
35
+ */
36
+ disabled?: boolean
37
+ /**
38
+ * Hex color code for this option. This is mandatory if you want to use the `Color` variant.
39
+ */
40
+ hexColor?: string
41
+ }
42
+
43
+ export interface SkuSelectorProps extends HTMLAttributes<HTMLDivElement> {
44
+ /**
45
+ * ID to find this component in testing tools (e.g.: cypress,
46
+ * testing-library, and jest).
47
+ */
48
+ testId?: string
49
+ /**
50
+ * ID of the current instance of the component.
51
+ */
52
+ id?: string
53
+ /**
54
+ * SKU options that should be rendered.
55
+ */
56
+ availableVariations: Record<string, SkuOption[]>
57
+ /**
58
+ * Name of the SKU property that this selector is relative to.
59
+ */
60
+ skuPropertyName: string
61
+ /**
62
+ * Currently active variation's value.
63
+ */
64
+ activeVariations: Record<string, string>
65
+ /**
66
+ * Optional variant type, when is not passed the type is inferred based on options properties
67
+ */
68
+ variant?: Variant
69
+ /**
70
+ * Extends all Link Props.
71
+ */
72
+ linkProps?: Partial<LinkProps<LinkElementType>>
73
+ /**
74
+ * Optional function to determines the href string.
75
+ */
76
+ getItemHref?: (option: SkuOption) => string
77
+ /**
78
+ * Maps property value combinations to their respective SKU's slug
79
+ */
80
+ slugsMap: Record<string, string>
81
+ /**
82
+ * Function that returns a React component that will be used to render images.
83
+ */
84
+ ImageComponent?: FunctionComponent<{
85
+ src: string
86
+ alt: string
87
+ }>
88
+ }
89
+
90
+ const SkuSelector = forwardRef<HTMLDivElement, SkuSelectorProps>(
91
+ function SkuSelector(
92
+ {
93
+ availableVariations,
94
+ skuPropertyName,
95
+ testId,
96
+ activeVariations,
97
+ linkProps,
98
+ slugsMap,
99
+ getItemHref: getItemHrefProp,
100
+ ImageComponent = ImageComponentFallback,
101
+ variant: variantProp,
102
+ ...otherProps
103
+ },
104
+ ref
105
+ ) {
106
+ const activeSelectorValue = activeVariations[skuPropertyName]
107
+ const options = availableVariations[skuPropertyName]
108
+
109
+ const variant = useDefineVariant(options, variantProp)
110
+
111
+ const { getItemHref } = useSkuSlug(activeVariations, slugsMap, skuPropertyName, getItemHrefProp)
112
+
113
+ return (
114
+ <div
115
+ ref={ref}
116
+ data-fs-sku-selector
117
+ data-testid={testId}
118
+ data-fs-sku-selector-variant={variant}
119
+ {...otherProps}
120
+ >
121
+ {skuPropertyName && (
122
+ <Label data-fs-sku-selector-title>
123
+ {skuPropertyName}: <strong>{activeSelectorValue}</strong>
124
+ </Label>
125
+ )}
126
+ <ul data-fs-sku-selector-list>
127
+ {options.map((option, index) => {
128
+ return (
129
+ <li
130
+ key={String(index)}
131
+ title={option.label}
132
+ data-fs-sku-selector-option
133
+ data-fs-sku-selector-disabled={option.disabled}
134
+ data-fs-sku-selector-checked={
135
+ option.value === activeVariations[skuPropertyName]
136
+ }
137
+ >
138
+ <Link
139
+ data-fs-sku-selector-option-link
140
+ href={getItemHref(option)}
141
+ {...linkProps}
142
+ >
143
+ <SROnly text={option.label} />
144
+ </Link>
145
+
146
+ {variant === 'label' && <span>{option.value}</span>}
147
+
148
+ {variant === 'image' && ImageComponent && (
149
+ <span>
150
+ <ImageComponent
151
+ src={option.src ?? ''}
152
+ alt={option.alt ?? ''}
153
+ data-fs-sku-selector-option-image
154
+ />
155
+ </span>
156
+ )}
157
+
158
+ {variant === 'color' && (
159
+ <span>
160
+ <div
161
+ data-fs-sku-selector-option-color
162
+ title={option.value}
163
+ style={
164
+ {
165
+ '--data-fs-sku-selector-option-color-bkg-color':
166
+ option.hexColor,
167
+ } as React.CSSProperties
168
+ }
169
+ ></div>
170
+ </span>
171
+ )}
172
+ </li>
173
+ )
174
+ })}
175
+ </ul>
176
+ </div>
177
+ )
178
+ }
179
+ )
180
+
181
+ export default SkuSelector
@@ -0,0 +1,2 @@
1
+ export { default } from './SkuSelector'
2
+ export type { SkuSelectorProps, SkuOption } from './SkuSelector'
@@ -0,0 +1,36 @@
1
+ import { useMemo } from 'react'
2
+ import { SkuOption } from './SkuSelector'
3
+
4
+ export type Variant = 'image' | 'color' | 'label'
5
+
6
+ const getImageName = (src: string) => {
7
+ const sourcePath = new URL(src).pathname
8
+ const imageName = sourcePath.split('/').at(-1)
9
+ return imageName
10
+ }
11
+
12
+ export const useDefineVariant = (options: SkuOption[], variant?: Variant): Variant =>
13
+ useMemo(() => {
14
+ if(variant) return variant
15
+
16
+ const allOptionsHaveHexColor = options.every((option) => option.hexColor)
17
+ if (allOptionsHaveHexColor) {
18
+ return 'color'
19
+ }
20
+
21
+ const firstImageName = options[0]?.src && getImageName(options[0].src)
22
+
23
+ const areSourcesEqualsOrNull = options.every((option) => {
24
+ if (!option.src) {
25
+ return true
26
+ }
27
+ const optionImageName = getImageName(option.src)
28
+ return optionImageName === firstImageName
29
+ })
30
+
31
+ if (!areSourcesEqualsOrNull) {
32
+ return 'image'
33
+ }
34
+
35
+ return 'label'
36
+ }, [options, variant])
@@ -0,0 +1,49 @@
1
+ import { useCallback } from 'react'
2
+ import { SkuOption } from './SkuSelector'
3
+
4
+ function getSkuSlug(
5
+ slugsMap: Record<string, string>,
6
+ selectedVariations: Record<string, string>,
7
+ dominantVariation: string
8
+ ) {
9
+ const slugsMapKey = Object.entries(selectedVariations).flat().join('-')
10
+
11
+ if (slugsMapKey in slugsMap) {
12
+ return slugsMap[slugsMapKey]
13
+ }
14
+
15
+ const possibleVariants = Object.keys(slugsMap)
16
+
17
+ const firstVariationForDominantValue = possibleVariants.find((slug) =>
18
+ slug.includes(
19
+ `${dominantVariation}-${selectedVariations[dominantVariation]}`
20
+ )
21
+ )
22
+
23
+ return slugsMap[firstVariationForDominantValue ?? possibleVariants[0]]
24
+ }
25
+
26
+ export const useSkuSlug = (
27
+ activeVariations: Record<string, string>,
28
+ slugsMap: Record<string, string>,
29
+ skuPropertyName: string,
30
+ getItemHrefProp?: (option: SkuOption) => string
31
+ ) => {
32
+ const getItemHref = useCallback(
33
+ (option: SkuOption) => {
34
+ if(getItemHrefProp) return { getItemHrefProp }
35
+
36
+ const currentItemHref = `/${getSkuSlug(
37
+ slugsMap,
38
+ {
39
+ ...activeVariations,
40
+ [skuPropertyName]: option.value,
41
+ },
42
+ skuPropertyName
43
+ )}/p`
44
+ return currentItemHref
45
+ },
46
+ [activeVariations, getItemHrefProp, slugsMap, skuPropertyName]
47
+ )
48
+ return { getItemHref }
49
+ }