@rebuy/rebuy-hydrogen 3.0.0-beta.10 → 3.0.0-beta.2

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 (97) hide show
  1. package/dist/components/AddToCartBtn/AddToCartBtn.d.ts.map +1 -1
  2. package/dist/components/AddToCartBtn/HydrogenAddToCartBtn.d.ts.map +1 -1
  3. package/dist/components/AddToCartBtn/HydrogenReactAddToCartBtn.d.ts.map +1 -1
  4. package/dist/components/ProductCard/ProductCard.d.ts.map +1 -1
  5. package/dist/components/ProductPrice/ProductPrice.d.ts +1 -1
  6. package/dist/components/ProductPrice/ProductPrice.d.ts.map +1 -1
  7. package/dist/components/VariantSelect/VariantSelect.d.ts +1 -1
  8. package/dist/components/VariantSelect/VariantSelect.d.ts.map +1 -1
  9. package/dist/hooks/titleLevel.d.ts.map +1 -1
  10. package/dist/index.css +88 -88
  11. package/dist/index.css.map +4 -4
  12. package/dist/index.js +421 -195
  13. package/dist/index.js.map +4 -4
  14. package/dist/index.mjs +430 -196
  15. package/dist/index.mjs.map +4 -4
  16. package/dist/providers/RebuyHydrogenContextProvider.d.ts +1 -1
  17. package/dist/providers/RebuyHydrogenContextProvider.d.ts.map +1 -1
  18. package/dist/providers/RebuyHydrogenReactContextProvider.d.ts.map +1 -1
  19. package/dist/providers/types.d.ts +1 -7
  20. package/dist/providers/types.d.ts.map +1 -1
  21. package/dist/types/rebuyCustom.d.ts +0 -1
  22. package/dist/types/rebuyCustom.d.ts.map +1 -1
  23. package/dist/types/shopify.d.ts.map +1 -1
  24. package/dist/types/widgets.d.ts +1 -1
  25. package/dist/types/widgets.d.ts.map +1 -1
  26. package/dist/utils/convertToRebuyProduct.d.ts.map +1 -1
  27. package/dist/utils/createContextParameters.d.ts.map +1 -1
  28. package/dist/utils/getEncodedAttributes.d.ts.map +1 -1
  29. package/dist/utils/getRebuyConfig.d.ts +1 -1
  30. package/dist/utils/getRebuyConfig.d.ts.map +1 -1
  31. package/dist/widgetContainer/RebuyWidgetContainer.d.ts +1 -1
  32. package/dist/widgetContainer/RebuyWidgetContainer.d.ts.map +1 -1
  33. package/dist/widgets/RebuyCompleteTheLook/RebuyCompleteTheLook.d.ts.map +1 -1
  34. package/dist/widgets/RebuyDynamicBundleProducts/BundleImages.d.ts.map +1 -1
  35. package/dist/widgets/RebuyDynamicBundleProducts/BundlePrice.d.ts.map +1 -1
  36. package/dist/widgets/RebuyDynamicBundleProducts/BundleSelection.d.ts +1 -1
  37. package/dist/widgets/RebuyDynamicBundleProducts/BundleSelection.d.ts.map +1 -1
  38. package/dist/widgets/RebuyDynamicBundleProducts/RebuyDynamicBundleProducts.d.ts.map +1 -1
  39. package/dist/widgets/RebuyDynamicBundleProducts/Select.d.ts.map +1 -1
  40. package/dist/widgets/RebuyProductAddOns/RebuyProductAddOnCard.d.ts.map +1 -1
  41. package/dist/widgets/RebuyProductAddOns/RebuyProductAddOns.d.ts.map +1 -1
  42. package/dist/widgets/RebuyProductAddOns/types.d.ts.map +1 -1
  43. package/dist/widgets/RebuyProductRecommendations/RebuyProductRecommendations.d.ts.map +1 -1
  44. package/package.json +36 -48
  45. package/src/components/AddToCartBtn/AddToCartBtn.tsx +45 -0
  46. package/src/components/AddToCartBtn/HydrogenAddToCartBtn.tsx +43 -0
  47. package/src/components/AddToCartBtn/HydrogenReactAddToCartBtn.tsx +35 -0
  48. package/src/components/AddToCartBtn/index.ts +1 -0
  49. package/src/components/AddToCartBtn/types.ts +27 -0
  50. package/src/components/ProductCard/ProductCard.tsx +70 -0
  51. package/src/components/ProductCard/index.ts +1 -0
  52. package/src/components/ProductCard/types.ts +10 -0
  53. package/src/components/ProductPrice/ProductPrice.tsx +49 -0
  54. package/src/components/ProductPrice/index.ts +1 -0
  55. package/src/components/Title/Title.tsx +19 -0
  56. package/src/components/Title/index.ts +1 -0
  57. package/src/components/Title/types.ts +7 -0
  58. package/src/components/VariantSelect/VariantSelect.tsx +45 -0
  59. package/src/components/VariantSelect/index.ts +1 -0
  60. package/src/components/VariantSelect/types.ts +6 -0
  61. package/src/context/RebuyContext.tsx +9 -0
  62. package/src/hooks/titleLevel.tsx +42 -0
  63. package/src/index.ts +7 -0
  64. package/src/providers/RebuyHydrogenContextProvider.tsx +112 -0
  65. package/src/providers/RebuyHydrogenReactContextProvider.tsx +192 -0
  66. package/src/providers/types.ts +58 -0
  67. package/src/queries/cart.queries.ts +467 -0
  68. package/src/types/common.ts +8 -0
  69. package/src/types/css.d.ts +11 -0
  70. package/src/types/env.d.ts +12 -0
  71. package/src/types/rebuy.d.ts +31 -0
  72. package/src/types/rebuyCustom.ts +263 -0
  73. package/src/types/rebuySmartCart.ts +188 -0
  74. package/src/types/shopify.ts +142 -0
  75. package/src/types/widgets.ts +29 -0
  76. package/src/utils/convertToRebuyProduct.tsx +319 -0
  77. package/src/utils/createContextParameters.ts +142 -0
  78. package/src/utils/getEncodedAttributes.ts +11 -0
  79. package/src/utils/getRebuyConfig.ts +31 -0
  80. package/src/widgetContainer/RebuyWidgetContainer.tsx +183 -0
  81. package/src/widgets/RebuyCompleteTheLook/RebuyCompleteTheLook.tsx +50 -0
  82. package/src/widgets/RebuyCompleteTheLook/index.ts +1 -0
  83. package/src/widgets/RebuyCompleteTheLook/types.ts +5 -0
  84. package/src/widgets/RebuyDynamicBundleProducts/BundleImages.tsx +62 -0
  85. package/src/widgets/RebuyDynamicBundleProducts/BundlePrice.tsx +93 -0
  86. package/src/widgets/RebuyDynamicBundleProducts/BundleSelection.tsx +65 -0
  87. package/src/widgets/RebuyDynamicBundleProducts/RebuyDynamicBundleProducts.tsx +118 -0
  88. package/src/widgets/RebuyDynamicBundleProducts/Select.tsx +41 -0
  89. package/src/widgets/RebuyDynamicBundleProducts/index.ts +1 -0
  90. package/src/widgets/RebuyDynamicBundleProducts/types.ts +23 -0
  91. package/src/widgets/RebuyProductAddOns/RebuyProductAddOnCard.tsx +66 -0
  92. package/src/widgets/RebuyProductAddOns/RebuyProductAddOns.tsx +218 -0
  93. package/src/widgets/RebuyProductAddOns/index.ts +1 -0
  94. package/src/widgets/RebuyProductAddOns/types.ts +24 -0
  95. package/src/widgets/RebuyProductRecommendations/RebuyProductRecommendations.tsx +50 -0
  96. package/src/widgets/RebuyProductRecommendations/index.ts +1 -0
  97. package/src/widgets/RebuyProductRecommendations/types.ts +5 -0
