@akropolys/kiku 1.5.19 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -21,10 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  // src/index.ts
22
22
  var src_exports = {};
23
23
  __export(src_exports, {
24
- CartBadge: () => CartBadge,
25
- CartDrawer: () => CartDrawer,
26
24
  ChatWidget: () => ChatWidget,
27
- CheckoutModal: () => CheckoutModal,
28
25
  ComparisonMatrix: () => ComparisonMatrix,
29
26
  KikuButton: () => KikuButton,
30
27
  KikuChat: () => ChatWidget,
@@ -800,7 +797,6 @@ var import_react5 = require("react");
800
797
  var import_react_dom = require("react-dom");
801
798
  var import_sdk5 = require("@akropolys/sdk");
802
799
  var import_sdk6 = require("@akropolys/sdk");
803
- var import_sdk7 = require("@akropolys/sdk");
804
800
 
805
801
  // src/components/ComparisonMatrix.tsx
806
802
  var import_sdk4 = require("@akropolys/sdk");
@@ -1334,7 +1330,7 @@ function ActionPills({ cart, actionType, onSend, loading }) {
1334
1330
  )) });
1335
1331
  }
1336
1332
  function SourcesCarousel({ sources, defaultCurrency, onSelectSource, referencedIds = [] }) {
1337
- const client = (0, import_sdk7.useAkropolysContext)();
1333
+ const client = (0, import_sdk6.useAkropolysContext)();
1338
1334
  const isProperty = client?.vertical === "property";
1339
1335
  const railRef = (0, import_react5.useRef)(null);
1340
1336
  const [showNext, setShowNext] = (0, import_react5.useState)(false);
@@ -1434,7 +1430,7 @@ function SmartContextPills({
1434
1430
  onSend,
1435
1431
  loading
1436
1432
  }) {
1437
- const client = (0, import_sdk7.useAkropolysContext)();
1433
+ const client = (0, import_sdk6.useAkropolysContext)();
1438
1434
  const isProperty = client?.vertical === "property";
1439
1435
  if (!intent) return null;
1440
1436
  const pills = [];
@@ -1664,7 +1660,7 @@ function ChatModal({
1664
1660
  enableVision = false,
1665
1661
  visionCategoryHint
1666
1662
  }) {
1667
- const client = (0, import_sdk7.useAkropolysContext)();
1663
+ const client = (0, import_sdk6.useAkropolysContext)();
1668
1664
  const { messages, sources, loading, streaming, error, lastAction, lastIntent, send, reset, referencedIds } = (0, import_sdk5.useKiku)();
1669
1665
  const [input, setInput] = (0, import_react5.useState)("");
1670
1666
  const [attachments, setAttachments] = (0, import_react5.useState)([]);
@@ -1748,31 +1744,15 @@ function ChatModal({
1748
1744
  }
1749
1745
  return "";
1750
1746
  });
1751
- const [merchantRef, setMerchantRef] = (0, import_react5.useState)(null);
1752
1747
  const [paymentPhase, setPaymentPhase] = (0, import_react5.useState)("idle");
1753
1748
  const [memoryKey, setMemoryKey] = (0, import_react5.useState)(null);
1754
1749
  const [sessions, setSessions] = (0, import_react5.useState)(() => loadSessions());
1755
1750
  const [sidebarOpen, setSidebarOpen] = (0, import_react5.useState)(false);
1756
1751
  const [replayMessages, setReplayMessages] = (0, import_react5.useState)(null);
1757
- const { status: pollStatus } = (0, import_sdk6.usePaymentPolling)({
1758
- client: client.api,
1759
- merchantReference: merchantRef,
1760
- onSuccess: () => {
1761
- setPaymentPhase("done");
1762
- setMerchantRef(null);
1763
- },
1764
- onFailure: () => {
1765
- setPaymentPhase("failed");
1766
- setMerchantRef(null);
1767
- }
1768
- });
1769
1752
  (0, import_react5.useEffect)(() => {
1770
1753
  if (!lastAction) return;
1771
1754
  if (lastAction.type === "request_phone") {
1772
1755
  setPaymentPhase("prompt_phone");
1773
- } else if (lastAction.type === "awaiting_payment") {
1774
- setMerchantRef(lastAction.merchantReference ?? null);
1775
- setPaymentPhase("awaiting");
1776
1756
  }
1777
1757
  }, [lastAction]);
1778
1758
  const isStringTheme = typeof theme === "string";
@@ -1829,7 +1809,6 @@ function ChatModal({
1829
1809
  reset();
1830
1810
  setReplayMessages(null);
1831
1811
  setPaymentPhase("idle");
1832
- setMerchantRef(null);
1833
1812
  }, [reset, saveCurrentSession]);
1834
1813
  const handleSourceClick = (src) => {
1835
1814
  setSelectedProduct(src);
@@ -2117,56 +2096,6 @@ function ChatModal({
2117
2096
  ] })
2118
2097
  ] }) }) })
