@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.
Files changed (129) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +26 -53
  3. package/dist/address.js +99 -2
  4. package/dist/address.js.map +7 -1
  5. package/dist/cart/address-sheet.js +143 -0
  6. package/dist/cart/address-sheet.js.map +7 -0
  7. package/dist/cart/cart-issues.js +72 -0
  8. package/dist/cart/cart-issues.js.map +7 -0
  9. package/dist/cart/cart-line-groups.js +34 -0
  10. package/dist/cart/cart-line-groups.js.map +7 -0
  11. package/dist/{chunk-FB5DRCU7.js → cart/cart-line.js} +9 -70
  12. package/dist/cart/cart-line.js.map +7 -0
  13. package/dist/cart/cart-lines.js +27 -0
  14. package/dist/cart/cart-lines.js.map +7 -0
  15. package/dist/cart/cart-schedule.js +24 -0
  16. package/dist/cart/cart-schedule.js.map +7 -0
  17. package/dist/cart/cart-sheet.js +35 -0
  18. package/dist/cart/cart-sheet.js.map +7 -0
  19. package/dist/cart/checkout-cta.js +81 -0
  20. package/dist/cart/checkout-cta.js.map +7 -0
  21. package/dist/cart/checkout-state.js +74 -0
  22. package/dist/cart/checkout-state.js.map +7 -0
  23. package/dist/cart/clear-cart.js +44 -0
  24. package/dist/cart/clear-cart.js.map +7 -0
  25. package/dist/cart/customer-details.js +70 -0
  26. package/dist/cart/customer-details.js.map +7 -0
  27. package/dist/cart/delivery-distance.js +22 -0
  28. package/dist/cart/delivery-distance.js.map +7 -0
  29. package/dist/cart/empty-cart.js +14 -0
  30. package/dist/cart/empty-cart.js.map +7 -0
  31. package/dist/cart/fulfilment-panel.js +83 -0
  32. package/dist/cart/fulfilment-panel.js.map +7 -0
  33. package/dist/cart/line-editor.js +35 -0
  34. package/dist/cart/line-editor.js.map +7 -0
  35. package/dist/cart/line-options.js +96 -0
  36. package/dist/cart/line-options.js.map +7 -0
  37. package/dist/cart/loading.js +17 -0
  38. package/dist/cart/loading.js.map +7 -0
  39. package/dist/cart/promo-sheet.js +103 -0
  40. package/dist/cart/promo-sheet.js.map +7 -0
  41. package/dist/cart/region-picker.js +40 -0
  42. package/dist/cart/region-picker.js.map +7 -0
  43. package/dist/cart/rewards-sheet.js +86 -0
  44. package/dist/cart/rewards-sheet.js.map +7 -0
  45. package/dist/cart/schedule-sheet.js +87 -0
  46. package/dist/cart/schedule-sheet.js.map +7 -0
  47. package/dist/{chunk-JFEI2OUZ.js → cart/theme-class.js} +7 -5
  48. package/dist/cart/theme-class.js.map +7 -0
  49. package/dist/cart/totals.js +81 -0
  50. package/dist/cart/totals.js.map +7 -0
  51. package/dist/cart/use-address-selection.js +130 -0
  52. package/dist/cart/use-address-selection.js.map +7 -0
  53. package/dist/cart.js +21 -1069
  54. package/dist/cart.js.map +7 -1
  55. package/dist/catalogue/catalogue-cart.js +25 -0
  56. package/dist/catalogue/catalogue-cart.js.map +7 -0
  57. package/dist/catalogue/catalogue-header.js +88 -0
  58. package/dist/catalogue/catalogue-header.js.map +7 -0
  59. package/dist/catalogue/catalogue-pages.js +68 -0
  60. package/dist/catalogue/catalogue-pages.js.map +7 -0
  61. package/dist/catalogue/catalogue-search.js +89 -0
  62. package/dist/catalogue/catalogue-search.js.map +7 -0
  63. package/dist/catalogue/category-navigation.js +98 -0
  64. package/dist/catalogue/category-navigation.js.map +7 -0
  65. package/dist/catalogue/category-section.js +113 -0
  66. package/dist/catalogue/category-section.js.map +7 -0
  67. package/dist/catalogue/info-banners.js +148 -0
  68. package/dist/catalogue/info-banners.js.map +7 -0
  69. package/dist/catalogue/item-tile.js +55 -0
  70. package/dist/catalogue/item-tile.js.map +7 -0
  71. package/dist/catalogue/loader.js +136 -0
  72. package/dist/catalogue/loader.js.map +7 -0
  73. package/dist/{chunk-USSLDBDY.js → catalogue/presentation.js} +12 -9
  74. package/dist/catalogue/presentation.js.map +7 -0
  75. package/dist/catalogue/saved-catalogue-sync.js +115 -0
  76. package/dist/catalogue/saved-catalogue-sync.js.map +7 -0
  77. package/dist/catalogue/types.js +1 -0
  78. package/dist/catalogue/types.js.map +7 -0
  79. package/dist/catalogue/use-catalogue-data.js +88 -0
  80. package/dist/catalogue/use-catalogue-data.js.map +7 -0
  81. package/dist/catalogue/use-category-scroll.js +115 -0
  82. package/dist/catalogue/use-category-scroll.js.map +7 -0
  83. package/dist/catalogue/use-item-opener.js +46 -0
  84. package/dist/catalogue/use-item-opener.js.map +7 -0
  85. package/dist/catalogue/use-search-source.js +132 -0
  86. package/dist/catalogue/use-search-source.js.map +7 -0
  87. package/dist/catalogue.js +26 -1216
  88. package/dist/catalogue.js.map +7 -1
  89. package/dist/checkout.js +149 -2
  90. package/dist/checkout.js.map +7 -1
  91. package/dist/host-bridge.js +22 -2
  92. package/dist/host-bridge.js.map +7 -1
  93. package/dist/index.js +3 -3
  94. package/dist/index.js.map +7 -1
  95. package/dist/item/configurator-commit.js +15 -0
  96. package/dist/item/configurator-commit.js.map +7 -0
  97. package/dist/item/configurator-draft.js +63 -0
  98. package/dist/item/configurator-draft.js.map +7 -0
  99. package/dist/item/configurator.js +135 -0
  100. package/dist/item/configurator.js.map +7 -0
  101. package/dist/item/note.js +65 -0
  102. package/dist/item/note.js.map +7 -0
  103. package/dist/item/variant-status.js +23 -0
  104. package/dist/item/variant-status.js.map +7 -0
  105. package/dist/item-frame.js +60 -3
  106. package/dist/item-frame.js.map +7 -1
  107. package/dist/item.js +11 -11
  108. package/dist/item.js.map +7 -1
  109. package/dist/navigation.js +39 -2
  110. package/dist/navigation.js.map +7 -1
  111. package/dist/url-navigation-state.js +61 -0
  112. package/dist/url-navigation-state.js.map +7 -0
  113. package/dist/{chunk-ILOCSCZL.js → url-navigation.js} +12 -89
  114. package/dist/url-navigation.js.map +7 -0
  115. package/package.json +8 -7
  116. package/dist/chunk-2MV6KU3R.js +0 -352
  117. package/dist/chunk-2MV6KU3R.js.map +0 -1
  118. package/dist/chunk-FB5DRCU7.js.map +0 -1
  119. package/dist/chunk-IG63ONID.js +0 -139
  120. package/dist/chunk-IG63ONID.js.map +0 -1
  121. package/dist/chunk-ILOCSCZL.js.map +0 -1
  122. package/dist/chunk-JFEI2OUZ.js.map +0 -1
  123. package/dist/chunk-NTJONY3N.js +0 -95
  124. package/dist/chunk-NTJONY3N.js.map +0 -1
  125. package/dist/chunk-QWST2TA2.js +0 -22
  126. package/dist/chunk-QWST2TA2.js.map +0 -1
  127. package/dist/chunk-USSLDBDY.js.map +0 -1
  128. package/dist/chunk-VIAJ27YC.js +0 -59
  129. 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": "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",
6
+ "names": ["query"]
7
+ }