@@ -0,0 +1,218 @@
1
+ import { Money } from '@shopify/hydrogen-react';
2
+ import { useCallback, useEffect, useState } from 'react';
3
+
4
+ import { RebuyProductAddOnCard } from './RebuyProductAddOnCard';
5
+
6
+ import styles from './RebuyProductAddOns.module.css';
7
+
8
+ import type {
9
+ CurrencyCode,
10
+ MoneyV2,
11
+ } from '@shopify/hydrogen-react/storefront-api-types';
12
+ import type { RebuyProduct } from '~/types/rebuyCustom';
13
+ import type { RebuyProductAddOnProps } from '~/widgets/RebuyProductAddOns/types';
14
+
15
+ import { AddToCartBtn } from '~/components/AddToCartBtn';
16
+ import { Title } from '~/components/Title';
17
+ import { getTitleLevel } from '~/hooks/titleLevel';
18
+ import { convertToRebuyProduct } from '~/utils/convertToRebuyProduct';
19
+
20
+ export const RebuyProductAddOns = (props: RebuyProductAddOnProps) => {
21
+ const {
22
+ addToCartCallback,
23
+ customTitle = `These pair with ${props.product?.title}`,
24
+ customTitleLevel = 'h2',
25
+ customTitleStyle,
26
+ includeMainProduct = false,
27
+ isHydrogenReact,
28
+ learnMoreText = 'Learn more',
29
+ outOfStockText = 'Out of stock',
30
+ product,
31
+ products = [],
32
+ addToCartBtnText = 'Add to cart',
33
+ subtotalText = 'Add-ons Subtotal: ',
34
+ withProductText = `With ${product?.title}: `,
35
+ } = props;
36
+
37
+ const [addedItems, setAddedItems] = useState<RebuyProduct[]>(products);
38
+
39
+ const [subtotalWithProduct, setSubtotalWithProduct] = useState<MoneyV2>();
40
+ const [subtotalWithOutProduct, setSubtotalWithOutProduct] =
41
+ useState<MoneyV2>();
42
+
43
+ useEffect(() => {
44
+ let initialTotal = 0;
45
+ let currencyCode = 'USD' as CurrencyCode;
46
+
47
+ products.map((product) => {
48
+ product.selectedVariant = product.variants.nodes[0];
49
+ product.selected = true;
50
+
51
+ if (product.selectedVariant?.priceV2) {
52
+ initialTotal += Number(product.selectedVariant.priceV2.amount);
53
+ currencyCode = (product.selectedVariant.priceV2.currencyCode ||
54
+ 'USD') as CurrencyCode;
55
+ }
56
+ });
57
+
58
+ setSubtotalWithProduct({
59
+ amount: String(initialTotal),
60
+ currencyCode,
61
+ });
62
+
63
+ setSubtotalWithOutProduct({
64
+ amount: String(
65
+ initialTotal -
66
+ Number(
67
+ isHydrogenReact
68
+ ? product?.selectedVariant?.price.amount
69
+ : product?.selectedOrFirstAvailableVariant?.price
70
+ .amount
71
+ )
72
+ ),
73
+ currencyCode,
74
+ });
75
+ setAddedItems(products);
76
+ if (includeMainProduct) {
77
+ setAddedItems([
78
+ convertToRebuyProduct(isHydrogenReact || false, product),
79
+ ...products,
80
+ ]);
81
+ } else {
82
+ setAddedItems(products);
83
+ }
84
+ }, [products, product, isHydrogenReact, includeMainProduct]);
85
+
86
+ const handleChange = useCallback(
87
+ (event: React.ChangeEvent<HTMLInputElement>, product: RebuyProduct) => {
88
+ const newProducts = [...products];
89
+ const productIndex = newProducts.findIndex(
90
+ (p) => p.id === product.id
91
+ );
92
+
93
+ if (productIndex !== -1) {
94
+ newProducts[productIndex] = {
95
+ ...newProducts[productIndex],
96
+ selected: event.target.checked,
97
+ };
98
+
99
+ product.selected = event.target.checked;
100
+
101
+ if (event.target.checked) {
102
+ setAddedItems((prev) => [...prev, product]);
103
+ } else {
104
+ setAddedItems((prev) =>
105
+ prev.filter((item) => item.id !== product.id)
106
+ );
107
+ }
108
+ }
109
+ },
110
+ [products]
111
+ );
112
+
113
+ useEffect(() => {
114
+ let total = 0;
115
+ let currencyCode = 'USD' as CurrencyCode;
116
+
117
+ addedItems.forEach((item) => {
118
+ if (item.selected && item.selectedVariant?.priceV2) {
119
+ total += Number(item.selectedVariant.priceV2.amount);
120
+ currencyCode = (item.selectedVariant.priceV2.currencyCode ||
121
+ 'USD') as CurrencyCode;
122
+ }
123
+ });
124
+
125
+ setSubtotalWithProduct({
126
+ amount: String(total),
127
+ currencyCode,
128
+ });
129
+
130
+ setSubtotalWithOutProduct({
131
+ amount: String(
132
+ total -
133
+ Number(
134
+ isHydrogenReact
135
+ ? product?.selectedVariant?.price.amount
136
+ : product?.selectedOrFirstAvailableVariant?.price
137
+ .amount
138
+ )
139
+ ),
140
+ currencyCode,
141
+ });
142
+ }, [addedItems, product, isHydrogenReact]);
143
+
144
+ if (products.length === 0) {
145
+ console.log('RebuyProductAddOns: No products found');
146
+ return null;
147
+ }
148
+
149
+ return (
150
+ <div className={styles.container}>
151
+ <Title
152
+ level={getTitleLevel(customTitleLevel)}
153
+ style={customTitleStyle}
154
+ text={customTitle}
155
+ />
156
+ <ul className={styles.productAddOnsList}>
157
+ {products.map((product) => (
158
+ <li key={product.id}>
159
+ <RebuyProductAddOnCard
160
+ handleChange={handleChange}
161
+ learnMoreText={learnMoreText}
162
+ outOfStockText={outOfStockText}
163
+ product={product}
164
+ titleLevel={getTitleLevel(customTitleLevel, true)}
165
+ />
166
+ </li>
167
+ ))}
168
+ </ul>
169
+ <div className={styles.productAddOnsFooter}>
170
+ <div className={styles.moneyContainer}>
171
+ {subtotalText}
172
+ {subtotalWithOutProduct && (
173
+ <Money
174
+ data={subtotalWithOutProduct}
175
+ withoutTrailingZeros
176
+ />
177
+ )}
178
+ </div>
179
+ {includeMainProduct && (
180
+ <div className={styles.moneyContainer}>
181
+ {withProductText}
182
+ {subtotalWithProduct && (
183
+ <Money
184
+ data={subtotalWithProduct}
185
+ withoutTrailingZeros
186
+ />
187
+ )}
188
+ </div>
189
+ )}
190
+ <div className={styles.addCartBtnContainer}>
191
+ {includeMainProduct ? (
192
+ <AddToCartBtn
193
+ addToCartBtnText={addToCartBtnText}
194
+ addToCartCallback={addToCartCallback}
195
+ disabled={addedItems.length === 0}
196
+ isHydrogenReact={isHydrogenReact}
197
+ moneyData={subtotalWithProduct}
198
+ selectedVariants={addedItems.map(
199
+ (item) => item.selectedVariant
200
+ )}
201
+ />
202
+ ) : (
203
+ <AddToCartBtn
204
+ addToCartBtnText={addToCartBtnText}
205
+ addToCartCallback={addToCartCallback}
206
+ disabled={addedItems.length === 0}
207
+ isHydrogenReact={isHydrogenReact}
208
+ moneyData={subtotalWithOutProduct}
209
+ selectedVariants={addedItems.map(
210
+ (item) => item.selectedVariant
211
+ )}
212
+ />
213
+ )}
214
+ </div>
215
+ </div>
216
+ </div>
217
+ );
218
+ };
@@ -0,0 +1 @@
1
+ export * from './RebuyProductAddOns';
@@ -0,0 +1,24 @@
1
+ import type { ProductCardTitleLevel } from '~/types/common';
2
+ import type { RebuyProduct } from '~/types/rebuyCustom';
3
+ import type { WidgetChildProps } from '~/types/widgets';
4
+
5
+ export type RebuyProductAddOnProps = {
6
+ addToCartBtnText?: string;
7
+ includeMainProduct?: boolean;
8
+ learnMoreText?: string;
9
+ outOfStockText?: string;
10
+ subtotalText?: string;
11
+ withProductText?: string;
12
+ } & WidgetChildProps;
13
+
14
+ export type RebuyProductAddOnCardProps = {
15
+ handleChange: (
16
+ event: React.ChangeEvent<HTMLInputElement>,
17
+ product: RebuyProduct
18
+ ) => void;
19
+
20
+ learnMoreText?: string;
21
+ outOfStockText?: string;
22
+ product: RebuyProduct;
23
+ titleLevel: ProductCardTitleLevel;
24
+ };
@@ -0,0 +1,50 @@
1
+ import styles from './RebuyProductRecommendations.module.css';
2
+
3
+ import type { RebuyProductRecommendationsProps } from './types';
4
+
5
+ import { ProductCard } from '~/components/ProductCard';
6
+ import { Title } from '~/components/Title';
7
+ import { getTitleLevel } from '~/hooks/titleLevel';
8
+
9
+ export const RebuyProductRecommendations = (
10
+ props: RebuyProductRecommendationsProps
11
+ ) => {
12
+ const {
13
+ addToCartBtnText = 'Add to cart',
14
+ addToCartCallback,
15
+ customTitle = `These pair with ${props.product?.title}`,
16
+ customTitleLevel = 'h2',
17
+ customTitleStyle,
18
+ products = [],
19
+ } = props;
20
+
21
+ if (products.length === 0) {
22
+ console.log('RebuyProductRecommendations: No products found');
23
+ return null;
24
+ }
25
+ return (
26
+ <section className={styles.container}>
27
+ <Title
28
+ level={getTitleLevel(customTitleLevel)}
29
+ style={customTitleStyle}
30
+ text={customTitle}
31
+ />
32
+ <ul className={styles.productGrid}>
33
+ {products.map((product) => (
34
+ <li className={styles.productItem} key={product.id}>
35
+ <ProductCard
36
+ addToCartBtnText={addToCartBtnText}
37
+ addToCartCallback={addToCartCallback}
38
+ isHydrogenReact={props.isHydrogenReact}
39
+ product={product}
40
+ productCardTitleLevel={getTitleLevel(
41
+ customTitleLevel,
42
+ true
43
+ )}
44
+ />
45
+ </li>
46
+ ))}
47
+ </ul>
48
+ </section>
49
+ );
50
+ };
@@ -0,0 +1 @@
1
+ export { RebuyProductRecommendations } from './RebuyProductRecommendations';
@@ -0,0 +1,5 @@
1
+ import type { WidgetChildProps } from '~/types/widgets';
2
+
3
+ export type RebuyProductRecommendationsProps = {
4
+ addToCartBtnText?: string;
5
+ } & WidgetChildProps;