@zappie/theme-base 0.1.0 → 0.1.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.
- package/CHANGELOG.md +39 -0
- package/README.md +26 -53
- package/dist/address.js +99 -2
- package/dist/address.js.map +7 -1
- package/dist/cart/address-sheet.js +143 -0
- package/dist/cart/address-sheet.js.map +7 -0
- package/dist/cart/cart-issues.js +72 -0
- package/dist/cart/cart-issues.js.map +7 -0
- package/dist/cart/cart-line-groups.js +34 -0
- package/dist/cart/cart-line-groups.js.map +7 -0
- package/dist/{chunk-FB5DRCU7.js → cart/cart-line.js} +9 -70
- package/dist/cart/cart-line.js.map +7 -0
- package/dist/cart/cart-lines.js +27 -0
- package/dist/cart/cart-lines.js.map +7 -0
- package/dist/cart/cart-schedule.js +24 -0
- package/dist/cart/cart-schedule.js.map +7 -0
- package/dist/cart/cart-sheet.js +35 -0
- package/dist/cart/cart-sheet.js.map +7 -0
- package/dist/cart/checkout-cta.js +81 -0
- package/dist/cart/checkout-cta.js.map +7 -0
- package/dist/cart/checkout-state.js +74 -0
- package/dist/cart/checkout-state.js.map +7 -0
- package/dist/cart/clear-cart.js +44 -0
- package/dist/cart/clear-cart.js.map +7 -0
- package/dist/cart/customer-details.js +70 -0
- package/dist/cart/customer-details.js.map +7 -0
- package/dist/cart/delivery-distance.js +22 -0
- package/dist/cart/delivery-distance.js.map +7 -0
- package/dist/cart/empty-cart.js +14 -0
- package/dist/cart/empty-cart.js.map +7 -0
- package/dist/cart/fulfilment-panel.js +83 -0
- package/dist/cart/fulfilment-panel.js.map +7 -0
- package/dist/cart/line-editor.js +35 -0
- package/dist/cart/line-editor.js.map +7 -0
- package/dist/cart/line-options.js +96 -0
- package/dist/cart/line-options.js.map +7 -0
- package/dist/cart/loading.js +17 -0
- package/dist/cart/loading.js.map +7 -0
- package/dist/cart/promo-sheet.js +103 -0
- package/dist/cart/promo-sheet.js.map +7 -0
- package/dist/cart/region-picker.js +40 -0
- package/dist/cart/region-picker.js.map +7 -0
- package/dist/cart/rewards-sheet.js +86 -0
- package/dist/cart/rewards-sheet.js.map +7 -0
- package/dist/cart/schedule-sheet.js +87 -0
- package/dist/cart/schedule-sheet.js.map +7 -0
- package/dist/{chunk-JFEI2OUZ.js → cart/theme-class.js} +7 -5
- package/dist/cart/theme-class.js.map +7 -0
- package/dist/cart/totals.js +81 -0
- package/dist/cart/totals.js.map +7 -0
- package/dist/cart/use-address-selection.js +130 -0
- package/dist/cart/use-address-selection.js.map +7 -0
- package/dist/cart.js +21 -1069
- package/dist/cart.js.map +7 -1
- package/dist/catalogue/catalogue-cart.js +25 -0
- package/dist/catalogue/catalogue-cart.js.map +7 -0
- package/dist/catalogue/catalogue-header.js +88 -0
- package/dist/catalogue/catalogue-header.js.map +7 -0
- package/dist/catalogue/catalogue-pages.js +68 -0
- package/dist/catalogue/catalogue-pages.js.map +7 -0
- package/dist/catalogue/catalogue-search.js +89 -0
- package/dist/catalogue/catalogue-search.js.map +7 -0
- package/dist/catalogue/category-navigation.js +98 -0
- package/dist/catalogue/category-navigation.js.map +7 -0
- package/dist/catalogue/category-section.js +113 -0
- package/dist/catalogue/category-section.js.map +7 -0
- package/dist/catalogue/info-banners.js +148 -0
- package/dist/catalogue/info-banners.js.map +7 -0
- package/dist/catalogue/item-tile.js +55 -0
- package/dist/catalogue/item-tile.js.map +7 -0
- package/dist/catalogue/loader.js +136 -0
- package/dist/catalogue/loader.js.map +7 -0
- package/dist/{chunk-USSLDBDY.js → catalogue/presentation.js} +12 -9
- package/dist/catalogue/presentation.js.map +7 -0
- package/dist/catalogue/saved-catalogue-sync.js +115 -0
- package/dist/catalogue/saved-catalogue-sync.js.map +7 -0
- package/dist/catalogue/types.js +1 -0
- package/dist/catalogue/types.js.map +7 -0
- package/dist/catalogue/use-catalogue-data.js +88 -0
- package/dist/catalogue/use-catalogue-data.js.map +7 -0
- package/dist/catalogue/use-category-scroll.js +115 -0
- package/dist/catalogue/use-category-scroll.js.map +7 -0
- package/dist/catalogue/use-item-opener.js +46 -0
- package/dist/catalogue/use-item-opener.js.map +7 -0
- package/dist/catalogue/use-search-source.js +132 -0
- package/dist/catalogue/use-search-source.js.map +7 -0
- package/dist/catalogue.js +26 -1216
- package/dist/catalogue.js.map +7 -1
- package/dist/checkout.js +149 -2
- package/dist/checkout.js.map +7 -1
- package/dist/host-bridge.js +22 -2
- package/dist/host-bridge.js.map +7 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +7 -1
- package/dist/item/configurator-commit.js +15 -0
- package/dist/item/configurator-commit.js.map +7 -0
- package/dist/item/configurator-draft.js +63 -0
- package/dist/item/configurator-draft.js.map +7 -0
- package/dist/item/configurator.js +135 -0
- package/dist/item/configurator.js.map +7 -0
- package/dist/item/note.js +65 -0
- package/dist/item/note.js.map +7 -0
- package/dist/item/variant-status.js +23 -0
- package/dist/item/variant-status.js.map +7 -0
- package/dist/item-frame.js +60 -3
- package/dist/item-frame.js.map +7 -1
- package/dist/item.js +11 -11
- package/dist/item.js.map +7 -1
- package/dist/navigation.js +39 -2
- package/dist/navigation.js.map +7 -1
- package/dist/url-navigation-state.js +61 -0
- package/dist/url-navigation-state.js.map +7 -0
- package/dist/{chunk-ILOCSCZL.js → url-navigation.js} +12 -89
- package/dist/url-navigation.js.map +7 -0
- package/package.json +8 -7
- package/dist/chunk-2MV6KU3R.js +0 -352
- package/dist/chunk-2MV6KU3R.js.map +0 -1
- package/dist/chunk-FB5DRCU7.js.map +0 -1
- package/dist/chunk-IG63ONID.js +0 -139
- package/dist/chunk-IG63ONID.js.map +0 -1
- package/dist/chunk-ILOCSCZL.js.map +0 -1
- package/dist/chunk-JFEI2OUZ.js.map +0 -1
- package/dist/chunk-NTJONY3N.js +0 -95
- package/dist/chunk-NTJONY3N.js.map +0 -1
- package/dist/chunk-QWST2TA2.js +0 -22
- package/dist/chunk-QWST2TA2.js.map +0 -1
- package/dist/chunk-USSLDBDY.js.map +0 -1
- package/dist/chunk-VIAJ27YC.js +0 -59
- package/dist/chunk-VIAJ27YC.js.map +0 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// src/cart/totals.tsx
|
|
2
|
+
import { Totals as FoundationTotals, Money } from "@zappie/foundations";
|
|
3
|
+
import { useCart } from "@zappie/sdk/react";
|
|
4
|
+
import { Fragment, useState } from "react";
|
|
5
|
+
import { useBaseHostBridge } from "../host-bridge.js";
|
|
6
|
+
import { CheckoutCta } from "./checkout-cta.js";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
function Totals({
|
|
9
|
+
contactPhone
|
|
10
|
+
} = {}) {
|
|
11
|
+
const cart = useCart();
|
|
12
|
+
const bridge = useBaseHostBridge();
|
|
13
|
+
const [error, setError] = useState(null);
|
|
14
|
+
const blocked = cart.issues.some((issue) => issue.severity === "blocking");
|
|
15
|
+
const refresh = async () => {
|
|
16
|
+
setError(null);
|
|
17
|
+
try {
|
|
18
|
+
await cart.actions.quote({ force: true });
|
|
19
|
+
} catch (error2) {
|
|
20
|
+
setError(
|
|
21
|
+
error2 instanceof Error ? error2.message : "Unable to update totals"
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return /* @__PURE__ */ jsx(FoundationTotals, { className: "z-base-summary", children: ({ quote, status }) => {
|
|
26
|
+
const unpriced = blocked && (!quote || quote.subtotal.amountMinor === 0);
|
|
27
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
28
|
+
/* @__PURE__ */ jsx("h2", { children: "Order summary" }),
|
|
29
|
+
status === "loading" && /* @__PURE__ */ jsx("p", { role: "status", children: "Updating totals\u2026" }),
|
|
30
|
+
status === "offline" && /* @__PURE__ */ jsx("p", { role: "alert", children: "Unable to connect. Try updating your totals again." }),
|
|
31
|
+
status === "stale" && !blocked && /* @__PURE__ */ jsx("p", { children: "Update totals before continuing." }),
|
|
32
|
+
error && /* @__PURE__ */ jsx("p", { role: "alert", children: error }),
|
|
33
|
+
unpriced && /* @__PURE__ */ jsx("p", { children: "Totals appear once the issues above are resolved." }),
|
|
34
|
+
blocked && !unpriced && /* @__PURE__ */ jsx("p", { children: "Your total may change once the issues above are resolved." }),
|
|
35
|
+
quote && !unpriced && /* @__PURE__ */ jsxs("dl", { className: "z-base-totals", children: [
|
|
36
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
37
|
+
/* @__PURE__ */ jsx("dt", { children: "Subtotal" }),
|
|
38
|
+
/* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx(Money, { value: quote.subtotal }) })
|
|
39
|
+
] }),
|
|
40
|
+
quote.fees.map((fee, index) => /* @__PURE__ */ jsxs("div", { children: [
|
|
41
|
+
/* @__PURE__ */ jsx("dt", { children: fee.label }),
|
|
42
|
+
/* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx(Money, { value: fee.amount }) })
|
|
43
|
+
] }, `${fee.code}:${index}`)),
|
|
44
|
+
quote.delivery && /* @__PURE__ */ jsxs("div", { children: [
|
|
45
|
+
/* @__PURE__ */ jsx("dt", { children: "Delivery" }),
|
|
46
|
+
/* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx(Money, { value: quote.delivery }) })
|
|
47
|
+
] }),
|
|
48
|
+
quote.discounts.map((discount, index) => /* @__PURE__ */ jsxs("div", { children: [
|
|
49
|
+
/* @__PURE__ */ jsx("dt", { children: discount.label }),
|
|
50
|
+
/* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx(Money, { value: discount.amount }) })
|
|
51
|
+
] }, `${discount.code}:${index}`)),
|
|
52
|
+
/* @__PURE__ */ jsxs("div", { className: "z-base-total", children: [
|
|
53
|
+
/* @__PURE__ */ jsx("dt", { children: "Total" }),
|
|
54
|
+
/* @__PURE__ */ jsx("dd", { children: /* @__PURE__ */ jsx(Money, { value: quote.total }) })
|
|
55
|
+
] })
|
|
56
|
+
] }),
|
|
57
|
+
(status === "stale" || status === "offline") && !blocked && /* @__PURE__ */ jsx(
|
|
58
|
+
"button",
|
|
59
|
+
{
|
|
60
|
+
type: "button",
|
|
61
|
+
className: "z-base-button-secondary",
|
|
62
|
+
onClick: () => {
|
|
63
|
+
void refresh();
|
|
64
|
+
},
|
|
65
|
+
children: "Update totals"
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/* @__PURE__ */ jsx(
|
|
69
|
+
CheckoutCta,
|
|
70
|
+
{
|
|
71
|
+
totalsStatus: status,
|
|
72
|
+
...contactPhone ? { contactPhone } : {}
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
] });
|
|
76
|
+
} });
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
Totals
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=totals.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/cart/totals.tsx"],
|
|
4
|
+
"sourcesContent": ["import { Totals as FoundationTotals, Money } from \"@zappie/foundations\";\nimport { useCart } from \"@zappie/sdk/react\";\nimport { Fragment, useState } from \"react\";\nimport { useBaseHostBridge } from \"../host-bridge\";\nimport { CheckoutCta } from \"./checkout-cta\";\nimport type { ContactPhoneState } from \"./customer-details\";\nexport function Totals({\n contactPhone,\n}: {\n contactPhone?: ContactPhoneState;\n} = {}) {\n const cart = useCart();\n const bridge = useBaseHostBridge();\n const [error, setError] = useState<string | null>(null);\n const blocked = cart.issues.some((issue) => issue.severity === \"blocking\");\n const refresh = async () => {\n setError(null);\n try {\n await cart.actions.quote({ force: true });\n } catch (error) {\n setError(\n error instanceof Error ? error.message : \"Unable to update totals\",\n );\n }\n };\n return (\n <FoundationTotals className=\"z-base-summary\">\n {({ quote, status }) => {\n // Under a blocking issue the store may not have priced the cart at\n // all (a closed branch without a time, a refused preview): its zero\n // totals would read as \u20A60. A priced cart still shows its figures, for\n // example before the customer signs in or chooses an address.\n const unpriced =\n blocked && (!quote || quote.subtotal.amountMinor === 0);\n return (\n <Fragment>\n <h2>Order summary</h2>\n {status === \"loading\" && <p role=\"status\">Updating totals\u2026</p>}\n {status === \"offline\" && (\n <p role=\"alert\">\n Unable to connect. Try updating your totals again.\n </p>\n )}\n {status === \"stale\" && !blocked && (\n <p>Update totals before continuing.</p>\n )}\n {error && <p role=\"alert\">{error}</p>}\n {unpriced && (\n <p>Totals appear once the issues above are resolved.</p>\n )}\n {blocked && !unpriced && (\n <p>Your total may change once the issues above are resolved.</p>\n )}\n {quote && !unpriced && (\n <dl className=\"z-base-totals\">\n <div>\n <dt>Subtotal</dt>\n <dd>\n <Money value={quote.subtotal} />\n </dd>\n </div>\n {quote.fees.map((fee, index) => (\n <div key={`${fee.code}:${index}`}>\n <dt>{fee.label}</dt>\n <dd>\n <Money value={fee.amount} />\n </dd>\n </div>\n ))}\n {quote.delivery && (\n <div>\n <dt>Delivery</dt>\n <dd>\n <Money value={quote.delivery} />\n </dd>\n </div>\n )}\n {quote.discounts.map((discount, index) => (\n <div key={`${discount.code}:${index}`}>\n <dt>{discount.label}</dt>\n <dd>\n <Money value={discount.amount} />\n </dd>\n </div>\n ))}\n <div className=\"z-base-total\">\n <dt>Total</dt>\n <dd>\n <Money value={quote.total} />\n </dd>\n </div>\n </dl>\n )}\n {(status === \"stale\" || status === \"offline\") && !blocked && (\n <button\n type=\"button\"\n className=\"z-base-button-secondary\"\n onClick={() => {\n void refresh();\n }}\n >\n Update totals\n </button>\n )}\n <CheckoutCta\n totalsStatus={status}\n {...(contactPhone ? { contactPhone } : {})}\n />\n </Fragment>\n );\n }}\n </FoundationTotals>\n );\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,UAAU,kBAAkB,aAAa;AAClD,SAAS,eAAe;AACxB,SAAS,UAAU,gBAAgB;AACnC,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAgChB,cAmBI,YAnBJ;AA9BL,SAAS,OAAO;AAAA,EACrB;AACF,IAEI,CAAC,GAAG;AACN,QAAM,OAAO,QAAQ;AACrB,QAAM,SAAS,kBAAkB;AACjC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,UAAU,KAAK,OAAO,KAAK,CAAC,UAAU,MAAM,aAAa,UAAU;AACzE,QAAM,UAAU,YAAY;AAC1B,aAAS,IAAI;AACb,QAAI;AACF,YAAM,KAAK,QAAQ,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,IAC1C,SAASA,QAAO;AACd;AAAA,QACEA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,SACE,oBAAC,oBAAiB,WAAU,kBACzB,WAAC,EAAE,OAAO,OAAO,MAAM;AAKtB,UAAM,WACJ,YAAY,CAAC,SAAS,MAAM,SAAS,gBAAgB;AACvD,WACE,qBAAC,YACC;AAAA,0BAAC,QAAG,2BAAa;AAAA,MAChB,WAAW,aAAa,oBAAC,OAAE,MAAK,UAAS,mCAAgB;AAAA,MACzD,WAAW,aACV,oBAAC,OAAE,MAAK,SAAQ,gEAEhB;AAAA,MAED,WAAW,WAAW,CAAC,WACtB,oBAAC,OAAE,8CAAgC;AAAA,MAEpC,SAAS,oBAAC,OAAE,MAAK,SAAS,iBAAM;AAAA,MAChC,YACC,oBAAC,OAAE,+DAAiD;AAAA,MAErD,WAAW,CAAC,YACX,oBAAC,OAAE,uEAAyD;AAAA,MAE7D,SAAS,CAAC,YACT,qBAAC,QAAG,WAAU,iBACZ;AAAA,6BAAC,SACC;AAAA,8BAAC,QAAG,sBAAQ;AAAA,UACZ,oBAAC,QACC,8BAAC,SAAM,OAAO,MAAM,UAAU,GAChC;AAAA,WACF;AAAA,QACC,MAAM,KAAK,IAAI,CAAC,KAAK,UACpB,qBAAC,SACC;AAAA,8BAAC,QAAI,cAAI,OAAM;AAAA,UACf,oBAAC,QACC,8BAAC,SAAM,OAAO,IAAI,QAAQ,GAC5B;AAAA,aAJQ,GAAG,IAAI,IAAI,IAAI,KAAK,EAK9B,CACD;AAAA,QACA,MAAM,YACL,qBAAC,SACC;AAAA,8BAAC,QAAG,sBAAQ;AAAA,UACZ,oBAAC,QACC,8BAAC,SAAM,OAAO,MAAM,UAAU,GAChC;AAAA,WACF;AAAA,QAED,MAAM,UAAU,IAAI,CAAC,UAAU,UAC9B,qBAAC,SACC;AAAA,8BAAC,QAAI,mBAAS,OAAM;AAAA,UACpB,oBAAC,QACC,8BAAC,SAAM,OAAO,SAAS,QAAQ,GACjC;AAAA,aAJQ,GAAG,SAAS,IAAI,IAAI,KAAK,EAKnC,CACD;AAAA,QACD,qBAAC,SAAI,WAAU,gBACb;AAAA,8BAAC,QAAG,mBAAK;AAAA,UACT,oBAAC,QACC,8BAAC,SAAM,OAAO,MAAM,OAAO,GAC7B;AAAA,WACF;AAAA,SACF;AAAA,OAEA,WAAW,WAAW,WAAW,cAAc,CAAC,WAChD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,iBAAK,QAAQ;AAAA,UACf;AAAA,UACD;AAAA;AAAA,MAED;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UACC,cAAc;AAAA,UACb,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA;AAAA,MAC1C;AAAA,OACF;AAAA,EAEJ,GACF;AAEJ;",
|
|
6
|
+
"names": ["error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// src/cart/use-address-selection.ts
|
|
2
|
+
import { useCallback, useRef, useState } from "react";
|
|
3
|
+
import { useAddressLookup } from "../address.js";
|
|
4
|
+
function useAddressSelection(initial) {
|
|
5
|
+
const lookup = useAddressLookup();
|
|
6
|
+
const [selected, setSelected] = useState(initial);
|
|
7
|
+
const [query, setQuery] = useState(initial?.line1 ?? "");
|
|
8
|
+
const [busy, setBusy] = useState(false);
|
|
9
|
+
const [locating, setLocating] = useState(false);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
const revision = useRef(0);
|
|
12
|
+
const sessions = useRef(/* @__PURE__ */ new Map());
|
|
13
|
+
const suggestions = useCallback(
|
|
14
|
+
async (query2) => {
|
|
15
|
+
const values = await lookup.suggest(query2);
|
|
16
|
+
return values.map((value) => {
|
|
17
|
+
sessions.current.set(value.placeId, value.sessionToken);
|
|
18
|
+
return {
|
|
19
|
+
id: value.placeId,
|
|
20
|
+
label: value.address,
|
|
21
|
+
address: { line1: value.address, placeId: value.placeId }
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
[lookup]
|
|
26
|
+
);
|
|
27
|
+
const changeQuery = (value) => {
|
|
28
|
+
revision.current++;
|
|
29
|
+
setQuery(value);
|
|
30
|
+
setSelected(void 0);
|
|
31
|
+
setBusy(false);
|
|
32
|
+
setLocating(false);
|
|
33
|
+
setError(null);
|
|
34
|
+
};
|
|
35
|
+
const run = async (request, operation, fillQuery) => {
|
|
36
|
+
try {
|
|
37
|
+
const resolved = await operation();
|
|
38
|
+
if (revision.current === request) {
|
|
39
|
+
setSelected(resolved);
|
|
40
|
+
if (fillQuery) {
|
|
41
|
+
setQuery(resolved.line1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
} catch (failure) {
|
|
45
|
+
const aborted = (failure instanceof Error || failure instanceof DOMException) && failure.name === "AbortError";
|
|
46
|
+
if (revision.current === request && !aborted) {
|
|
47
|
+
setError(
|
|
48
|
+
failure instanceof Error ? failure.message : "Unable to locate this address"
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
} finally {
|
|
52
|
+
if (revision.current === request) {
|
|
53
|
+
setBusy(false);
|
|
54
|
+
setLocating(false);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const select = (address) => {
|
|
59
|
+
const request = ++revision.current;
|
|
60
|
+
setLocating(false);
|
|
61
|
+
setBusy(true);
|
|
62
|
+
setError(null);
|
|
63
|
+
const resolve = lookup.resolve;
|
|
64
|
+
if (!resolve) {
|
|
65
|
+
setSelected(address);
|
|
66
|
+
setBusy(false);
|
|
67
|
+
return Promise.resolve();
|
|
68
|
+
}
|
|
69
|
+
return run(
|
|
70
|
+
request,
|
|
71
|
+
() => resolve(address, sessions.current.get(address.placeId ?? "")),
|
|
72
|
+
false
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
const findCurrentLocation = () => {
|
|
76
|
+
if (!lookup.reverse || !navigator.geolocation) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const reverse = lookup.reverse;
|
|
80
|
+
const request = ++revision.current;
|
|
81
|
+
setBusy(true);
|
|
82
|
+
setLocating(true);
|
|
83
|
+
setError(null);
|
|
84
|
+
navigator.geolocation.getCurrentPosition(
|
|
85
|
+
(position) => {
|
|
86
|
+
if (revision.current !== request) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
void run(
|
|
90
|
+
request,
|
|
91
|
+
() => reverse({
|
|
92
|
+
lat: position.coords.latitude,
|
|
93
|
+
lng: position.coords.longitude
|
|
94
|
+
}),
|
|
95
|
+
true
|
|
96
|
+
);
|
|
97
|
+
},
|
|
98
|
+
(failure) => {
|
|
99
|
+
if (revision.current !== request) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (failure.code === 1) {
|
|
103
|
+
setError("Location access is off. Search for your address instead.");
|
|
104
|
+
} else {
|
|
105
|
+
setError(
|
|
106
|
+
"We couldn't find your location. Search for your address instead."
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
setBusy(false);
|
|
110
|
+
setLocating(false);
|
|
111
|
+
},
|
|
112
|
+
{ enableHighAccuracy: false, timeout: 1e4, maximumAge: 6e4 }
|
|
113
|
+
);
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
selected,
|
|
117
|
+
query,
|
|
118
|
+
busy,
|
|
119
|
+
locating,
|
|
120
|
+
error,
|
|
121
|
+
suggestions,
|
|
122
|
+
changeQuery,
|
|
123
|
+
select,
|
|
124
|
+
findCurrentLocation
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
useAddressSelection
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=use-address-selection.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/cart/use-address-selection.ts"],
|
|
4
|
+
"sourcesContent": ["import type { DeliveryAddress } from \"@zappie/sdk\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { useAddressLookup } from \"../address\";\nexport function useAddressSelection(initial?: DeliveryAddress) {\n const lookup = useAddressLookup();\n const [selected, setSelected] = useState(initial);\n const [query, setQuery] = useState(initial?.line1 ?? \"\");\n const [busy, setBusy] = useState(false);\n const [locating, setLocating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const revision = useRef(0);\n const sessions = useRef(new Map<string, string | undefined>());\n const suggestions = useCallback(\n async (query: string) => {\n const values = await lookup.suggest(query);\n return values.map((value) => {\n sessions.current.set(value.placeId, value.sessionToken);\n return {\n id: value.placeId,\n label: value.address,\n address: { line1: value.address, placeId: value.placeId },\n };\n });\n },\n [lookup],\n );\n const changeQuery = (value: string) => {\n revision.current++;\n setQuery(value);\n setSelected(undefined);\n setBusy(false);\n setLocating(false);\n setError(null);\n };\n const run = async (\n request: number,\n operation: () => Promise<DeliveryAddress>,\n fillQuery: boolean,\n ) => {\n try {\n const resolved = await operation();\n if (revision.current === request) {\n setSelected(resolved);\n if (fillQuery) {\n setQuery(resolved.line1);\n }\n }\n } catch (failure) {\n const aborted =\n (failure instanceof Error || failure instanceof DOMException) &&\n failure.name === \"AbortError\";\n if (revision.current === request && !aborted) {\n setError(\n failure instanceof Error\n ? failure.message\n : \"Unable to locate this address\",\n );\n }\n } finally {\n if (revision.current === request) {\n setBusy(false);\n setLocating(false);\n }\n }\n };\n const select = (address: DeliveryAddress) => {\n const request = ++revision.current;\n setLocating(false);\n setBusy(true);\n setError(null);\n const resolve = lookup.resolve;\n if (!resolve) {\n setSelected(address);\n setBusy(false);\n return Promise.resolve();\n }\n return run(\n request,\n () => resolve(address, sessions.current.get(address.placeId ?? \"\")),\n false,\n );\n };\n const findCurrentLocation = () => {\n if (!lookup.reverse || !navigator.geolocation) {\n return;\n }\n const reverse = lookup.reverse;\n const request = ++revision.current;\n setBusy(true);\n setLocating(true);\n setError(null);\n navigator.geolocation.getCurrentPosition(\n (position) => {\n if (revision.current !== request) {\n return;\n }\n void run(\n request,\n () =>\n reverse({\n lat: position.coords.latitude,\n lng: position.coords.longitude,\n }),\n true,\n );\n },\n (failure) => {\n if (revision.current !== request) {\n return;\n }\n if (failure.code === 1) {\n setError(\"Location access is off. Search for your address instead.\");\n } else {\n setError(\n \"We couldn't find your location. Search for your address instead.\",\n );\n }\n setBusy(false);\n setLocating(false);\n },\n { enableHighAccuracy: false, timeout: 10_000, maximumAge: 60_000 },\n );\n };\n return {\n selected,\n query,\n busy,\n locating,\n error,\n suggestions,\n changeQuery,\n select,\n findCurrentLocation,\n };\n}\n"],
|
|
5
|
+
"mappings": ";AACA,SAAS,aAAa,QAAQ,gBAAgB;AAC9C,SAAS,wBAAwB;AAC1B,SAAS,oBAAoB,SAA2B;AAC7D,QAAM,SAAS,iBAAiB;AAChC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,OAAO;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,SAAS,SAAS,EAAE;AACvD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,WAAW,OAAO,CAAC;AACzB,QAAM,WAAW,OAAO,oBAAI,IAAgC,CAAC;AAC7D,QAAM,cAAc;AAAA,IAClB,OAAOA,WAAkB;AACvB,YAAM,SAAS,MAAM,OAAO,QAAQA,MAAK;AACzC,aAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,iBAAS,QAAQ,IAAI,MAAM,SAAS,MAAM,YAAY;AACtD,eAAO;AAAA,UACL,IAAI,MAAM;AAAA,UACV,OAAO,MAAM;AAAA,UACb,SAAS,EAAE,OAAO,MAAM,SAAS,SAAS,MAAM,QAAQ;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACA,QAAM,cAAc,CAAC,UAAkB;AACrC,aAAS;AACT,aAAS,KAAK;AACd,gBAAY,MAAS;AACrB,YAAQ,KAAK;AACb,gBAAY,KAAK;AACjB,aAAS,IAAI;AAAA,EACf;AACA,QAAM,MAAM,OACV,SACA,WACA,cACG;AACH,QAAI;AACF,YAAM,WAAW,MAAM,UAAU;AACjC,UAAI,SAAS,YAAY,SAAS;AAChC,oBAAY,QAAQ;AACpB,YAAI,WAAW;AACb,mBAAS,SAAS,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,SAAS,SAAS;AAChB,YAAM,WACH,mBAAmB,SAAS,mBAAmB,iBAChD,QAAQ,SAAS;AACnB,UAAI,SAAS,YAAY,WAAW,CAAC,SAAS;AAC5C;AAAA,UACE,mBAAmB,QACf,QAAQ,UACR;AAAA,QACN;AAAA,MACF;AAAA,IACF,UAAE;AACA,UAAI,SAAS,YAAY,SAAS;AAChC,gBAAQ,KAAK;AACb,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,CAAC,YAA6B;AAC3C,UAAM,UAAU,EAAE,SAAS;AAC3B,gBAAY,KAAK;AACjB,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,UAAM,UAAU,OAAO;AACvB,QAAI,CAAC,SAAS;AACZ,kBAAY,OAAO;AACnB,cAAQ,KAAK;AACb,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,WAAO;AAAA,MACL;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS,QAAQ,IAAI,QAAQ,WAAW,EAAE,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACA,QAAM,sBAAsB,MAAM;AAChC,QAAI,CAAC,OAAO,WAAW,CAAC,UAAU,aAAa;AAC7C;AAAA,IACF;AACA,UAAM,UAAU,OAAO;AACvB,UAAM,UAAU,EAAE,SAAS;AAC3B,YAAQ,IAAI;AACZ,gBAAY,IAAI;AAChB,aAAS,IAAI;AACb,cAAU,YAAY;AAAA,MACpB,CAAC,aAAa;AACZ,YAAI,SAAS,YAAY,SAAS;AAChC;AAAA,QACF;AACA,aAAK;AAAA,UACH;AAAA,UACA,MACE,QAAQ;AAAA,YACN,KAAK,SAAS,OAAO;AAAA,YACrB,KAAK,SAAS,OAAO;AAAA,UACvB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,MACA,CAAC,YAAY;AACX,YAAI,SAAS,YAAY,SAAS;AAChC;AAAA,QACF;AACA,YAAI,QAAQ,SAAS,GAAG;AACtB,mBAAS,0DAA0D;AAAA,QACrE,OAAO;AACL;AAAA,YACE;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,KAAK;AACb,oBAAY,KAAK;AAAA,MACnB;AAAA,MACA,EAAE,oBAAoB,OAAO,SAAS,KAAQ,YAAY,IAAO;AAAA,IACnE;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": ["query"]
|
|
7
|
+
}
|