2119
2098
  ] }),
2120
- !replayMessages && paymentPhase === "awaiting" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "hsk-cb-payment-prompt hsk-cb-payment-prompt--awaiting", children: [
2121
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-payment-pulse-ring" }),
2122
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-payment-icon-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { fontSize: "2rem" }, children: "\u{1F4F1}" }) }),
2123
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "hsk-cb-payment-label", style: { fontWeight: 600 }, children: "Check your phone" }),
2124
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { className: "hsk-cb-payment-sub", children: [
2125
- "An M-Pesa STK push has been sent.",
2126
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("br", {}),
2127
- "Enter your PIN to complete payment."
2128
- ] }),
2129
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "hsk-cb-payment-dots", children: [
2130
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-dot hsk-cb-dot--amber" }),
2131
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-dot hsk-cb-dot--amber" }),
2132
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-dot hsk-cb-dot--amber" })
2133
- ] })
2134
- ] }),
2135
- !replayMessages && paymentPhase === "done" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "hsk-cb-payment-prompt hsk-cb-payment-prompt--success", children: [
2136
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-payment-success-ring" }),
2137
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-payment-icon-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { fontSize: "2.5rem" }, children: "\u2705" }) }),
2138
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "hsk-cb-payment-label", children: "Payment complete!" }),
2139
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "hsk-cb-payment-sub", children: "Thank you for your order. A confirmation has been sent." })
2140
- ] }),
2141
- !replayMessages && paymentPhase === "failed" && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "hsk-cb-payment-prompt hsk-cb-payment-prompt--failed", children: [
2142
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "hsk-cb-payment-icon-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { style: { fontSize: "2.5rem" }, children: "\u274C" }) }),
2143
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "hsk-cb-payment-label", children: "Payment failed or timed out" }),
2144
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "hsk-cb-payment-sub", children: "Please check your M-Pesa PIN and try again, or contact support." }),
2145
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "hsk-cb-payment-actions", children: [
2146
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2147
- "button",
2148
- {
2149
- className: "hsk-cb-pay-submit",
2150
- onClick: () => {
2151
- setPaymentPhase("prompt_phone");
2152
- setMerchantRef(null);
2153
- },
2154
- children: "Try again"
2155
- }
2156
- ),
2157
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
2158
- "button",
2159
- {
2160
- className: "hsk-cb-pay-secondary",
2161
- onClick: () => {
2162
- setPaymentPhase("idle");
2163
- setMerchantRef(null);
2164
- },
2165
- children: "Cancel"
2166
- }
2167
- )
2168
- ] })
2169
- ] }),
2170
2099
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { ref: bottomRef, style: { height: 1 } })
2171
2100
  ] }),
