@brytdesigns/shopify-ajax-cart-components 1.0.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/jsdelivr/components/cart-context.js +22 -0
- package/dist/jsdelivr/components/cart-context.js.map +1 -0
- package/dist/jsdelivr/components/cart-data-array-item.js +19 -0
- package/dist/jsdelivr/components/cart-data-array-item.js.map +1 -0
- package/dist/jsdelivr/components/cart-data-array.js +58 -0
- package/dist/jsdelivr/components/cart-data-array.js.map +1 -0
- package/dist/jsdelivr/components/cart-data-conditions.js +97 -0
- package/dist/jsdelivr/components/cart-data-conditions.js.map +1 -0
- package/dist/jsdelivr/components/cart-data-injection.js +89 -0
- package/dist/jsdelivr/components/cart-data-injection.js.map +1 -0
- package/dist/jsdelivr/components/cart-data-listener-status.js +35 -0
- package/dist/jsdelivr/components/cart-data-listener-status.js.map +1 -0
- package/dist/jsdelivr/components/cart-data-listener.js +163 -0
- package/dist/jsdelivr/components/cart-data-listener.js.map +1 -0
- package/dist/jsdelivr/components/cart-data.js +29 -0
- package/dist/jsdelivr/components/cart-data.js.map +1 -0
- package/dist/jsdelivr/components/cart-loading-state.js +39 -0
- package/dist/jsdelivr/components/cart-loading-state.js.map +1 -0
- package/dist/jsdelivr/components/index.js +11 -0
- package/dist/jsdelivr/components/index.js.map +1 -0
- package/dist/jsdelivr/hooks/index.js +7 -0
- package/dist/jsdelivr/hooks/index.js.map +1 -0
- package/dist/jsdelivr/hooks/useCartValue.js +23 -0
- package/dist/jsdelivr/hooks/useCartValue.js.map +1 -0
- package/dist/jsdelivr/hooks/useFormattedValue.js +27 -0
- package/dist/jsdelivr/hooks/useFormattedValue.js.map +1 -0
- package/dist/jsdelivr/hooks/useFullPropertyPath.js +35 -0
- package/dist/jsdelivr/hooks/useFullPropertyPath.js.map +1 -0
- package/dist/jsdelivr/hooks/useHybridCart.js +23 -0
- package/dist/jsdelivr/hooks/useHybridCart.js.map +1 -0
- package/dist/jsdelivr/hooks/useListenerStatus.js +33 -0
- package/dist/jsdelivr/hooks/useListenerStatus.js.map +1 -0
- package/dist/jsdelivr/index.js +72 -0
- package/dist/jsdelivr/index.js.map +1 -0
- package/dist/jsdelivr/utils/formatValue.js +22 -0
- package/dist/jsdelivr/utils/formatValue.js.map +1 -0
- package/dist/jsdelivr/utils/getTargetElement.js +13 -0
- package/dist/jsdelivr/utils/getTargetElement.js.map +1 -0
- package/dist/jsdelivr/utils/getTemplateContent.js +11 -0
- package/dist/jsdelivr/utils/getTemplateContent.js.map +1 -0
- package/dist/jsdelivr/utils/getValueFromPath.js +14 -0
- package/dist/jsdelivr/utils/getValueFromPath.js.map +1 -0
- package/dist/jsdelivr/utils/index.js +7 -0
- package/dist/jsdelivr/utils/index.js.map +1 -0
- package/dist/jsdelivr/utils/parseNestedObject.js +32 -0
- package/dist/jsdelivr/utils/parseNestedObject.js.map +1 -0
- package/dist/main/components/cart-context.js +22 -0
- package/dist/main/components/cart-context.js.map +1 -0
- package/dist/main/components/cart-data-array-item.js +19 -0
- package/dist/main/components/cart-data-array-item.js.map +1 -0
- package/dist/main/components/cart-data-array.js +59 -0
- package/dist/main/components/cart-data-array.js.map +1 -0
- package/dist/main/components/cart-data-conditions.js +98 -0
- package/dist/main/components/cart-data-conditions.js.map +1 -0
- package/dist/main/components/cart-data-injection.js +89 -0
- package/dist/main/components/cart-data-injection.js.map +1 -0
- package/dist/main/components/cart-data-listener-status.js +36 -0
- package/dist/main/components/cart-data-listener-status.js.map +1 -0
- package/dist/main/components/cart-data-listener.js +163 -0
- package/dist/main/components/cart-data-listener.js.map +1 -0
- package/dist/main/components/cart-data.js +29 -0
- package/dist/main/components/cart-data.js.map +1 -0
- package/dist/main/components/cart-loading-state.js +39 -0
- package/dist/main/components/cart-loading-state.js.map +1 -0
- package/dist/main/components/index.js +11 -0
- package/dist/main/components/index.js.map +1 -0
- package/dist/main/hooks/index.js +7 -0
- package/dist/main/hooks/index.js.map +1 -0
- package/dist/main/hooks/useAjaxCart.js +23 -0
- package/dist/main/hooks/useAjaxCart.js.map +1 -0
- package/dist/main/hooks/useCartValue.js +23 -0
- package/dist/main/hooks/useCartValue.js.map +1 -0
- package/dist/main/hooks/useFormattedValue.js +27 -0
- package/dist/main/hooks/useFormattedValue.js.map +1 -0
- package/dist/main/hooks/useFullPropertyPath.js +35 -0
- package/dist/main/hooks/useFullPropertyPath.js.map +1 -0
- package/dist/main/hooks/useListenerStatus.js +33 -0
- package/dist/main/hooks/useListenerStatus.js.map +1 -0
- package/dist/main/index.d.ts +14996 -0
- package/dist/main/index.js +72 -0
- package/dist/main/index.js.map +1 -0
- package/dist/main/utils/formatValue.js +22 -0
- package/dist/main/utils/formatValue.js.map +1 -0
- package/dist/main/utils/getTargetElement.js +13 -0
- package/dist/main/utils/getTargetElement.js.map +1 -0
- package/dist/main/utils/getTemplateContent.js +11 -0
- package/dist/main/utils/getTemplateContent.js.map +1 -0
- package/dist/main/utils/getValueFromPath.js +14 -0
- package/dist/main/utils/getValueFromPath.js.map +1 -0
- package/dist/main/utils/index.js +7 -0
- package/dist/main/utils/index.js.map +1 -0
- package/dist/main/utils/parseNestedObject.js +32 -0
- package/dist/main/utils/parseNestedObject.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createEffect, on } from '/npm/solid-js@^1.9.5/+esm';
|
|
2
|
+
import { provideHybridCartContext } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/useHybridCart.js';
|
|
3
|
+
|
|
4
|
+
const CartContext = (props, { element }) => {
|
|
5
|
+
const cart = provideHybridCartContext(element);
|
|
6
|
+
createEffect(
|
|
7
|
+
on(
|
|
8
|
+
() => ({
|
|
9
|
+
cart: cart(),
|
|
10
|
+
debug: props.debug
|
|
11
|
+
}),
|
|
12
|
+
({ cart: cart2, debug }) => {
|
|
13
|
+
if (!debug) return;
|
|
14
|
+
console.log("Cart updated:", cart2);
|
|
15
|
+
}
|
|
16
|
+
)
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { CartContext };
|
|
21
|
+
//# sourceMappingURL=cart-context.js.map
|
|
22
|
+
//# sourceMappingURL=cart-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-context.ts"],"names":["cart"],"mappings":";;;AASO,MAAM,WAAsD,GAAA,CACjE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAM,MAAA,IAAA,GAAO,yBAAyB,OAAO,CAAA;AAC7C,EAAA,YAAA;AAAA,IACE,EAAA;AAAA,MACE,OAAO;AAAA,QACL,MAAM,IAAK,EAAA;AAAA,QACX,OAAO,KAAM,CAAA;AAAA,OACf,CAAA;AAAA,MACA,CAAC,EAAE,IAAAA,EAAAA,KAAAA,EAAM,OAAY,KAAA;AACnB,QAAA,IAAI,CAAC,KAAO,EAAA;AACZ,QAAQ,OAAA,CAAA,GAAA,CAAI,iBAAiBA,KAAI,CAAA;AAAA;AACnC;AACF,GACF;AACF","file":"cart-context.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\n\nimport { createEffect, on } from \"/npm/solid-js@^1.9.5/+esm\";\nimport { provideHybridCartContext } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/useHybridCart.js\";\n\ntype CartContextProps = {\n debug?: boolean;\n};\n\nexport const CartContext: CorrectComponentType<CartContextProps> = (\n props,\n { element },\n) => {\n const cart = provideHybridCartContext(element);\n createEffect(\n on(\n () => ({\n cart: cart(),\n debug: props.debug,\n }),\n ({ cart, debug }) => {\n if (!debug) return;\n console.log(\"Cart updated:\", cart);\n },\n ),\n );\n};\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useFullPropertyPath, provideFullPropertyPathContext } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
2
|
+
|
|
3
|
+
const CartDataArrayItem = (props, { element }) => {
|
|
4
|
+
if (!props.itemIndex)
|
|
5
|
+
return console.warn("cart-data-array-item: No path attribute provided.");
|
|
6
|
+
const mergedProps = {
|
|
7
|
+
element,
|
|
8
|
+
path: () => props.itemIndex
|
|
9
|
+
};
|
|
10
|
+
const fullPath = useFullPropertyPath(mergedProps);
|
|
11
|
+
provideFullPropertyPathContext({
|
|
12
|
+
element,
|
|
13
|
+
path: fullPath
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { CartDataArrayItem };
|
|
18
|
+
//# sourceMappingURL=cart-data-array-item.js.map
|
|
19
|
+
//# sourceMappingURL=cart-data-array-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-data-array-item.ts"],"names":[],"mappings":";;AAYO,MAAM,iBAAkE,GAAA,CAC7E,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,IAAI,CAAC,KAAM,CAAA,SAAA;AACT,IAAO,OAAA,OAAA,CAAQ,KAAK,mDAAmD,CAAA;AACzE,EAAA,MAAM,WAAc,GAAA;AAAA,IAClB,OAAA;AAAA,IACA,IAAA,EAAM,MAAM,KAAM,CAAA;AAAA,GACpB;AACA,EAAM,MAAA,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAChD,EAA+B,8BAAA,CAAA;AAAA,IAC7B,OAAA;AAAA,IACA,IAAM,EAAA;AAAA,GACP,CAAA;AACH","file":"cart-data-array-item.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\n\nimport {\n type ValidHybridPath,\n provideFullPropertyPathContext,\n useFullPropertyPath,\n} from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js\";\n\ntype CartDataArrayItemProps = {\n itemIndex: ValidHybridPath;\n};\n\nexport const CartDataArrayItem: CorrectComponentType<CartDataArrayItemProps> = (\n props,\n { element },\n) => {\n if (!props.itemIndex)\n return console.warn(\"cart-data-array-item: No path attribute provided.\");\n const mergedProps = {\n element,\n path: () => props.itemIndex,\n };\n const fullPath = useFullPropertyPath(mergedProps);\n provideFullPropertyPathContext({\n element,\n path: fullPath,\n });\n};\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getTemplateContent } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js';
|
|
2
|
+
import { Show, For } from '/npm/solid-js@^1.9.5/+esm';
|
|
3
|
+
import { useFullPropertyPath, provideFullPropertyPathContext, useCartValue } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
4
|
+
import html from '/npm/solid-js@^1.9.5/html/+esm';
|
|
5
|
+
|
|
6
|
+
const CartDataArray = (props, { element }) => {
|
|
7
|
+
const itemTemplate = getTemplateContent(element, "item");
|
|
8
|
+
if (!itemTemplate)
|
|
9
|
+
return console.warn(
|
|
10
|
+
"cart-data-array: No template found with a property of 'item'."
|
|
11
|
+
);
|
|
12
|
+
if (!props.arrayPath)
|
|
13
|
+
return console.warn("cart-data-array: No array path provided.");
|
|
14
|
+
const mergedProps = {
|
|
15
|
+
element,
|
|
16
|
+
path: () => props.arrayPath
|
|
17
|
+
};
|
|
18
|
+
const fullPath = useFullPropertyPath(mergedProps);
|
|
19
|
+
provideFullPropertyPathContext({
|
|
20
|
+
element,
|
|
21
|
+
path: fullPath
|
|
22
|
+
});
|
|
23
|
+
const value = useCartValue({
|
|
24
|
+
element,
|
|
25
|
+
path: fullPath
|
|
26
|
+
});
|
|
27
|
+
const arrayValue = () => {
|
|
28
|
+
const v = value();
|
|
29
|
+
if (!v) {
|
|
30
|
+
console.warn(
|
|
31
|
+
`cart-data-array: value is null or undefined at path ${fullPath()}`
|
|
32
|
+
);
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (!Array.isArray(v)) {
|
|
36
|
+
console.warn(
|
|
37
|
+
`cart-data-array: value is not an array at path ${fullPath()}`
|
|
38
|
+
);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return v;
|
|
42
|
+
};
|
|
43
|
+
return html`
|
|
44
|
+
<${Show} when=${() => arrayValue() && arrayValue().length > 0}>
|
|
45
|
+
<${For} each=${arrayValue}>
|
|
46
|
+
${(_, idx) => html`
|
|
47
|
+
<cart-data-array-item item-index=${() => `${idx()}`}>
|
|
48
|
+
${() => Array.from(itemTemplate.cloneNode(true).childNodes)}
|
|
49
|
+
</cart-data-array-item>
|
|
50
|
+
`}
|
|
51
|
+
<//>
|
|
52
|
+
<//>
|
|
53
|
+
`;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export { CartDataArray };
|
|
57
|
+
//# sourceMappingURL=cart-data-array.js.map
|
|
58
|
+
//# sourceMappingURL=cart-data-array.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-data-array.ts"],"names":[],"mappings":";;;;;AAkBO,MAAM,aAA0D,GAAA,CACrE,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAM,MAAA,YAAA,GAAe,kBAAmB,CAAA,OAAA,EAAS,MAAM,CAAA;AACvD,EAAA,IAAI,CAAC,YAAA;AACH,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb;AAAA,KACF;AACF,EAAA,IAAI,CAAC,KAAM,CAAA,SAAA;AACT,IAAO,OAAA,OAAA,CAAQ,KAAK,0CAA0C,CAAA;AAChE,EAAA,MAAM,WAAc,GAAA;AAAA,IAClB,OAAA;AAAA,IACA,IAAA,EAAM,MAAM,KAAM,CAAA;AAAA,GACpB;AACA,EAAM,MAAA,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAChD,EAA+B,8BAAA,CAAA;AAAA,IAC7B,OAAA;AAAA,IACA,IAAM,EAAA;AAAA,GACP,CAAA;AAED,EAAA,MAAM,QAAQ,YAAa,CAAA;AAAA,IACzB,OAAA;AAAA,IACA,IAAM,EAAA;AAAA,GACP,CAAA;AAED,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,IAAI,KAAM,EAAA;AAEhB,IAAA,IAAI,CAAC,CAAG,EAAA;AACN,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,CAAA,oDAAA,EAAuD,UAAU,CAAA;AAAA,OACnE;AACA,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAG,EAAA;AACrB,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,CAAA,+CAAA,EAAkD,UAAU,CAAA;AAAA,OAC9D;AACA,MAAO,OAAA,IAAA;AAAA;AAGT,IAAO,OAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,IAAA;AAAA,KACF,EAAA,IAAI,SAAS,MAAM,UAAA,MAAgB,UAAW,EAAA,CAAG,SAAS,CAAC,CAAA;AAAA,OACzD,EAAA,GAAG,SAAS,UAAU,CAAA;AAAA,QACrB,EAAA,CAAC,GAAQ,GAA0B,KAAA,IAAA;AAAA,2CAAA,EACA,MAAM,CAAA,EAAG,GAAI,EAAC,CAAE,CAAA,CAAA;AAAA,YAC/C,EAAA,MAAM,MAAM,IAAK,CAAA,YAAA,CAAa,UAAU,IAAI,CAAA,CAAE,UAAU,CAAC;AAAA;AAAA,QAE9D,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAIT","file":"cart-data-array.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\nimport { getTemplateContent, type Format } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js\";\n\nimport { Show, For, type Accessor } from \"/npm/solid-js@^1.9.5/+esm\";\n\nimport {\n type ValidHybridPath,\n useFullPropertyPath,\n useCartValue,\n provideFullPropertyPathContext,\n} from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js\";\nimport html from \"/npm/solid-js@^1.9.5/html/+esm\";\n\ntype CartDataArrayProps = {\n arrayPath: ValidHybridPath;\n format?: Format;\n};\n\nexport const CartDataArray: CorrectComponentType<CartDataArrayProps> = (\n props,\n { element },\n) => {\n const itemTemplate = getTemplateContent(element, \"item\");\n if (!itemTemplate)\n return console.warn(\n \"cart-data-array: No template found with a property of 'item'.\",\n );\n if (!props.arrayPath)\n return console.warn(\"cart-data-array: No array path provided.\");\n const mergedProps = {\n element,\n path: () => props.arrayPath,\n };\n const fullPath = useFullPropertyPath(mergedProps);\n provideFullPropertyPathContext({\n element,\n path: fullPath,\n });\n\n const value = useCartValue({\n element,\n path: fullPath,\n });\n\n const arrayValue = () => {\n const v = value();\n\n if (!v) {\n console.warn(\n `cart-data-array: value is null or undefined at path ${fullPath()}`,\n );\n return null;\n }\n\n if (!Array.isArray(v)) {\n console.warn(\n `cart-data-array: value is not an array at path ${fullPath()}`,\n );\n return null;\n }\n\n return v;\n };\n\n return html`\n <${Show} when=${() => arrayValue() && arrayValue()!.length > 0}>\n <${For} each=${arrayValue}>\n ${(_: any, idx: Accessor<number>) => html`\n <cart-data-array-item item-index=${() => `${idx()}`}>\n ${() => Array.from(itemTemplate.cloneNode(true).childNodes)}\n </cart-data-array-item>\n `}\n <//>\n <//>\n `;\n};\n"]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { createMemo, For, Show } from '/npm/solid-js@^1.9.5/+esm';
|
|
2
|
+
import html from '/npm/solid-js@^1.9.5/html/+esm';
|
|
3
|
+
import { useFullPropertyPath, useCartValue } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
4
|
+
import { formatValue, getValueFromPath } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js';
|
|
5
|
+
|
|
6
|
+
function getValue(data, value) {
|
|
7
|
+
if (typeof value === "undefined" || !data) return void 0;
|
|
8
|
+
if (value.type === "primitive") {
|
|
9
|
+
return value.value;
|
|
10
|
+
}
|
|
11
|
+
if (value.type === "property" && value.name) {
|
|
12
|
+
return getValueFromPath(data, value.name);
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function invertResult(result, invert = false) {
|
|
17
|
+
if (invert) return !result;
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
function validateConditions(conditions, data) {
|
|
21
|
+
if (!data) return false;
|
|
22
|
+
const result = conditions.every((condition) => {
|
|
23
|
+
let valueA = getValue(data, condition.valueA), valueB = getValue(data, condition.valueB), result2 = false;
|
|
24
|
+
if (typeof valueA === "undefined" && typeof valueB === "undefined")
|
|
25
|
+
return false;
|
|
26
|
+
if (condition.type === "typeof") {
|
|
27
|
+
result2 = typeof valueA === valueB;
|
|
28
|
+
}
|
|
29
|
+
if (condition.type === "includes_property") {
|
|
30
|
+
result2 = valueA.some(
|
|
31
|
+
(v) => v[condition.valueA?.property_name || ""] === valueB
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
if (condition.type === "equals") {
|
|
35
|
+
result2 = formatValue(condition.format || "", valueA) === formatValue(condition.format || "", valueB);
|
|
36
|
+
}
|
|
37
|
+
if (condition.type === "not_equals") {
|
|
38
|
+
result2 = formatValue(condition.format || "", valueA) !== formatValue(condition.format || "", valueB);
|
|
39
|
+
}
|
|
40
|
+
if (condition.type === "lt") {
|
|
41
|
+
result2 = formatValue(condition.format || "", valueA) < formatValue(condition.format || "", valueB);
|
|
42
|
+
}
|
|
43
|
+
if (condition.type === "lte") {
|
|
44
|
+
result2 = formatValue(condition.format || "", valueA) <= formatValue(condition.format || "", valueB);
|
|
45
|
+
}
|
|
46
|
+
if (condition.type === "gt") {
|
|
47
|
+
result2 = formatValue(condition.format || "", valueA) > formatValue(condition.format || "", valueB);
|
|
48
|
+
}
|
|
49
|
+
if (condition.type === "gte") {
|
|
50
|
+
result2 = formatValue(condition.format || "", valueA) >= formatValue(condition.format || "", valueB);
|
|
51
|
+
}
|
|
52
|
+
return invertResult(result2, condition.invert);
|
|
53
|
+
});
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
const CartDataConditions = (_, { element }) => {
|
|
57
|
+
const conditionTemplates = Array.from(element.children).filter(
|
|
58
|
+
(child) => child.tagName === "TEMPLATE" && child.hasAttribute("conditions")
|
|
59
|
+
);
|
|
60
|
+
if (!conditionTemplates.length)
|
|
61
|
+
return console.error(
|
|
62
|
+
"cart-data-conditions: no templates found with any conditions attribute!"
|
|
63
|
+
);
|
|
64
|
+
const allConditions = createMemo(
|
|
65
|
+
() => conditionTemplates.map((tmpl) => {
|
|
66
|
+
const conditions = tmpl.getAttribute("conditions");
|
|
67
|
+
if (!conditions)
|
|
68
|
+
console.warn("cart-data-conditions: conditions attribute is required!");
|
|
69
|
+
try {
|
|
70
|
+
return JSON.parse(conditions);
|
|
71
|
+
} catch (e) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
);
|
|
76
|
+
const fullPath = useFullPropertyPath({ element });
|
|
77
|
+
const data = useCartValue({
|
|
78
|
+
path: fullPath,
|
|
79
|
+
element
|
|
80
|
+
});
|
|
81
|
+
return html`
|
|
82
|
+
<${For} each=${() => conditionTemplates}>
|
|
83
|
+
${(tmpl, idx) => {
|
|
84
|
+
const conditions = allConditions()[idx()];
|
|
85
|
+
return html`
|
|
86
|
+
<${Show} when=${() => validateConditions(conditions, data())}>
|
|
87
|
+
${() => Array.from(tmpl.content.cloneNode(true).childNodes)}
|
|
88
|
+
<//>
|
|
89
|
+
`;
|
|
90
|
+
}}
|
|
91
|
+
<//>
|
|
92
|
+
`;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export { CartDataConditions };
|
|
96
|
+
//# sourceMappingURL=cart-data-conditions.js.map
|
|
97
|
+
//# sourceMappingURL=cart-data-conditions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-data-conditions.ts"],"names":["result"],"mappings":"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","file":"cart-data-conditions.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\n\nimport { Show, createMemo, For, type Accessor, createEffect } from \"/npm/solid-js@^1.9.5/+esm\";\nimport html from \"/npm/solid-js@^1.9.5/html/+esm\";\n\nimport { useFullPropertyPath, useCartValue } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js\";\nimport { getValueFromPath, formatValue, type Format } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js\";\n\ntype CartDataConditionsProps = {};\n\ntype ConditionValue = {\n type: \"primitive\" | \"property\";\n name?: string;\n value?: string | number | boolean | null;\n property_name?: string;\n};\n\ntype Condition = {\n type:\n | \"typeof\"\n | \"includes_property\"\n | \"equals\"\n | \"not_equals\"\n | \"lt\"\n | \"lte\"\n | \"gt\"\n | \"gte\";\n format?: Format;\n invert?: boolean;\n valueA: ConditionValue;\n valueB: ConditionValue;\n};\n\nfunction getValue<T>(data: T, value: ConditionValue): any {\n if (typeof value === \"undefined\" || !data) return undefined;\n\n if (value.type === \"primitive\") {\n return value.value;\n }\n\n if (value.type === \"property\" && value.name) {\n //@ts-ignore\n return getValueFromPath<T>(data, value.name);\n }\n\n return null;\n}\n\nfunction invertResult(result: boolean, invert = false) {\n if (invert) return !result;\n return result;\n}\n\nfunction validateConditions<T>(conditions: Condition[], data: T) {\n if (!data) return false;\n const result = conditions.every((condition) => {\n let valueA = getValue(data, condition.valueA),\n valueB = getValue(data, condition.valueB),\n result = false;\n\n if (typeof valueA === \"undefined\" && typeof valueB === \"undefined\")\n return false;\n\n if (condition.type === \"typeof\") {\n result = typeof valueA === valueB;\n }\n\n if (condition.type === \"includes_property\") {\n result = valueA.some(\n (v: any) => v[condition.valueA?.property_name || \"\"] === valueB,\n );\n }\n\n if (condition.type === \"equals\") {\n result =\n formatValue(condition.format || \"\", valueA) ===\n formatValue(condition.format || \"\", valueB);\n }\n\n if (condition.type === \"not_equals\") {\n result =\n formatValue(condition.format || \"\", valueA) !==\n formatValue(condition.format || \"\", valueB);\n }\n\n if (condition.type === \"lt\") {\n result =\n formatValue(condition.format || \"\", valueA) <\n formatValue(condition.format || \"\", valueB);\n }\n\n if (condition.type === \"lte\") {\n result =\n formatValue(condition.format || \"\", valueA) <=\n formatValue(condition.format || \"\", valueB);\n }\n\n if (condition.type === \"gt\") {\n result =\n formatValue(condition.format || \"\", valueA) >\n formatValue(condition.format || \"\", valueB);\n }\n\n if (condition.type === \"gte\") {\n result =\n formatValue(condition.format || \"\", valueA) >=\n formatValue(condition.format || \"\", valueB);\n }\n\n return invertResult(result, condition.invert);\n });\n\n return result;\n}\n\nexport const CartDataConditions: CorrectComponentType<\n CartDataConditionsProps\n> = (_, { element }) => {\n const conditionTemplates = Array.from(element.children).filter(\n (child) => child.tagName === \"TEMPLATE\" && child.hasAttribute(\"conditions\"),\n );\n if (!conditionTemplates.length)\n return console.error(\n \"cart-data-conditions: no templates found with any conditions attribute!\",\n );\n\n const allConditions = createMemo(() =>\n conditionTemplates.map((tmpl) => {\n const conditions = tmpl.getAttribute(\"conditions\");\n if (!conditions)\n console.warn(\"cart-data-conditions: conditions attribute is required!\");\n\n try {\n return JSON.parse(conditions!);\n } catch (e) {\n return [];\n }\n }),\n );\n\n const fullPath = useFullPropertyPath({ element });\n const data = useCartValue({\n path: fullPath,\n element,\n });\n\n return html`\n <${For} each=${() => conditionTemplates}>\n ${(tmpl: HTMLTemplateElement, idx: Accessor<number>) => {\n const conditions = allConditions()[idx()];\n return html`\n <${Show} when=${() => validateConditions(conditions, data())}>\n ${() => Array.from(tmpl.content.cloneNode(true).childNodes)}\n <//>\n `;\n }}\n <//>\n `;\n};\n"]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useFullPropertyPath, useFormattedValue } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
2
|
+
import { getTargetElement } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js';
|
|
3
|
+
import { createEffect, on, onCleanup } from '/npm/solid-js@^1.9.5/+esm';
|
|
4
|
+
|
|
5
|
+
const VALID_INJECTION_TYPES = ["attribute", "property", "template"];
|
|
6
|
+
const CartDataInjection = (props, { element }) => {
|
|
7
|
+
if (!props.propertyName)
|
|
8
|
+
return console.warn("cart-data-injection: No path attribute provided.");
|
|
9
|
+
if (!props.target)
|
|
10
|
+
return console.warn("cart-data-injection: No target attribute found!");
|
|
11
|
+
if (!props.attributeName)
|
|
12
|
+
return console.warn(
|
|
13
|
+
"cart-data-injection: No attribute-name attribute found!"
|
|
14
|
+
);
|
|
15
|
+
if (!props.injectionType || props.injectionType && !VALID_INJECTION_TYPES.includes(props.injectionType))
|
|
16
|
+
return console.warn(
|
|
17
|
+
"cart-data-injection: Invalid injection-type attribute provided."
|
|
18
|
+
);
|
|
19
|
+
const mergedProps = {
|
|
20
|
+
element,
|
|
21
|
+
path: () => props.propertyName
|
|
22
|
+
};
|
|
23
|
+
const fullPath = useFullPropertyPath(mergedProps);
|
|
24
|
+
const value = useFormattedValue({
|
|
25
|
+
path: fullPath,
|
|
26
|
+
element,
|
|
27
|
+
get format() {
|
|
28
|
+
return props.format;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
createEffect(
|
|
32
|
+
on(
|
|
33
|
+
() => {
|
|
34
|
+
return {
|
|
35
|
+
target: getTargetElement(element, props.target),
|
|
36
|
+
value: value(),
|
|
37
|
+
attributeName: props.attributeName,
|
|
38
|
+
injectionType: props.injectionType,
|
|
39
|
+
propertyName: props.propertyName
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
({ target, value: value2, attributeName, injectionType, propertyName }) => {
|
|
43
|
+
if (!target)
|
|
44
|
+
return console.warn(
|
|
45
|
+
`cart-data-injection: Unable to find element with selector of: ${props.target}`
|
|
46
|
+
);
|
|
47
|
+
if (injectionType === "attribute" && value2) {
|
|
48
|
+
target.setAttribute(attributeName, value2);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (injectionType === "property" && value2) {
|
|
52
|
+
target[attributeName] = value2;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (injectionType === "template" && value2) {
|
|
56
|
+
if (attributeName === "style") {
|
|
57
|
+
const styleTmpl = target[attributeName].cssText;
|
|
58
|
+
setTimeout(() => {
|
|
59
|
+
target[attributeName].cssText = styleTmpl.replace(
|
|
60
|
+
//@ts-ignore
|
|
61
|
+
`{${propertyName}}`,
|
|
62
|
+
value2
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
return onCleanup(() => {
|
|
66
|
+
target[attributeName].cssText = styleTmpl;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const tmpValue = target.getAttribute(attributeName);
|
|
70
|
+
if (!tmpValue || !value2)
|
|
71
|
+
return console.warn("Unable to inject value into template");
|
|
72
|
+
setTimeout(() => {
|
|
73
|
+
target.setAttribute(
|
|
74
|
+
attributeName,
|
|
75
|
+
tmpValue.replace(`{${propertyName}}`, value2)
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
return onCleanup(() => {
|
|
79
|
+
target.setAttribute(attributeName, tmpValue);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export { CartDataInjection };
|
|
88
|
+
//# sourceMappingURL=cart-data-injection.js.map
|
|
89
|
+
//# sourceMappingURL=cart-data-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-data-injection.ts"],"names":["value"],"mappings":"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","file":"cart-data-injection.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\n\nimport {\n type ValidHybridPath,\n useFormattedValue,\n useFullPropertyPath,\n} from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js\";\nimport { type Format, getTargetElement } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js\";\nimport { createEffect, on, onCleanup } from \"/npm/solid-js@^1.9.5/+esm\";\n\ntype CartDataInjectionProps = {\n propertyName: ValidHybridPath;\n format?: Format;\n target: string;\n attributeName: string;\n injectionType: \"attribute\" | \"property\" | \"template\";\n};\n\nconst VALID_INJECTION_TYPES = [\"attribute\", \"property\", \"template\"];\n\nexport const CartDataInjection: CorrectComponentType<CartDataInjectionProps> = (\n props,\n { element },\n) => {\n if (!props.propertyName)\n return console.warn(\"cart-data-injection: No path attribute provided.\");\n if (!props.target)\n return console.warn(\"cart-data-injection: No target attribute found!\");\n if (!props.attributeName)\n return console.warn(\n \"cart-data-injection: No attribute-name attribute found!\",\n );\n\n if (\n !props.injectionType ||\n (props.injectionType &&\n !VALID_INJECTION_TYPES.includes(props.injectionType))\n )\n return console.warn(\n \"cart-data-injection: Invalid injection-type attribute provided.\",\n );\n\n const mergedProps = {\n element,\n path: () => props.propertyName,\n };\n const fullPath = useFullPropertyPath(mergedProps);\n const value = useFormattedValue({\n path: fullPath,\n element,\n get format() {\n return props.format;\n },\n });\n\n createEffect(\n on(\n () => {\n return {\n target: getTargetElement(element, props.target),\n value: value(),\n attributeName: props.attributeName,\n injectionType: props.injectionType,\n propertyName: props.propertyName,\n };\n },\n ({ target, value, attributeName, injectionType, propertyName }) => {\n if (!target)\n return console.warn(\n `cart-data-injection: Unable to find element with selector of: ${props.target}`,\n );\n\n if (injectionType === \"attribute\" && value) {\n target.setAttribute(attributeName, value);\n return;\n }\n\n if (injectionType === \"property\" && value) {\n //@ts-ignore\n target[attributeName] = value;\n return;\n }\n\n if (injectionType === \"template\" && value) {\n if (attributeName === \"style\") {\n //@ts-ignore\n const styleTmpl = target[attributeName].cssText;\n setTimeout(() => {\n //@ts-ignore\n target[attributeName].cssText = styleTmpl.replace(\n //@ts-ignore\n `{${propertyName}}`,\n value,\n );\n });\n return onCleanup(() => {\n //@ts-ignore\n target[attributeName].cssText = styleTmpl;\n });\n }\n const tmpValue = target.getAttribute(attributeName);\n if (!tmpValue || !value)\n return console.warn(\"Unable to inject value into template\");\n setTimeout(() => {\n target.setAttribute(\n attributeName,\n\n tmpValue.replace(`{${propertyName}}`, value),\n );\n });\n return onCleanup(() => {\n target.setAttribute(attributeName, tmpValue);\n });\n }\n },\n ),\n );\n};\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createMemo } from '/npm/solid-js@^1.9.5/+esm';
|
|
2
|
+
import { useListenerStatus } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
3
|
+
import { getTemplateContent } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js';
|
|
4
|
+
|
|
5
|
+
const CartDataListenerStatus = (props, { element }) => {
|
|
6
|
+
const [status] = useListenerStatus(element);
|
|
7
|
+
if (!status)
|
|
8
|
+
return console.error(
|
|
9
|
+
"cart-data-listener-status: no listener context provided!"
|
|
10
|
+
);
|
|
11
|
+
const templates = {
|
|
12
|
+
default: getTemplateContent(element, "default"),
|
|
13
|
+
loading: getTemplateContent(element, "loading"),
|
|
14
|
+
success: getTemplateContent(element, "success"),
|
|
15
|
+
error: getTemplateContent(element, "error")
|
|
16
|
+
};
|
|
17
|
+
let previousState = null;
|
|
18
|
+
const currentStatus = () => {
|
|
19
|
+
const s = status();
|
|
20
|
+
if (!templates[s]) return previousState;
|
|
21
|
+
previousState = s;
|
|
22
|
+
return s;
|
|
23
|
+
};
|
|
24
|
+
return createMemo(() => {
|
|
25
|
+
const state = currentStatus();
|
|
26
|
+
if (!state) return null;
|
|
27
|
+
const template = templates[state];
|
|
28
|
+
if (!template) return null;
|
|
29
|
+
return Array.from(template.cloneNode(true).childNodes);
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { CartDataListenerStatus };
|
|
34
|
+
//# sourceMappingURL=cart-data-listener-status.js.map
|
|
35
|
+
//# sourceMappingURL=cart-data-listener-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-data-listener-status.ts"],"names":[],"mappings":";;;;AAOO,MAAM,sBAAmD,GAAA,CAC9D,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,MAAM,CAAC,MAAM,CAAI,GAAA,iBAAA,CAAkB,OAAO,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAA;AACH,IAAA,OAAO,OAAQ,CAAA,KAAA;AAAA,MACb;AAAA,KACF;AAEF,EAAA,MAAM,SAAY,GAAA;AAAA,IAChB,OAAA,EAAS,kBAAmB,CAAA,OAAA,EAAS,SAAS,CAAA;AAAA,IAC9C,OAAA,EAAS,kBAAmB,CAAA,OAAA,EAAS,SAAS,CAAA;AAAA,IAC9C,OAAA,EAAS,kBAAmB,CAAA,OAAA,EAAS,SAAS,CAAA;AAAA,IAC9C,KAAA,EAAO,kBAAmB,CAAA,OAAA,EAAS,OAAO;AAAA,GAC5C;AAEA,EAAA,IAAI,aAA+B,GAAA,IAAA;AAEnC,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,MAAM,IAAI,MAAO,EAAA;AACjB,IAAA,IAAI,CAAC,SAAA,CAAU,CAAC,CAAA,EAAU,OAAA,aAAA;AAC1B,IAAgB,aAAA,GAAA,CAAA;AAChB,IAAO,OAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,WAAW,MAAM;AACtB,IAAA,MAAM,QAAQ,aAAc,EAAA;AAC5B,IAAI,IAAA,CAAC,OAAc,OAAA,IAAA;AACnB,IAAM,MAAA,QAAA,GAAW,UAAU,KAAK,CAAA;AAChC,IAAI,IAAA,CAAC,UAAiB,OAAA,IAAA;AACtB,IAAA,OAAO,MAAM,IAAK,CAAA,QAAA,CAAS,SAAU,CAAA,IAAI,EAAE,UAAU,CAAA;AAAA,GACtD,CAAA;AACH","file":"cart-data-listener-status.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\n\nimport { createMemo } from \"/npm/solid-js@^1.9.5/+esm\";\n\nimport { type Status, useListenerStatus } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js\";\nimport { getTemplateContent } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js\";\n\nexport const CartDataListenerStatus: CorrectComponentType<{}> = (\n props,\n { element },\n) => {\n const [status] = useListenerStatus(element);\n if (!status)\n return console.error(\n \"cart-data-listener-status: no listener context provided!\",\n );\n\n const templates = {\n default: getTemplateContent(element, \"default\"),\n loading: getTemplateContent(element, \"loading\"),\n success: getTemplateContent(element, \"success\"),\n error: getTemplateContent(element, \"error\"),\n };\n\n let previousState: Status | null = null;\n\n const currentStatus = () => {\n const s = status();\n if (!templates[s]) return previousState;\n previousState = s;\n return s;\n };\n\n return createMemo(() => {\n const state = currentStatus();\n if (!state) return null;\n const template = templates[state];\n if (!template) return null;\n return Array.from(template.cloneNode(true).childNodes);\n });\n};\n"]}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createEffect, on, onCleanup, createUniqueId } from '/npm/solid-js@^1.9.5/+esm';
|
|
2
|
+
import debounce from '/npm/lodash.debounce@^4.0.8/+esm';
|
|
3
|
+
import { provideListenerStatusContext, useFullPropertyPath, useCartValue } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
4
|
+
import HybridCart from '/npm/@brytdesigns/shopify-hybrid-cart@0.1.29';
|
|
5
|
+
import { parseNestedObject } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js';
|
|
6
|
+
|
|
7
|
+
const CartDataListener = (props, { element }) => {
|
|
8
|
+
const [_, setStatus] = provideListenerStatusContext({
|
|
9
|
+
element,
|
|
10
|
+
get status() {
|
|
11
|
+
return props.status;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
const path = useFullPropertyPath({
|
|
15
|
+
element
|
|
16
|
+
});
|
|
17
|
+
const data = useCartValue({
|
|
18
|
+
element,
|
|
19
|
+
path
|
|
20
|
+
});
|
|
21
|
+
let currentEventId = null;
|
|
22
|
+
createEffect(
|
|
23
|
+
on(
|
|
24
|
+
() => ({
|
|
25
|
+
method: props.method,
|
|
26
|
+
on: props.on,
|
|
27
|
+
preventDefault: props.preventDefault,
|
|
28
|
+
data: data(),
|
|
29
|
+
debounceDelay: props.debounceDelay,
|
|
30
|
+
resetForm: props.resetForm,
|
|
31
|
+
resetStatusDelay: props.resetStatusDelay
|
|
32
|
+
}),
|
|
33
|
+
({
|
|
34
|
+
method,
|
|
35
|
+
on: on2,
|
|
36
|
+
preventDefault,
|
|
37
|
+
data: data2,
|
|
38
|
+
debounceDelay,
|
|
39
|
+
resetForm,
|
|
40
|
+
resetStatusDelay
|
|
41
|
+
}) => {
|
|
42
|
+
if (!method)
|
|
43
|
+
return console.error(
|
|
44
|
+
"cart-item-listener: method property is required!"
|
|
45
|
+
);
|
|
46
|
+
if (!on2)
|
|
47
|
+
return console.error("cart-item-listener: on property is required!");
|
|
48
|
+
let resetStatusId = null, tempEventId = null;
|
|
49
|
+
function onEvent(e) {
|
|
50
|
+
const cart = HybridCart;
|
|
51
|
+
currentEventId = createUniqueId(), tempEventId = currentEventId;
|
|
52
|
+
if (preventDefault) e.preventDefault();
|
|
53
|
+
async function handleStatus(promise) {
|
|
54
|
+
setStatus("loading");
|
|
55
|
+
return promise.then((data3) => {
|
|
56
|
+
setStatus("success");
|
|
57
|
+
return data3;
|
|
58
|
+
}).catch((error) => {
|
|
59
|
+
setStatus("error");
|
|
60
|
+
return error;
|
|
61
|
+
}).finally(() => {
|
|
62
|
+
if (resetStatusDelay > 0) {
|
|
63
|
+
resetStatusId = setTimeout(() => {
|
|
64
|
+
setStatus("default");
|
|
65
|
+
resetStatusId = null;
|
|
66
|
+
}, resetStatusDelay);
|
|
67
|
+
} else {
|
|
68
|
+
setStatus("default");
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (on2 === "submit") {
|
|
73
|
+
let reset2 = function() {
|
|
74
|
+
if (resetForm) form.reset();
|
|
75
|
+
};
|
|
76
|
+
const form = e.target;
|
|
77
|
+
const formData = new FormData(form);
|
|
78
|
+
const formObj = parseNestedObject(
|
|
79
|
+
//@ts-ignore
|
|
80
|
+
Object.fromEntries(formData.entries())
|
|
81
|
+
);
|
|
82
|
+
if (method === "replaceItem") {
|
|
83
|
+
return handleStatus(
|
|
84
|
+
cart.replaceItem({
|
|
85
|
+
key: formObj.key,
|
|
86
|
+
id: formObj.id
|
|
87
|
+
})
|
|
88
|
+
).finally(reset2);
|
|
89
|
+
}
|
|
90
|
+
if (method === "updateItem") {
|
|
91
|
+
return handleStatus(
|
|
92
|
+
cart.updateItem({
|
|
93
|
+
id: formObj.id,
|
|
94
|
+
quantity: formObj?.quantity || void 0,
|
|
95
|
+
properties: formObj?.properties || {},
|
|
96
|
+
selling_plan: formObj?.selling_plan || void 0
|
|
97
|
+
})
|
|
98
|
+
).finally(reset2);
|
|
99
|
+
}
|
|
100
|
+
if (method === "removeItem") {
|
|
101
|
+
return handleStatus(cart.removeItem(formObj.key)).finally(reset2);
|
|
102
|
+
}
|
|
103
|
+
if (method === "addDiscount") {
|
|
104
|
+
return handleStatus(cart.addDiscount(formObj.code)).finally(
|
|
105
|
+
reset2
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
if (method === "removeDiscount") {
|
|
109
|
+
return handleStatus(cart.removeDiscount(formObj.code)).finally(
|
|
110
|
+
reset2
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
if (method === "updateNote") {
|
|
114
|
+
return handleStatus(cart.updateNote(formObj.note)).finally(reset2);
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const input = e.target;
|
|
119
|
+
if (method === "removeItem") {
|
|
120
|
+
return handleStatus(cart.removeItem(data2.key));
|
|
121
|
+
}
|
|
122
|
+
if (method === "updateQuantity") {
|
|
123
|
+
return handleStatus(
|
|
124
|
+
cart.updateItem({
|
|
125
|
+
id: data2.key,
|
|
126
|
+
quantity: input.valueAsNumber
|
|
127
|
+
})
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
if (method === "updateItemVariant") {
|
|
131
|
+
return handleStatus(
|
|
132
|
+
cart.replaceItem({
|
|
133
|
+
key: data2.key,
|
|
134
|
+
id: input.value
|
|
135
|
+
})
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
if (method === "updateNote") {
|
|
139
|
+
return handleStatus(cart.updateNote(input.value));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const handleEvent = debounce(onEvent, debounceDelay), controller = new AbortController();
|
|
143
|
+
element.addEventListener(
|
|
144
|
+
on2,
|
|
145
|
+
(e) => {
|
|
146
|
+
if (preventDefault) e.preventDefault();
|
|
147
|
+
handleEvent(e);
|
|
148
|
+
},
|
|
149
|
+
{ signal: controller.signal }
|
|
150
|
+
);
|
|
151
|
+
return onCleanup(() => {
|
|
152
|
+
controller.abort();
|
|
153
|
+
if (resetStatusId && currentEventId !== tempEventId)
|
|
154
|
+
clearTimeout(resetStatusId);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
);
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export { CartDataListener };
|
|
162
|
+
//# sourceMappingURL=cart-data-listener.js.map
|
|
163
|
+
//# sourceMappingURL=cart-data-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-data-listener.ts"],"names":["on","data","reset"],"mappings":"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","file":"cart-data-listener.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\n\nimport { createEffect, createUniqueId, on, onCleanup } from \"/npm/solid-js@^1.9.5/+esm\";\nimport debounce from \"/npm/lodash.debounce@^4.0.8/+esm\";\n\nimport {\n type Status,\n provideListenerStatusContext,\n useCartValue,\n useFullPropertyPath,\n} from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js\";\nimport HybridCart from \"/npm/@brytdesigns/shopify-hybrid-cart@0.1.29\";\nimport { parseNestedObject } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js\";\n\ntype CartDataListenerProps = {\n status: Status;\n on: string;\n method: string;\n debounceDelay: number;\n resetForm: boolean;\n resetStatusDelay: number;\n preventDefault: boolean;\n};\n\nexport const CartDataListener: CorrectComponentType<CartDataListenerProps> = (\n props,\n { element },\n) => {\n const [_, setStatus] = provideListenerStatusContext({\n element,\n get status() {\n return props.status;\n },\n });\n\n const path = useFullPropertyPath({\n element,\n });\n const data = useCartValue({\n element,\n path,\n });\n\n let currentEventId: string | null = null;\n\n createEffect(\n on(\n () => ({\n method: props.method,\n on: props.on,\n preventDefault: props.preventDefault,\n data: data() as any,\n debounceDelay: props.debounceDelay,\n resetForm: props.resetForm,\n resetStatusDelay: props.resetStatusDelay,\n }),\n ({\n method,\n on,\n preventDefault,\n data,\n debounceDelay,\n resetForm,\n resetStatusDelay,\n }) => {\n if (!method)\n return console.error(\n \"cart-item-listener: method property is required!\",\n );\n if (!on)\n return console.error(\"cart-item-listener: on property is required!\");\n\n let resetStatusId: number | null = null,\n tempEventId: string | null = null;\n\n function onEvent(e: Event) {\n const cart = HybridCart;\n\n (currentEventId = createUniqueId()), (tempEventId = currentEventId);\n\n if (preventDefault) e.preventDefault();\n\n async function handleStatus<T>(promise: Promise<T>) {\n setStatus(\"loading\");\n return promise\n .then((data) => {\n setStatus(\"success\");\n return data;\n })\n .catch((error) => {\n setStatus(\"error\");\n return error;\n })\n .finally(() => {\n if (resetStatusDelay > 0) {\n //@ts-ignore\n resetStatusId = setTimeout(() => {\n setStatus(\"default\");\n resetStatusId = null;\n }, resetStatusDelay);\n } else {\n setStatus(\"default\");\n }\n });\n }\n\n if (on === \"submit\") {\n const form = e.target as HTMLFormElement;\n const formData = new FormData(form);\n const formObj = parseNestedObject(\n //@ts-ignore\n Object.fromEntries(formData.entries()),\n );\n\n function reset() {\n if (resetForm) form.reset();\n }\n\n if (method === \"replaceItem\") {\n return handleStatus(\n cart.replaceItem({\n key: formObj.key,\n id: formObj.id,\n }),\n ).finally(reset);\n }\n\n if (method === \"updateItem\") {\n return handleStatus(\n cart.updateItem({\n id: formObj.id,\n quantity: formObj?.quantity || undefined,\n properties: formObj?.properties || {},\n selling_plan: formObj?.selling_plan || undefined,\n }),\n ).finally(reset);\n }\n\n if (method === \"removeItem\") {\n return handleStatus(cart.removeItem(formObj.key)).finally(reset);\n }\n\n if (method === \"addDiscount\") {\n return handleStatus(cart.addDiscount(formObj.code)).finally(\n reset,\n );\n }\n\n if (method === \"removeDiscount\") {\n return handleStatus(cart.removeDiscount(formObj.code)).finally(\n reset,\n );\n }\n\n if (method === \"updateNote\") {\n return handleStatus(cart.updateNote(formObj.note)).finally(reset);\n }\n\n return;\n }\n\n const input = e.target as HTMLInputElement;\n\n if (method === \"removeItem\") {\n return handleStatus(cart.removeItem(data.key));\n }\n\n if (method === \"updateQuantity\") {\n return handleStatus(\n cart.updateItem({\n id: data.key,\n quantity: input.valueAsNumber,\n }),\n );\n }\n\n if (method === \"updateItemVariant\") {\n return handleStatus(\n cart.replaceItem({\n key: data.key,\n id: input.value,\n }),\n );\n }\n\n if (method === \"updateNote\") {\n return handleStatus(cart.updateNote(input.value));\n }\n }\n const handleEvent = debounce(onEvent, debounceDelay),\n controller = new AbortController();\n\n element.addEventListener(\n on,\n (e) => {\n if (preventDefault) e.preventDefault();\n handleEvent(e);\n },\n { signal: controller.signal },\n );\n\n return onCleanup(() => {\n controller.abort();\n if (resetStatusId && currentEventId !== tempEventId)\n clearTimeout(resetStatusId);\n });\n },\n ),\n );\n};\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js';
|
|
2
|
+
import { Show } from '/npm/solid-js@^1.9.5/+esm';
|
|
3
|
+
import { useFullPropertyPath, useFormattedValue } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
4
|
+
import html from '/npm/solid-js@^1.9.5/html/+esm';
|
|
5
|
+
|
|
6
|
+
const CartData = (props, { element }) => {
|
|
7
|
+
if (!props.propertyName)
|
|
8
|
+
return console.warn(
|
|
9
|
+
"No property-name attribute provided for cart-data component."
|
|
10
|
+
);
|
|
11
|
+
const fullPath = useFullPropertyPath({
|
|
12
|
+
element,
|
|
13
|
+
path: () => props.propertyName
|
|
14
|
+
});
|
|
15
|
+
const formattedValue = useFormattedValue({
|
|
16
|
+
get format() {
|
|
17
|
+
return props.format;
|
|
18
|
+
},
|
|
19
|
+
path: fullPath,
|
|
20
|
+
element
|
|
21
|
+
});
|
|
22
|
+
return html`
|
|
23
|
+
<${Show} when=${() => formattedValue() !== null}> ${formattedValue} <//>
|
|
24
|
+
`;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { CartData };
|
|
28
|
+
//# sourceMappingURL=cart-data.js.map
|
|
29
|
+
//# sourceMappingURL=cart-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/cart-data.ts"],"names":[],"mappings":";;;;;AAiBO,MAAM,QAAgD,GAAA,CAC3D,KACA,EAAA,EAAE,SACC,KAAA;AACH,EAAA,IAAI,CAAC,KAAM,CAAA,YAAA;AACT,IAAA,OAAO,OAAQ,CAAA,IAAA;AAAA,MACb;AAAA,KACF;AACF,EAAA,MAAM,WAAW,mBAAoB,CAAA;AAAA,IACnC,OAAA;AAAA,IACA,IAAA,EAAM,MAAM,KAAM,CAAA;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,iBAAiB,iBAAkB,CAAA;AAAA,IACvC,IAAI,MAAS,GAAA;AACX,MAAA,OAAO,KAAM,CAAA,MAAA;AAAA,KACf;AAAA,IACA,IAAM,EAAA,QAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAO,OAAA,IAAA;AAAA,KAAA,EACF,IAAI,CAAS,MAAA,EAAA,MAAM,gBAAqB,KAAA,IAAI,KAAK,cAAc,CAAA;AAAA,EAAA,CAAA;AAEtE","file":"cart-data.js","sourcesContent":["import type { CorrectComponentType } from \"/npm/@brytdesigns/web-component-utils@0.1.7\";\nimport { type Format } from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js\";\n\nimport { Show } from \"/npm/solid-js@^1.9.5/+esm\";\n\nimport {\n type ValidHybridPath,\n useFullPropertyPath,\n useFormattedValue,\n} from \"/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js\";\nimport html from \"/npm/solid-js@^1.9.5/html/+esm\";\n\ntype CartDataProps = {\n propertyName: ValidHybridPath;\n format?: Format;\n};\n\nexport const CartData: CorrectComponentType<CartDataProps> = (\n props,\n { element },\n) => {\n if (!props.propertyName)\n return console.warn(\n \"No property-name attribute provided for cart-data component.\",\n );\n const fullPath = useFullPropertyPath({\n element,\n path: () => props.propertyName,\n });\n const formattedValue = useFormattedValue({\n get format() {\n return props.format;\n },\n path: fullPath,\n element,\n });\n\n return html`\n <${Show} when=${() => formattedValue() !== null}> ${formattedValue} <//>\n `;\n};\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createMemo, Show } from '/npm/solid-js@^1.9.5/+esm';
|
|
2
|
+
import '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/hooks/index.js';
|
|
3
|
+
import { getTemplateContent } from '/npm/@brytdesigns/shopify-hybrid-cart-components@0.2.19/dist/jsdelivr/utils/index.js';
|
|
4
|
+
import html from '/npm/solid-js@^1.9.5/html/+esm';
|
|
5
|
+
import HybridCart from '/npm/@brytdesigns/shopify-hybrid-cart@0.1.29';
|
|
6
|
+
|
|
7
|
+
const CartLoadingState = (props, { element }) => {
|
|
8
|
+
const cart = HybridCart;
|
|
9
|
+
const templates = {
|
|
10
|
+
pending: getTemplateContent(element, "pending"),
|
|
11
|
+
error: getTemplateContent(element, "error"),
|
|
12
|
+
success: getTemplateContent(element, "success")
|
|
13
|
+
};
|
|
14
|
+
let previousState = null;
|
|
15
|
+
const cartState = createMemo(() => {
|
|
16
|
+
const state = cart?.status;
|
|
17
|
+
if (!templates[state] || props.ignoredStates.includes(state))
|
|
18
|
+
return previousState;
|
|
19
|
+
previousState = state;
|
|
20
|
+
return state;
|
|
21
|
+
});
|
|
22
|
+
return html`
|
|
23
|
+
<${Show} when=${() => cart}>
|
|
24
|
+
${() => {
|
|
25
|
+
const state = cartState();
|
|
26
|
+
if (!state) return null;
|
|
27
|
+
if (!templates[state]) return null;
|
|
28
|
+
const children = Array.from(
|
|
29
|
+
templates[state].cloneNode(true).childNodes
|
|
30
|
+
);
|
|
31
|
+
return children;
|
|
32
|
+
}}
|
|
33
|
+
<//>
|
|
34
|
+
`;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { CartLoadingState };
|
|
38
|
+
//# sourceMappingURL=cart-loading-state.js.map
|
|
39
|
+
//# sourceMappingURL=cart-loading-state.js.map
|