2172
2101
  !replayMessages && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "hsk-cb-input-wrap", children: [
@@ -2349,7 +2278,7 @@ function KikuButton({
2349
2278
  // src/components/Sparkle.tsx
2350
2279
  var import_react6 = require("react");
2351
2280
  var import_react_dom2 = require("react-dom");
2352
- var import_sdk8 = require("@akropolys/sdk");
2281
+ var import_sdk7 = require("@akropolys/sdk");
2353
2282
  var import_jsx_runtime8 = require("react/jsx-runtime");
2354
2283
  var SparkleIcon3 = ({ className, size = 16 }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
2355
2284
  "svg",
@@ -2460,11 +2389,11 @@ function SparkleModal({
2460
2389
  classNames = {},
2461
2390
  product: initialProduct
2462
2391
  }) {
2463
- const client = (0, import_sdk8.useAkropolysContext)();
2392
+ const client = (0, import_sdk7.useAkropolysContext)();
2464
2393
  const [fetchedProduct, setFetchedProduct] = (0, import_react6.useState)(null);
2465
2394
  const displayProduct = initialProduct || fetchedProduct;
2466
- const { results, loading: searchLoading, search } = (0, import_sdk8.useSearch)({ type: "vector" });
2467
- const { messages, sources, loading: chatLoading, error: chatError, send } = (0, import_sdk8.useKiku)();
2395
+ const { results, loading: searchLoading, search } = (0, import_sdk7.useSearch)({ type: "vector" });
2396
+ const { messages, sources, loading: chatLoading, error: chatError, send } = (0, import_sdk7.useKiku)();
2468
2397
  const [chatInput, setChatInput] = (0, import_react6.useState)("");
2469
2398
  const [isMobile, setIsMobile] = (0, import_react6.useState)(false);
2470
2399
  const [showSpecs, setShowSpecs] = (0, import_react6.useState)(false);
@@ -2948,466 +2877,9 @@ function Sparkle({
2948
2877
  )
2949
2878
  ] });
2950
2879
  }
2951
-
2952
- // src/components/CartBadge.tsx
2953
- var import_sdk9 = require("@akropolys/sdk");
2954
- var import_jsx_runtime9 = require("react/jsx-runtime");
2955
- function CartBadge({ className }) {
2956
- const { cart } = (0, import_sdk9.useCart)();
2957
- if (!cart || cart.item_count === 0) return null;
2958
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: cn("hsk-cart-badge", className), children: cart.item_count });
2959
- }
2960
-
2961
- // src/components/CartDrawer.tsx
2962
- var import_react8 = require("react");
2963
- var import_react_dom4 = require("react-dom");
2964
- var import_sdk11 = require("@akropolys/sdk");
2965
-
2966
- // src/components/CheckoutModal.tsx
2967
- var import_react7 = require("react");
2968
- var import_react_dom3 = require("react-dom");
2969
- var import_sdk10 = require("@akropolys/sdk");
2970
- var import_jsx_runtime10 = require("react/jsx-runtime");
2971
- function CheckoutModal({
2972
- onClose,
2973
- theme,
2974
- customStyles,
2975
- hskThemeAttr
2976
- }) {
2977
- const { cart, loading: cartLoading } = (0, import_sdk10.useCart)();
2978
- const client = (0, import_sdk10.useAkropolysContext)();
2979
- const [config, setConfig] = (0, import_react7.useState)(null);
2980
- const [loadingConfig, setLoadingConfig] = (0, import_react7.useState)(true);
2981
- const [phone, setPhone] = (0, import_react7.useState)(() => {
2982
- if (typeof window !== "undefined") {
2983
- return localStorage.getItem("akropolys_user_phone") || "";
2984
- }
2985
- return "";
2986
- });
2987
- const [email, setEmail] = (0, import_react7.useState)(() => {
2988
- if (typeof window !== "undefined") {
2989
- return localStorage.getItem("akropolys_user_email") || "";
2990
- }
2991
- return "";
2992
- });
2993
- const [firstName, setFirstName] = (0, import_react7.useState)(() => {
2994
- if (typeof window !== "undefined") {
2995
- return localStorage.getItem("akropolys_user_firstname") || "";
2996
- }
2997
- return "";
2998
- });
2999
- const [lastName, setLastName] = (0, import_react7.useState)(() => {
3000
- if (typeof window !== "undefined") {
3001
- return localStorage.getItem("akropolys_user_lastname") || "";
3002
- }
3003
- return "";
3004
- });
3005
- const [phase, setPhase] = (0, import_react7.useState)("idle");
3006
- const [merchantRef, setMerchantRef] = (0, import_react7.useState)(null);
3007
- const [payError, setPayError] = (0, import_react7.useState)(null);
3008
- const {} = (0, import_sdk10.usePaymentPolling)({
3009
- client: client.api,
3010
- merchantReference: merchantRef,
3011
- onSuccess: () => {
3012
- setPhase("done");
3013
- setMerchantRef(null);
3014
- },
3015
- onFailure: () => {
3016
- setPhase("failed");
3017
- setPayError("Payment failed or timed out. Please try again.");
3018
- setMerchantRef(null);
3019
- }
3020
- });
3021
- (0, import_react7.useEffect)(() => {
3022
- client.api.getCheckoutConfig().then((res) => setConfig(res.payment_methods)).catch(() => {
3023
- }).finally(() => setLoadingConfig(false));
3024
- }, [client]);
3025
- const hasPaymentMethods = config && Object.values(config).some((m) => m.enabled);
3026
- const handlePay = async (e) => {
3027
- e.preventDefault();
3028
- if (!phone.trim()) {
3029
- setPayError("Phone number is required.");
3030
- return;
3031
- }
3032
- setPayError(null);
3033
- setPhase("awaiting");
3034
- try {
3035
- if (typeof window !== "undefined") {
3036
- localStorage.setItem("akropolys_user_phone", phone.trim());
3037
- localStorage.setItem("akropolys_user_email", email.trim());
3038
- localStorage.setItem("akropolys_user_firstname", firstName.trim());
3039
- localStorage.setItem("akropolys_user_lastname", lastName.trim());
3040
- }
3041
- const res = await client.api.initiatePayment(phone.trim(), email, firstName, lastName);
3042
- if (res?.merchantReference) {
3043
- setMerchantRef(res.merchantReference);
3044
- } else {
3045
- throw new Error("No merchant reference returned.");
3046
- }
3047
- } catch (err) {
3048
- setPhase("failed");
3049
- setPayError(err.message || "Could not connect to payment processor.");
3050
- }
3051
- };
3052
- const currency = cart?.currency || "KES";
3053
- const total = cart?.total || 0;
3054
- const backdropStyle = { ...customStyles, fontSize: "15px", fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif', zIndex: 999999 };
3055
- return (0, import_react_dom3.createPortal)(
3056
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3057
- "div",
3058
- {
3059
- className: "hsk-checkout-backdrop-full",
3060
- style: backdropStyle,
3061
- "data-hsk-theme": hskThemeAttr,
3062
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
3063
- "div",
3064
- {
3065
- className: "hsk-checkout-modal-full",
3066
- style: customStyles,
3067
- "data-hsk-theme": hskThemeAttr,
3068
- children: [
3069
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3070
- "button",
3071
- {
3072
- onClick: (e) => {
3073
- e.preventDefault();
3074
- e.stopPropagation();
3075
- onClose();
3076
- },
3077
- className: "hsk-checkout-close-x",
3078
- "aria-label": "Close checkout",
3079
- children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
3080
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
3081
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
3082
- ] })
3083
- }
3084
- ),
3085
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-panel-left", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-left-content", children: [
3086
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("button", { onClick: (e) => {
3087
- e.preventDefault();
3088
- e.stopPropagation();
3089
- onClose();
3090
- }, className: "hsk-checkout-back-btn", children: [
3091
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
3092
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("line", { x1: "19", y1: "12", x2: "5", y2: "12" }),
3093
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("polyline", { points: "12 19 5 12 12 5" })
3094
- ] }),
3095
- "Back to store"
3096
- ] }),
3097
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-store-info", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h2", { children: "Secure Checkout" }) }),
3098
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-amount-due", children: [
3099
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "hsk-checkout-label-muted", children: "Pay total" }),
3100
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-grand-total", children: [
3101
- currency,
3102
- " ",
3103
- total.toLocaleString(void 0, { minimumFractionDigits: 2 })
3104
- ] })
3105
- ] }),
3106
- cartLoading || !cart ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "hsk-cart-loading", children: "Loading order..." }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-items-list-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("ul", { className: "hsk-checkout-items-list", children: cart.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { className: "hsk-checkout-item-row", children: [
3107
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-item-img-container", children: [
3108
- item.image ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { src: item.image, alt: item.name, className: "hsk-checkout-item-img" }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-item-img-placeholder", children: "\u{1F6D2}" }),
3109
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "hsk-checkout-item-qty-badge", children: item.quantity })
3110
- ] }),
3111
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-item-details", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "hsk-checkout-item-name", children: item.name }) }),
3112
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "hsk-checkout-item-price", children: [
3113
- item.currency,
3114
- " ",
3115
- (item.price_numeric * item.quantity).toLocaleString(void 0, { minimumFractionDigits: 2 })
3116
- ] })
3117
- ] }, item.id)) }) })
3118
- ] }) }),
3119
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-panel-right", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-right-content", children: phase === "done" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-status-card success", children: [
3120
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-status-icon-wrap success", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
3121
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", { d: "M22 11.08V12a10 10 0 1 1-5.93-9.14" }),
3122
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("polyline", { points: "22 4 12 14.01 9 11.01" })
3123
- ] }) }),
3124
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { children: "Payment Successful!" }),
3125
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { children: "Your transaction has been confirmed. Thank you for your order!" }),
3126
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { onClick: onClose, className: "hsk-pay-btn hsk-btn-primary", style: { marginTop: "1.5rem" }, children: "Continue Shopping" })
3127
- ] }) : phase === "awaiting" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-status-card awaiting", children: [
3128
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-status-spinner-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-status-spinner" }) }),
3129
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { children: "Confirm payment on your phone" }),
3130
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("p", { children: [
3131
- "We've sent an M-Pesa STK push prompt to ",
3132
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("strong", { children: [
3133
- "254",
3134
- phone
3135
- ] }),
3136
- "."
3137
- ] }),
3138
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-stk-instructions", children: [
3139
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { children: "1. Check your phone lockscreen for the M-Pesa prompt." }),
3140
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { children: "2. Enter your M-Pesa PIN and press OK." }),
3141
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { children: "3. Wait here \u2014 this page auto-updates once confirmed." })
3142
- ] }),
3143
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3144
- "button",
3145
- {
3146
- onClick: () => {
3147
- setPhase("cancelled");
3148
- setMerchantRef(null);
3149
- },
3150
- className: "hsk-checkout-cancel-btn",
3151
- children: "Cancel payment"
3152
- }
3153
- )
3154
- ] }) : phase === "cancelled" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-status-card cancelled", children: [
3155
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-status-icon-wrap cancelled", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
3156
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("path", { d: "m15 9-6 6M9 9l6 6" }),
3157
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("circle", { cx: "12", cy: "12", r: "10" })
3158
- ] }) }),
3159
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { children: "Payment Cancelled" }),
3160
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { children: "No charge was made. You can update your phone number and try again whenever you're ready." }),
3161
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-status-actions", children: [
3162
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { onClick: () => {
3163
- setPhase("idle");
3164
- setPayError(null);
3165
- }, className: "hsk-pay-btn hsk-btn-primary", children: "Try again" }),
3166
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { onClick: onClose, className: "hsk-checkout-cancel-btn", children: "Back to cart" })
3167
- ] })
3168
- ] }) : phase === "failed" ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-status-card failed", children: [
3169
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-status-icon-wrap failed", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
3170
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
3171
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("line", { x1: "12", y1: "8", x2: "12", y2: "12" }),
3172
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })
3173
- ] }) }),
3174
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { children: "Payment Failed" }),
3175
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "hsk-checkout-error-text", children: payError || "Could not verify M-Pesa transaction. Please check your phone and try again." }),
3176
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-status-actions", children: [
3177
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { onClick: () => {
3178
- setPhase("idle");
3179
- setPayError(null);
3180
- }, className: "hsk-pay-btn hsk-btn-primary", children: "Try again" }),
3181
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("button", { onClick: onClose, className: "hsk-checkout-cancel-btn", children: "Back to cart" })
3182
- ] })
3183
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-checkout-payment-form-wrap", children: [
3184
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { className: "hsk-checkout-section-title", children: "Payment details" }),
3185
- loadingConfig ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "hsk-cart-loading", children: "Loading payment configuration..." }) : !hasPaymentMethods ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "hsk-checkout-error", children: "No payment methods configured for this store." }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("form", { onSubmit: handlePay, className: "hsk-stripe-checkout-form", children: [
3186
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-form-group", children: [
3187
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("label", { className: "hsk-form-label", children: "M-Pesa Mobile Number" }),
3188
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-phone-input-container", children: [
3189
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "hsk-phone-prefix", children: "254" }),
3190
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3191
- "input",
3192
- {
3193
- type: "tel",
3194
- required: true,
3195
- placeholder: "712345678",
3196
- pattern: "[0-9]{9}",
3197
- maxLength: 9,
3198
- value: phone,
3199
- onChange: (e) => setPhone(e.target.value.replace(/\D/g, "")),
3200
- className: "hsk-phone-input-field"
3201
- }
3202
- )
3203
- ] }),
3204
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "hsk-form-hint", children: "Enter your 9-digit number (e.g. 712345678)" })
3205
- ] }),
3206
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-form-group", children: [
3207
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("label", { className: "hsk-form-label", children: "Email address" }),
3208
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3209
- "input",
3210
- {
3211
- type: "email",
3212
- placeholder: "john.doe@example.com",
3213
- value: email,
3214
- onChange: (e) => setEmail(e.target.value),
3215
- className: "hsk-form-input"
3216
- }
3217
- )
3218
- ] }),
3219
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-form-row", children: [
3220
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-form-group", children: [
3221
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("label", { className: "hsk-form-label", children: "First Name" }),
3222
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3223
- "input",
3224
- {
3225
- type: "text",
3226
- placeholder: "John",
3227
- value: firstName,
3228
- onChange: (e) => setFirstName(e.target.value),
3229
- className: "hsk-form-input"
3230
- }
3231
- )
3232
- ] }),
3233
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "hsk-form-group", children: [
3234
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("label", { className: "hsk-form-label", children: "Last Name" }),
3235
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
3236
- "input",
3237
- {
3238
- type: "text",
3239
- placeholder: "Doe",
3240
- value: lastName,
3241
- onChange: (e) => setLastName(e.target.value),
3242
- className: "hsk-form-input"
3243
- }
3244
- )
3245
- ] })
3246
- ] }),
3247
- payError && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-form-error-banner", children: payError }),
3248
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("button", { type: "submit", className: "hsk-checkout-submit-btn", children: [
3249
- "Pay ",
3250
- currency,
3251
- " ",
3252
- total.toLocaleString()
3253
- ] }),
3254
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "hsk-checkout-footer-brand", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "Powered by Akropolys" }) })
3255
- ] })
3256
- ] }) }) })
3257
- ]
3258
- }
3259
- )
3260
- }
3261
- ),
3262
- document.body
3263
- );
3264
- }
3265
-
3266
- // src/components/CartDrawer.tsx
3267
- var import_jsx_runtime11 = require("react/jsx-runtime");
3268
- function CartDrawer({
3269
- trigger,
3270
- className,
3271
- theme
3272
- }) {
3273
- const { cart, loading } = (0, import_sdk11.useCart)();
3274
- const [open, setOpen] = (0, import_react8.useState)(false);
3275
- const [showCheckout, setShowCheckout] = (0, import_react8.useState)(false);
3276
- const [mounted, setMounted] = (0, import_react8.useState)(false);
3277
- const client = (0, import_sdk11.useAkropolysContext)();
3278
- (0, import_react8.useEffect)(() => {
3279
- setMounted(true);
3280
- const handleTriggerCheckout = () => {
3281
- setShowCheckout(true);
3282
- setOpen(false);
3283
- };
3284
- window.addEventListener("akropolys:trigger_checkout", handleTriggerCheckout);
3285
- return () => {
3286
- window.removeEventListener("akropolys:trigger_checkout", handleTriggerCheckout);
3287
- };
3288
- }, []);
3289
- (0, import_react8.useEffect)(() => {
3290
- if (open) {
3291
- document.body.style.overflow = "hidden";
3292
- } else {
3293
- document.body.style.overflow = "";
3294
- }
3295
- return () => {
3296
- document.body.style.overflow = "";
3297
- };
3298
- }, [open]);
3299
- const handleCheckout = async () => {
3300
- if (!cart || cart.items.length === 0) return;
3301
- const event = new CustomEvent("akropolys:trigger_checkout", { cancelable: true });
3302
- window.dispatchEvent(event);
3303
- if (event.defaultPrevented) {
3304
- setOpen(false);
3305
- return;
3306
- }
3307
- setShowCheckout(true);
3308
- };
3309
- const isStringTheme = typeof theme === "string";
3310
- const hskThemeAttr = isStringTheme ? theme : void 0;
3311
- const customStyles = !isStringTheme && theme ? {
3312
- ...theme?.primaryColor && { "--hsk-primary": theme.primaryColor, "--hsk-primary-color": theme.primaryColor },
3313
- ...theme?.backgroundColor && { "--hsk-bg": theme.backgroundColor },
3314
- ...theme?.textColor && { "--hsk-text": theme.textColor },
3315
- ...theme?.fontFamily && { "--hsk-font": theme.fontFamily },
3316
- ...theme?.borderRadius && { "--hsk-border-radius": theme.borderRadius }
3317
- } : void 0;
3318
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
3319
- trigger ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { onClick: () => setOpen(true), style: { display: "inline-block" }, children: trigger }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3320
- "button",
3321
- {
3322
- onClick: () => setOpen(true),
3323
- className: cn("hsk-cart-trigger", className),
3324
- style: customStyles,
3325
- "data-hsk-theme": hskThemeAttr,
3326
- "aria-label": "Open cart",
3327
- children: [
3328
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
3329
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("circle", { cx: "9", cy: "21", r: "1" }),
3330
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("circle", { cx: "20", cy: "21", r: "1" }),
3331
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("path", { d: "M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6" })
3332
- ] }),
3333
- cart && cart.item_count > 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "hsk-cart-trigger-badge", children: cart.item_count }) : null
3334
- ]
3335
- }
3336
- ),
3337
- open && mounted && (0, import_react_dom4.createPortal)(
3338
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3339
- "div",
3340
- {
3341
- className: "hsk-cart-backdrop",
3342
- style: customStyles,
3343
- "data-hsk-theme": hskThemeAttr,
3344
- onClick: () => setOpen(false),
3345
- children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
3346
- "div",
3347
- {
3348
- className: "hsk-cart-bottom-sheet",
3349
- style: customStyles,
3350
- "data-hsk-theme": hskThemeAttr,
3351
- onClick: (e) => e.stopPropagation(),
3352
- children: [
3353
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "hsk-cart-sheet-handle" }),
3354
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "hsk-cart-sheet-header", children: [
3355
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("h2", { children: "Your Cart" }),
3356
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("button", { onClick: () => setOpen(false), className: "hsk-close-btn", children: "\xD7" })
3357
- ] }),
3358
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "hsk-cart-sheet-content", children: loading && !cart ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "hsk-cart-loading", children: "Loading cart..." }) : !cart || cart.items.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "hsk-cart-empty", children: "Your cart is empty." }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("ul", { className: "hsk-cart-items", children: cart.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("li", { className: "hsk-cart-item", children: [
3359
- item.image && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { src: item.image, alt: item.name, className: "hsk-cart-item-img" }),
3360
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "hsk-cart-item-info", children: [
3361
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "hsk-cart-item-name", children: item.name }),
3362
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "hsk-cart-item-price", children: [
3363
- item.currency,
3364
- " ",
3365
- item.price_numeric.toLocaleString(void 0, { minimumFractionDigits: 2 })
3366
- ] })
3367
- ] }),
3368
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "hsk-cart-item-qty", children: [
3369
- "x",
3370
- item.quantity
3371
- ] })
3372
- ] }, item.id)) }) }),
3373
- cart && cart.items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "hsk-cart-sheet-footer", children: [
3374
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "hsk-cart-total", children: [
3375
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: "Total" }),
3376
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { children: [
3377
- cart.currency,
3378
- " ",
3379
- cart.total.toLocaleString(void 0, { minimumFractionDigits: 2 })
3380
- ] })
3381
- ] }),
3382
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("button", { onClick: handleCheckout, className: "hsk-checkout-btn", children: "Checkout securely" })
3383
- ] })
3384
- ]
3385
- }
3386
- )
3387
- }
3388
- ),
3389
- document.body
3390
- ),
3391
- showCheckout && mounted && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
3392
- CheckoutModal,
3393
- {
3394
- onClose: () => {
3395
- setShowCheckout(false);
3396
- setOpen(false);
3397
- },
3398
- theme: isStringTheme ? theme : void 0,
3399
- customStyles,
3400
- hskThemeAttr
3401
- }
3402
- )
3403
- ] });
3404
- }
3405
2880
  // Annotate the CommonJS export names for ESM import in node:
3406
2881
  0 && (module.exports = {
3407
- CartBadge,
3408
- CartDrawer,
3409
2882
  ChatWidget,
3410
- CheckoutModal,
3411
2883
  ComparisonMatrix,
3412
2884
  KikuButton,
3413
2885
  KikuChat,