@b3dotfun/sdk 0.0.40-alpha.20 → 0.0.40-alpha.22

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 (36) hide show
  1. package/dist/cjs/anyspend/react/components/AnySpend.js +2 -0
  2. package/dist/cjs/anyspend/react/components/AnySpendCustom.d.ts +1 -0
  3. package/dist/cjs/anyspend/react/components/AnySpendCustom.js +30 -6
  4. package/dist/cjs/anyspend/react/components/AnySpendNFT.d.ts +2 -1
  5. package/dist/cjs/anyspend/react/components/AnySpendNFT.js +2 -2
  6. package/dist/cjs/anyspend/react/components/common/CryptoReceiveSection.js +2 -1
  7. package/dist/cjs/anyspend/react/components/common/PanelOnramp.js +4 -1
  8. package/dist/cjs/anyspend/react/components/common/PointsBadge.d.ts +7 -0
  9. package/dist/cjs/anyspend/react/components/common/PointsBadge.js +7 -0
  10. package/dist/cjs/anyspend/react/hooks/useAnyspendFlow.js +1 -0
  11. package/dist/cjs/anyspend/types/api.d.ts +30 -0
  12. package/dist/esm/anyspend/react/components/AnySpend.js +2 -0
  13. package/dist/esm/anyspend/react/components/AnySpendCustom.d.ts +1 -0
  14. package/dist/esm/anyspend/react/components/AnySpendCustom.js +30 -6
  15. package/dist/esm/anyspend/react/components/AnySpendNFT.d.ts +2 -1
  16. package/dist/esm/anyspend/react/components/AnySpendNFT.js +2 -2
  17. package/dist/esm/anyspend/react/components/common/CryptoReceiveSection.js +2 -1
  18. package/dist/esm/anyspend/react/components/common/PanelOnramp.js +4 -1
  19. package/dist/esm/anyspend/react/components/common/PointsBadge.d.ts +7 -0
  20. package/dist/esm/anyspend/react/components/common/PointsBadge.js +4 -0
  21. package/dist/esm/anyspend/react/hooks/useAnyspendFlow.js +1 -0
  22. package/dist/esm/anyspend/types/api.d.ts +30 -0
  23. package/dist/styles/index.css +1 -1
  24. package/dist/types/anyspend/react/components/AnySpendCustom.d.ts +1 -0
  25. package/dist/types/anyspend/react/components/AnySpendNFT.d.ts +2 -1
  26. package/dist/types/anyspend/react/components/common/PointsBadge.d.ts +7 -0
  27. package/dist/types/anyspend/types/api.d.ts +30 -0
  28. package/package.json +1 -1
  29. package/src/anyspend/react/components/AnySpend.tsx +2 -0
  30. package/src/anyspend/react/components/AnySpendCustom.tsx +60 -8
  31. package/src/anyspend/react/components/AnySpendNFT.tsx +3 -0
  32. package/src/anyspend/react/components/common/CryptoReceiveSection.tsx +6 -8
  33. package/src/anyspend/react/components/common/PanelOnramp.tsx +10 -10
  34. package/src/anyspend/react/components/common/PointsBadge.tsx +20 -0
  35. package/src/anyspend/react/hooks/useAnyspendFlow.ts +1 -0
  36. package/src/anyspend/types/api.ts +30 -0
@@ -330,6 +330,7 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
330
330
  type: "swap",
331
331
  tradeType: isSrcInputDirty ? "EXACT_INPUT" : "EXACT_OUTPUT",
332
332
  amount: activeInputAmountInWei,
333
+ recipientAddress,
333
334
  }
334
335
  : {
335
336
  srcChain: chains_1.base.id,
@@ -339,6 +340,7 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
339
340
  type: "swap",
340
341
  tradeType: "EXACT_INPUT",
341
342
  amount: srcAmountOnrampInWei,
343
+ recipientAddress,
342
344
  onrampVendor: getOnrampVendor(selectedFiatPaymentMethod),
343
345
  });
344
346
  // Load custom recipients from local storage on mount
@@ -20,4 +20,5 @@ export declare function AnySpendCustom(props: {
20
20
  }) => React.JSX.Element;
21
21
  onSuccess?: (txHash?: string) => void;
22
22
  showRecipient?: boolean;
23
+ onShowPointsDetail?: () => void;
23
24
  }): import("react/jsx-runtime").JSX.Element;
@@ -19,12 +19,15 @@ const react_3 = require("motion/react");
19
19
  const react_4 = require("react");
20
20
  const sonner_1 = require("sonner");
21
21
  const chains_1 = require("viem/chains");
22
+ const FeatureFlagsContext_1 = require("../contexts/FeatureFlagsContext");
22
23
  const AnySpendFingerprintWrapper_1 = require("./AnySpendFingerprintWrapper");
23
24
  const CryptoPaymentMethod_1 = require("./common/CryptoPaymentMethod");
24
25
  const FiatPaymentMethod_1 = require("./common/FiatPaymentMethod");
25
26
  const OrderDetails_1 = require("./common/OrderDetails");
26
27
  const OrderHistory_1 = require("./common/OrderHistory");
27
28
  const OrderToken_1 = require("./common/OrderToken");
29
+ const PointsBadge_1 = require("./common/PointsBadge");
30
+ const PointsDetailPanel_1 = require("./common/PointsDetailPanel");
28
31
  const RecipientSelection_1 = require("./common/RecipientSelection");
29
32
  var PanelView;
30
33
  (function (PanelView) {
@@ -35,8 +38,9 @@ var PanelView;
35
38
  PanelView[PanelView["RECIPIENT_SELECTION"] = 4] = "RECIPIENT_SELECTION";
36
39
  PanelView[PanelView["CRYPTO_PAYMENT_METHOD"] = 5] = "CRYPTO_PAYMENT_METHOD";
37
40
  PanelView[PanelView["FIAT_PAYMENT_METHOD"] = 6] = "FIAT_PAYMENT_METHOD";
41
+ PanelView[PanelView["POINTS_DETAIL"] = 7] = "POINTS_DETAIL";
38
42
  })(PanelView || (PanelView = {}));
39
- function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChainId, dstToken, dstAmount, contractAddress, tokenId, contractType, encodedData, spenderAddress, }) {
43
+ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChainId, dstToken, recipientAddress, dstAmount, contractAddress, tokenId, contractType, encodedData, spenderAddress, }) {
40
44
  switch (orderType) {
41
45
  case "mint_nft": {
42
46
  (0, invariant_1.default)(contractType, "Contract type is required");
@@ -46,6 +50,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
46
50
  srcTokenAddress: srcToken.address,
47
51
  dstChain: dstChainId,
48
52
  dstTokenAddress: dstToken.address,
53
+ recipientAddress,
49
54
  price: dstAmount,
50
55
  contractAddress: contractAddress,
51
56
  tokenId: tokenId,
@@ -59,6 +64,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
59
64
  srcTokenAddress: srcToken.address,
60
65
  dstChain: dstChainId,
61
66
  dstTokenAddress: dstToken.address,
67
+ recipientAddress,
62
68
  price: dstAmount,
63
69
  contractAddress: contractAddress,
64
70
  };
@@ -70,6 +76,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
70
76
  srcTokenAddress: srcToken.address,
71
77
  dstChain: dstChainId,
72
78
  dstTokenAddress: dstToken.address,
79
+ recipientAddress,
73
80
  fundAmount: dstAmount,
74
81
  contractAddress: contractAddress,
75
82
  };
@@ -81,6 +88,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
81
88
  srcTokenAddress: srcToken.address,
82
89
  dstChain: dstChainId,
83
90
  dstTokenAddress: dstToken.address,
91
+ recipientAddress,
84
92
  payload: {
85
93
  amount: dstAmount,
86
94
  data: encodedData,
@@ -98,8 +106,9 @@ function AnySpendCustom(props) {
98
106
  const fingerprintConfig = (0, AnySpendFingerprintWrapper_1.getFingerprintConfig)();
99
107
  return ((0, jsx_runtime_1.jsx)(AnySpendFingerprintWrapper_1.AnySpendFingerprintWrapper, { fingerprint: fingerprintConfig, children: (0, jsx_runtime_1.jsx)(AnySpendCustomInner, { ...props }) }));
100
108
  }
101
- function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabProps = "crypto", recipientAddress: recipientAddressProps, spenderAddress, orderType, dstChainId, dstToken, dstAmount, contractAddress, encodedData, metadata, header, onSuccess, showRecipient = true, }) {
109
+ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabProps = "crypto", recipientAddress: recipientAddressProps, spenderAddress, orderType, dstChainId, dstToken, dstAmount, contractAddress, encodedData, metadata, header, onSuccess, showRecipient = true, onShowPointsDetail, }) {
102
110
  const hasMounted = (0, react_2.useHasMounted)();
111
+ const featureFlags = (0, FeatureFlagsContext_1.useFeatureFlags)();
103
112
  const searchParams = (0, react_2.useSearchParamsSSR)();
104
113
  const router = (0, react_2.useRouter)();
105
114
  const [activePanel, setActivePanel] = (0, react_4.useState)(loadOrder ? PanelView.ORDER_DETAILS : PanelView.CONFIRM_ORDER);
@@ -174,10 +183,11 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
174
183
  srcToken: activeTab === "fiat" ? constants_1.USDC_BASE : srcToken,
175
184
  dstChainId: dstChainId,
176
185
  dstToken: dstToken,
186
+ recipientAddress,
177
187
  dstAmount: dstAmount,
178
188
  contractAddress: contractAddress,
179
- tokenId: orderType === "mint_nft" ? metadata.nftContract.tokenId : undefined,
180
- contractType: orderType === "mint_nft" ? metadata.nftContract.type : undefined,
189
+ tokenId: orderType === "mint_nft" ? metadata?.nftContract?.tokenId : undefined,
190
+ contractType: orderType === "mint_nft" ? metadata?.nftContract?.type : undefined,
181
191
  encodedData: encodedData,
182
192
  spenderAddress: spenderAddress,
183
193
  });
@@ -191,6 +201,7 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
191
201
  metadata?.nftContract?.tokenId,
192
202
  metadata?.nftContract?.type,
193
203
  orderType,
204
+ recipientAddress,
194
205
  spenderAddress,
195
206
  srcChainId,
196
207
  srcToken,
@@ -425,6 +436,16 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
425
436
  router.push(`${window.location.pathname}?${params.toString()}`);
426
437
  } })), mode === "page" && (0, jsx_runtime_1.jsx)("div", { className: "h-12" })] }));
427
438
  const loadingView = ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.cn)("mx-auto flex w-full flex-col items-center gap-4 p-5", mode === "modal" && "bg-b3-react-background"), children: [(0, jsx_runtime_1.jsxs)(react_2.Badge, { variant: "default", className: "bg-b3-react-muted/30 border-b3-react-border hover:bg-b3-react-muted/50 flex items-center gap-3 px-4 py-1 text-base transition-all", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "text-b3-react-foreground size-4 animate-spin" }), (0, jsx_runtime_1.jsx)(react_2.TextShimmer, { duration: 1, className: "font-sf-rounded text-base font-semibold", children: "Loading..." })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex w-full flex-1 flex-col", children: [(0, jsx_runtime_1.jsxs)("div", { className: "mb-4 flex flex-col gap-1", children: [(0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-4 w-24" }), (0, jsx_runtime_1.jsxs)("div", { className: "mt-2 flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-8 w-48" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "ml-4 h-8 w-32" })] }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "mt-4 h-8 w-24" })] }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "mb-4 h-12 w-full" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex w-full items-center justify-between gap-4", children: [(0, jsx_runtime_1.jsxs)(react_2.Skeleton, { className: "rounded-lg bg-white/5 p-6 pb-3", children: [(0, jsx_runtime_1.jsx)("div", { className: "size-[200px]" }), (0, jsx_runtime_1.jsx)("div", { className: "mt-3 flex items-center justify-center gap-2", children: (0, jsx_runtime_1.jsx)("div", { className: "size-5 rounded-full" }) })] }), (0, jsx_runtime_1.jsx)("div", { className: "flex flex-1 flex-col gap-2", children: [1, 2, 3].map(i => ((0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-10 w-full" }, i))) })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "bg-b3-react-muted/30 mt-8 w-full rounded-lg p-4", children: [(0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "mb-3 h-4 w-48" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-4", children: [(0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-10 flex-1" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-10 flex-1" })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "flex w-full flex-col gap-3", children: [1, 2, 3, 4, 5].map(i => ((0, jsx_runtime_1.jsxs)("div", { className: "flex w-full justify-between", children: [(0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-4 w-24" }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-4 w-32" })] }, i))) }), (0, jsx_runtime_1.jsx)(react_2.Skeleton, { className: "h-10 w-full" }), mode === "page" && (0, jsx_runtime_1.jsx)("div", { className: "h-12" })] }));
439
+ // Render points badge if conditions are met
440
+ const renderPointsBadge = () => {
441
+ if (featureFlags.showPoints && anyspendQuote?.data?.pointsAmount && anyspendQuote.data.pointsAmount > 0) {
442
+ return ((0, jsx_runtime_1.jsx)(PointsBadge_1.PointsBadge, { pointsAmount: anyspendQuote.data.pointsAmount, pointsMultiplier: anyspendQuote.data.pointsMultiplier, onClick: () => {
443
+ onShowPointsDetail?.();
444
+ setActivePanel(PanelView.POINTS_DETAIL);
445
+ } }));
446
+ }
447
+ return null;
448
+ };
428
449
  // Confirm order view.
429
450
  const confirmOrderView = ((0, jsx_runtime_1.jsxs)("div", { className: "relative mx-auto flex w-full flex-col items-center", children: [header({ anyspendPrice: anyspendQuote, isLoadingAnyspendPrice: isLoadingAnyspendQuote }), (0, jsx_runtime_1.jsxs)(react_2.Tabs, { value: activeTab, onValueChange: value => setActiveTab(value), className: "bg-b3-react-background max-h-[60dvh] w-full overflow-y-auto p-5", children: [(0, jsx_runtime_1.jsx)("div", { className: "w-full", children: (0, jsx_runtime_1.jsxs)("div", { className: "bg-as-surface-secondary relative mb-4 grid h-10 grid-cols-2 rounded-xl", children: [(0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("bg-as-brand absolute bottom-0 left-0 top-0 z-0 rounded-xl transition-transform duration-100", "h-full w-1/2", activeTab === "fiat" ? "translate-x-full" : "translate-x-0"), style: { willChange: "transform" } }), (0, jsx_runtime_1.jsx)("button", { className: (0, utils_1.cn)("relative z-10 h-full w-full rounded-xl px-3 text-sm font-medium transition-colors duration-100", activeTab === "crypto" ? "text-white" : "text-as-primary/70 hover:bg-as-on-surface-2 bg-transparent"), onClick: () => {
430
451
  setActiveTab("crypto");
@@ -449,7 +470,7 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
449
470
  opacity: hasMounted ? 1 : 0,
450
471
  y: hasMounted ? 0 : 20,
451
472
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
452
- }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("span", { className: "text-as-tertiarry text-sm", children: ["Total ", (0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry", children: "(with fee)" })] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary font-semibold", children: [formattedSrcAmount || "--", " ", srcToken.symbol] })] })] })] }), (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("flex w-full flex-col items-center justify-between gap-2"), children: (0, jsx_runtime_1.jsx)(react_3.motion.div, { initial: false, animate: {
473
+ }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsxs)("span", { className: "text-as-tertiarry text-sm", children: ["Total ", (0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry", children: "(with fee)" })] }), renderPointsBadge()] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary font-semibold", children: [formattedSrcAmount || "--", " ", srcToken.symbol] })] })] })] }), (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("flex w-full flex-col items-center justify-between gap-2"), children: (0, jsx_runtime_1.jsx)(react_3.motion.div, { initial: false, animate: {
453
474
  opacity: hasMounted ? 1 : 0,
454
475
  y: hasMounted ? 0 : 20,
455
476
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
@@ -461,7 +482,7 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
461
482
  opacity: hasMounted ? 1 : 0,
462
483
  y: hasMounted ? 0 : 20,
463
484
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
464
- }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("span", { className: "text-as-tertiarry text-sm", children: ["Total ", (0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry", children: "(USD)" })] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary text-xl font-semibold", children: ["$", srcFiatAmount || "0.00"] })] })] }), (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("flex w-full flex-col items-center justify-between gap-2"), children: (0, jsx_runtime_1.jsx)(react_3.motion.div, { initial: false, animate: {
485
+ }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsxs)("span", { className: "text-as-tertiarry text-sm", children: ["Total ", (0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry", children: "(USD)" })] }), renderPointsBadge()] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary text-xl font-semibold", children: ["$", srcFiatAmount || "0.00"] })] })] }), (0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("flex w-full flex-col items-center justify-between gap-2"), children: (0, jsx_runtime_1.jsx)(react_3.motion.div, { initial: false, animate: {
465
486
  opacity: hasMounted ? 1 : 0,
466
487
  y: hasMounted ? 0 : 20,
467
488
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
@@ -488,6 +509,8 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
488
509
  setSelectedFiatPaymentMethod(method);
489
510
  setActivePanel(PanelView.CONFIRM_ORDER);
490
511
  }, srcAmountOnRamp: srcFiatAmount }) }));
512
+ // Points detail view
513
+ const pointsDetailView = ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.cn)("bg-as-surface-primary mx-auto w-[460px] max-w-full rounded-xl p-4"), children: (0, jsx_runtime_1.jsx)(PointsDetailPanel_1.PointsDetailPanel, { pointsAmount: anyspendQuote?.data?.pointsAmount || 0, onBack: () => setActivePanel(PanelView.CONFIRM_ORDER) }) }));
491
514
  // Return the TransitionPanel with all views
492
515
  return ((0, jsx_runtime_1.jsx)(react_2.StyleRoot, { children: (0, jsx_runtime_1.jsx)(react_2.TransitionPanel, { activeIndex: orderId
493
516
  ? oat
@@ -507,5 +530,6 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
507
530
  (0, jsx_runtime_1.jsx)("div", { className: "w-full", children: recipientSelectionView }, "recipient-selection-view"),
508
531
  (0, jsx_runtime_1.jsx)("div", { className: "w-full", children: cryptoPaymentMethodView }, "crypto-payment-method-view"),
509
532
  (0, jsx_runtime_1.jsx)("div", { className: "w-full", children: fiatPaymentMethodView }, "fiat-payment-method-view"),
533
+ (0, jsx_runtime_1.jsx)("div", { className: "w-full", children: pointsDetailView }, "points-detail-view"),
510
534
  ] }) }));
511
535
  }
@@ -1,8 +1,9 @@
1
1
  import { components } from "../../../anyspend/types/api";
2
- export declare function AnySpendNFT({ loadOrder, mode, recipientAddress, nftContract, onSuccess, }: {
2
+ export declare function AnySpendNFT({ loadOrder, mode, recipientAddress, nftContract, onSuccess, onShowPointsDetail, }: {
3
3
  loadOrder?: string;
4
4
  mode?: "modal" | "page";
5
5
  recipientAddress?: string;
6
6
  nftContract: components["schemas"]["NftContract"];
7
7
  onSuccess?: (txHash?: string) => void;
8
+ onShowPointsDetail?: () => void;
8
9
  }): import("react/jsx-runtime").JSX.Element;
@@ -29,7 +29,7 @@ const CONTRACT_URI_ABI = [
29
29
  type: "function",
30
30
  },
31
31
  ];
32
- function AnySpendNFT({ loadOrder, mode = "modal", recipientAddress, nftContract, onSuccess, }) {
32
+ function AnySpendNFT({ loadOrder, mode = "modal", recipientAddress, nftContract, onSuccess, onShowPointsDetail, }) {
33
33
  const [imageUrlWithFallback, setFallbackImageUrl] = (0, react_3.useState)(nftContract.imageUrl);
34
34
  const [isLoadingFallback, setIsLoadingFallback] = (0, react_3.useState)(false);
35
35
  // Fetch contract metadata when imageUrl is empty
@@ -89,7 +89,7 @@ function AnySpendNFT({ loadOrder, mode = "modal", recipientAddress, nftContract,
89
89
  return ((0, jsx_runtime_1.jsx)(AnySpendCustom_1.AnySpendCustom, { loadOrder: loadOrder, mode: mode, activeTab: "fiat", recipientAddress: recipientAddress, orderType: "mint_nft", dstChainId: nftContract.chainId, dstToken: nftContract.currency, dstAmount: nftContract.price, contractAddress: nftContract.contractAddress, encodedData: "0x", metadata: {
90
90
  type: "mint_nft",
91
91
  nftContract: nftContract,
92
- }, header: header, onSuccess: onSuccess }));
92
+ }, header: header, onSuccess: onSuccess, onShowPointsDetail: onShowPointsDetail }));
93
93
  }
94
94
  function DropdownMenu({ nftContract }) {
95
95
  const [open, setOpen] = (0, react_3.useState)(false);
@@ -10,6 +10,7 @@ const lucide_react_1 = require("lucide-react");
10
10
  const react_1 = require("motion/react");
11
11
  const FeatureFlagsContext_1 = require("../../contexts/FeatureFlagsContext");
12
12
  const OrderTokenAmount_1 = require("./OrderTokenAmount");
13
+ const PointsBadge_1 = require("./PointsBadge");
13
14
  function CryptoReceiveSection({ isDepositMode = false, isBuyMode = false, selectedRecipientAddress, recipientName, onSelectRecipient, dstAmount, dstToken, selectedDstChainId, setSelectedDstChainId, setSelectedDstToken, onChangeDstAmount, anyspendQuote, dstTokenSymbol, dstTokenLogoURI, onShowPointsDetail, }) {
14
15
  const featureFlags = (0, FeatureFlagsContext_1.useFeatureFlags)();
15
16
  return ((0, jsx_runtime_1.jsxs)(react_1.motion.div, { initial: { opacity: 0, y: 20, filter: "blur(10px)" }, animate: { opacity: 1, y: 0, filter: "blur(0px)" }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "receive-section bg-as-surface-secondary border-as-border-secondary relative flex w-full flex-col gap-2 rounded-2xl border p-4 sm:p-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex w-full items-center justify-between", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-as-primary/50 flex h-7 items-center text-sm", children: isDepositMode ? "Deposit" : "Receive" }), selectedRecipientAddress ? ((0, jsx_runtime_1.jsx)("button", { className: (0, cn_1.cn)("text-as-tertiarry flex h-7 items-center gap-2 rounded-lg"), onClick: onSelectRecipient, children: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry flex items-center gap-1 text-sm", children: recipientName ? (0, utils_1.formatUsername)(recipientName) : (0, formatAddress_1.shortenAddress)(selectedRecipientAddress || "") }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { className: "h-4 w-4" })] }) })) : ((0, jsx_runtime_1.jsx)("button", { className: "text-as-primary/70 flex items-center gap-1 rounded-lg", onClick: onSelectRecipient, children: (0, jsx_runtime_1.jsx)("div", { className: "text-sm font-medium", children: "Select recipient" }) }))] }), isBuyMode || isDepositMode ? (
@@ -51,5 +52,5 @@ function CryptoReceiveSection({ isDepositMode = false, isBuyMode = false, select
51
52
  }
52
53
  // Using inline style to ensure color displays
53
54
  return ((0, jsx_runtime_1.jsxs)("span", { className: "ml-2", style: { color: percentageNum >= 10 ? "red" : "#FFD700" }, children: ["(", isNegative ? "-" : "", percentage, "%)"] }));
54
- })()] }), featureFlags.showPoints && anyspendQuote?.data?.pointsAmount && anyspendQuote.data.pointsAmount > 0 && ((0, jsx_runtime_1.jsxs)("button", { className: "bg-as-brand hover:scale-102 active:scale-98 active:scale-98 relative flex cursor-pointer items-center gap-1 rounded-lg px-2 py-1 transition-all", onClick: () => onShowPointsDetail?.(), children: [(0, jsx_runtime_1.jsx)("div", { className: "pointer-events-none absolute inset-0 h-full w-full rounded-lg border border-white/10 border-t-white/20 bg-gradient-to-b from-white/10 to-white/0" }), (0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-white", children: ["+", anyspendQuote.data.pointsAmount.toLocaleString(), " pts"] })] }, `points-${anyspendQuote.data.pointsAmount}`))] })] }));
55
+ })()] }), featureFlags.showPoints && anyspendQuote?.data?.pointsAmount > 0 && ((0, jsx_runtime_1.jsx)(PointsBadge_1.PointsBadge, { pointsAmount: anyspendQuote.data.pointsAmount, pointsMultiplier: anyspendQuote.data.pointsMultiplier, onClick: () => onShowPointsDetail?.() }))] })] }));
55
56
  }
@@ -13,6 +13,7 @@ const sonner_1 = require("sonner");
13
13
  const FeatureFlagsContext_1 = require("../../contexts/FeatureFlagsContext");
14
14
  const FiatPaymentMethod_1 = require("./FiatPaymentMethod");
15
15
  const OrderTokenAmountFiat_1 = require("./OrderTokenAmountFiat");
16
+ const PointsBadge_1 = require("./PointsBadge");
16
17
  function PanelOnramp({ srcAmountOnRamp, setSrcAmountOnRamp, selectedPaymentMethod, setActivePanel, _recipientAddress, destinationToken, destinationChainId, destinationAmount, onDestinationTokenChange, onDestinationChainChange, fiatPaymentMethodIndex, recipientSelectionPanelIndex, dstTokenSymbol, hideDstToken = false, anyspendQuote, onShowPointsDetail, }) {
17
18
  const featureFlags = (0, FeatureFlagsContext_1.useFeatureFlags)();
18
19
  // Get geo-based onramp options to access fee information
@@ -78,5 +79,7 @@ function PanelOnramp({ srcAmountOnRamp, setSrcAmountOnRamp, selectedPaymentMetho
78
79
  : "bg-as-surface-secondary hover:bg-as-surface-secondary"}`, children: ["$", value] }, value))) }), destinationToken && destinationChainId && !hideDstToken && ((0, jsx_runtime_1.jsx)(OrderTokenAmountFiat_1.OrderTokenAmountFiat, { address: _recipientAddress, context: "to", inputValue: destinationAmount || "0", onChangeInput: () => { }, chainId: destinationChainId, setChainId: onDestinationChainChange || (() => { }), token: destinationToken, setToken: onDestinationTokenChange || (() => { }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "border-as-border-secondary bg-as-surface-secondary mt-4 flex w-full flex-col gap-3 rounded-xl border p-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex w-full items-center justify-between gap-2", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry flex items-center text-sm", children: "Recipient" }), _recipientAddress ? ((0, jsx_runtime_1.jsxs)("button", { className: "text-as-tertiarry flex h-7 items-center gap-1 text-sm transition-colors hover:text-blue-700", onClick: () => setActivePanel(recipientSelectionPanelIndex), children: [(0, jsx_runtime_1.jsx)("span", { className: "text-sm", children: recipientName ? (0, utils_1.formatUsername)(recipientName) : (0, formatAddress_1.formatAddress)(_recipientAddress) }), (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { size: 16 })] })) : ((0, jsx_runtime_1.jsxs)("button", { className: "text-as-tertiarry flex h-7 items-center gap-1 text-sm transition-colors hover:text-blue-700", onClick: () => setActivePanel(5), children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Wallet, { className: "text-as-brand", size: 16 }), "Select recipient", (0, jsx_runtime_1.jsx)(lucide_react_1.ChevronRight, { size: 16 })] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "divider w-full" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry text-sm", children: "Expected to receive" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary font-semibold", children: [destinationAmount || "0", " ", dstTokenSymbol || destinationToken?.symbol || ""] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-tertiarry text-sm", children: ["on ", destinationChainId ? chain_1.ALL_CHAINS[destinationChainId]?.name : ""] }), destinationToken && destinationChainId && destinationToken.metadata?.logoURI && ((0, jsx_runtime_1.jsx)("img", { src: chain_1.ALL_CHAINS[destinationChainId]?.logoUrl, alt: "Chain", className: "h-4 w-4 rounded-full" }))] })] }), (0, jsx_runtime_1.jsx)("div", { className: "divider w-full" }), (0, jsx_runtime_1.jsx)("div", { className: "", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-as-tertiarry text-sm", children: (() => {
79
80
  const fee = getFeeFromApi(selectedPaymentMethod || FiatPaymentMethod_1.FiatPaymentMethod.NONE);
80
81
  return fee !== null ? `Total (included $${fee.toFixed(2)} fee)` : "Total";
81
- })() }), featureFlags.showPoints && anyspendQuote?.data?.pointsAmount && anyspendQuote.data.pointsAmount > 0 && ((0, jsx_runtime_1.jsxs)("button", { className: "bg-as-brand hover:scale-102 active:scale-98 relative flex cursor-pointer items-center gap-1 rounded-lg px-2 py-1 transition-all", onClick: () => onShowPointsDetail?.(), children: [(0, jsx_runtime_1.jsx)("div", { className: "pointer-events-none absolute inset-0 h-full w-full rounded-lg border border-white/10 border-t-white/20 bg-gradient-to-b from-white/10 to-white/0" }), (0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-white", children: ["+", anyspendQuote.data.pointsAmount.toLocaleString(), " pts"] })] }, `points-${anyspendQuote.data.pointsAmount}`))] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary font-semibold", children: ["$", getTotalAmount(selectedPaymentMethod || FiatPaymentMethod_1.FiatPaymentMethod.NONE).toFixed(2)] })] }) })] })] }));
82
+ })() }), featureFlags.showPoints &&
83
+ anyspendQuote?.data?.pointsAmount &&
84
+ anyspendQuote?.data?.pointsAmount > 0 && ((0, jsx_runtime_1.jsx)(PointsBadge_1.PointsBadge, { pointsAmount: anyspendQuote.data.pointsAmount, pointsMultiplier: anyspendQuote.data.pointsMultiplier, onClick: () => onShowPointsDetail?.() }))] }), (0, jsx_runtime_1.jsxs)("span", { className: "text-as-primary font-semibold", children: ["$", getTotalAmount(selectedPaymentMethod || FiatPaymentMethod_1.FiatPaymentMethod.NONE).toFixed(2)] })] }) })] })] }));
82
85
  }
@@ -0,0 +1,7 @@
1
+ interface PointsBadgeProps {
2
+ pointsAmount: number;
3
+ pointsMultiplier?: number;
4
+ onClick?: () => void;
5
+ }
6
+ export declare function PointsBadge({ pointsAmount, pointsMultiplier, onClick }: PointsBadgeProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PointsBadge = PointsBadge;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ function PointsBadge({ pointsAmount, pointsMultiplier, onClick }) {
6
+ return ((0, jsx_runtime_1.jsxs)("button", { className: "bg-as-brand hover:scale-102 active:scale-98 relative flex cursor-pointer items-center gap-1 rounded-lg px-2 py-1 transition-all", onClick: onClick, children: [(0, jsx_runtime_1.jsx)("div", { className: "pointer-events-none absolute inset-0 h-full w-full rounded-lg border border-white/10 border-t-white/20 bg-gradient-to-b from-white/10 to-white/0" }), (0, jsx_runtime_1.jsxs)("span", { className: "relative text-xs text-white", children: ["+", pointsAmount.toLocaleString(), " pts", pointsMultiplier && pointsMultiplier > 1 && (0, jsx_runtime_1.jsxs)("span", { className: "ml-1 opacity-80", children: ["(", pointsMultiplier, "x)"] })] })] }));
7
+ }
@@ -120,6 +120,7 @@ function useAnyspendFlow({ paymentType = "crypto", recipientAddress, loadOrder,
120
120
  type: "swap",
121
121
  tradeType: "EXACT_INPUT",
122
122
  amount: activeInputAmountInWei,
123
+ recipientAddress: selectedRecipientAddress,
123
124
  onrampVendor: paymentType === "fiat" ? getOnrampVendor(selectedFiatPaymentMethod) : undefined,
124
125
  });
125
126
  // Get geo options for fiat
@@ -503,6 +503,11 @@ export interface paths {
503
503
  * @example 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
504
504
  */
505
505
  dstTokenAddress: string;
506
+ /**
507
+ * @description Recipient address
508
+ * @example 0x55c71fca5e01cf246718748ae540473e608d0282
509
+ */
510
+ recipientAddress?: string;
506
511
  /**
507
512
  * @description Type of trade execution
508
513
  * @enum {string}
@@ -544,6 +549,11 @@ export interface paths {
544
549
  * @example 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
545
550
  */
546
551
  dstTokenAddress: string;
552
+ /**
553
+ * @description Recipient address
554
+ * @example 0x55c71fca5e01cf246718748ae540473e608d0282
555
+ */
556
+ recipientAddress?: string;
547
557
  /** @description Custom payload for execution */
548
558
  payload: {
549
559
  /** @description Encoded transaction data */
@@ -567,6 +577,11 @@ export interface paths {
567
577
  dstChain: number;
568
578
  srcTokenAddress: string;
569
579
  dstTokenAddress: string;
580
+ /**
581
+ * @description Recipient address
582
+ * @example 0x55c71fca5e01cf246718748ae540473e608d0282
583
+ */
584
+ recipientAddress?: string;
570
585
  /** @enum {string} */
571
586
  onrampVendor?: "coinbase" | "stripe" | "stripe-web2";
572
587
  contractAddress: string;
@@ -581,6 +596,11 @@ export interface paths {
581
596
  dstChain: number;
582
597
  srcTokenAddress: string;
583
598
  dstTokenAddress: string;
599
+ /**
600
+ * @description Recipient address
601
+ * @example 0x55c71fca5e01cf246718748ae540473e608d0282
602
+ */
603
+ recipientAddress?: string;
584
604
  /** @enum {string} */
585
605
  onrampVendor?: "coinbase" | "stripe" | "stripe-web2";
586
606
  contractAddress: string;
@@ -592,6 +612,11 @@ export interface paths {
592
612
  dstChain: number;
593
613
  srcTokenAddress: string;
594
614
  dstTokenAddress: string;
615
+ /**
616
+ * @description Recipient address
617
+ * @example 0x55c71fca5e01cf246718748ae540473e608d0282
618
+ */
619
+ recipientAddress?: string;
595
620
  /** @enum {string} */
596
621
  onrampVendor?: "coinbase" | "stripe" | "stripe-web2";
597
622
  contractAddress: string;
@@ -622,6 +647,11 @@ export interface paths {
622
647
  * @example 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
623
648
  */
624
649
  dstTokenAddress: string;
650
+ /**
651
+ * @description Recipient address
652
+ * @example 0x55c71fca5e01cf246718748ae540473e608d0282
653
+ */
654
+ recipientAddress?: string;
625
655
  /**
626
656
  * @description Amount to quote
627
657
  * @example 1000000000000000000
@@ -323,6 +323,7 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
323
323
  type: "swap",
324
324
  tradeType: isSrcInputDirty ? "EXACT_INPUT" : "EXACT_OUTPUT",
325
325
  amount: activeInputAmountInWei,
326
+ recipientAddress,
326
327
  }
327
328
  : {
328
329
  srcChain: base.id,
@@ -332,6 +333,7 @@ function AnySpendInner({ destinationTokenAddress, destinationTokenChainId, mode
332
333
  type: "swap",
333
334
  tradeType: "EXACT_INPUT",
334
335
  amount: srcAmountOnrampInWei,
336
+ recipientAddress,
335
337
  onrampVendor: getOnrampVendor(selectedFiatPaymentMethod),
336
338
  });
337
339
  // Load custom recipients from local storage on mount
@@ -20,4 +20,5 @@ export declare function AnySpendCustom(props: {
20
20
  }) => React.JSX.Element;
21
21
  onSuccess?: (txHash?: string) => void;
22
22
  showRecipient?: boolean;
23
+ onShowPointsDetail?: () => void;
23
24
  }): import("react/jsx-runtime").JSX.Element;
@@ -13,12 +13,15 @@ import { motion } from "motion/react";
13
13
  import { useCallback, useEffect, useMemo, useState } from "react";
14
14
  import { toast } from "sonner";
15
15
  import { base } from "viem/chains";
16
+ import { useFeatureFlags } from "../contexts/FeatureFlagsContext.js";
16
17
  import { AnySpendFingerprintWrapper, getFingerprintConfig } from "./AnySpendFingerprintWrapper.js";
17
18
  import { CryptoPaymentMethod, CryptoPaymentMethodType } from "./common/CryptoPaymentMethod.js";
18
19
  import { FiatPaymentMethod, FiatPaymentMethodComponent } from "./common/FiatPaymentMethod.js";
19
20
  import { OrderDetails } from "./common/OrderDetails.js";
20
21
  import { OrderHistory } from "./common/OrderHistory.js";
21
22
  import { OrderToken } from "./common/OrderToken.js";
23
+ import { PointsBadge } from "./common/PointsBadge.js";
24
+ import { PointsDetailPanel } from "./common/PointsDetailPanel.js";
22
25
  import { RecipientSelection } from "./common/RecipientSelection.js";
23
26
  var PanelView;
24
27
  (function (PanelView) {
@@ -29,8 +32,9 @@ var PanelView;
29
32
  PanelView[PanelView["RECIPIENT_SELECTION"] = 4] = "RECIPIENT_SELECTION";
30
33
  PanelView[PanelView["CRYPTO_PAYMENT_METHOD"] = 5] = "CRYPTO_PAYMENT_METHOD";
31
34
  PanelView[PanelView["FIAT_PAYMENT_METHOD"] = 6] = "FIAT_PAYMENT_METHOD";
35
+ PanelView[PanelView["POINTS_DETAIL"] = 7] = "POINTS_DETAIL";
32
36
  })(PanelView || (PanelView = {}));
33
- function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChainId, dstToken, dstAmount, contractAddress, tokenId, contractType, encodedData, spenderAddress, }) {
37
+ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChainId, dstToken, recipientAddress, dstAmount, contractAddress, tokenId, contractType, encodedData, spenderAddress, }) {
34
38
  switch (orderType) {
35
39
  case "mint_nft": {
36
40
  invariant(contractType, "Contract type is required");
@@ -40,6 +44,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
40
44
  srcTokenAddress: srcToken.address,
41
45
  dstChain: dstChainId,
42
46
  dstTokenAddress: dstToken.address,
47
+ recipientAddress,
43
48
  price: dstAmount,
44
49
  contractAddress: contractAddress,
45
50
  tokenId: tokenId,
@@ -53,6 +58,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
53
58
  srcTokenAddress: srcToken.address,
54
59
  dstChain: dstChainId,
55
60
  dstTokenAddress: dstToken.address,
61
+ recipientAddress,
56
62
  price: dstAmount,
57
63
  contractAddress: contractAddress,
58
64
  };
@@ -64,6 +70,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
64
70
  srcTokenAddress: srcToken.address,
65
71
  dstChain: dstChainId,
66
72
  dstTokenAddress: dstToken.address,
73
+ recipientAddress,
67
74
  fundAmount: dstAmount,
68
75
  contractAddress: contractAddress,
69
76
  };
@@ -75,6 +82,7 @@ function generateGetRelayQuoteRequest({ orderType, srcChainId, srcToken, dstChai
75
82
  srcTokenAddress: srcToken.address,
76
83
  dstChain: dstChainId,
77
84
  dstTokenAddress: dstToken.address,
85
+ recipientAddress,
78
86
  payload: {
79
87
  amount: dstAmount,
80
88
  data: encodedData,
@@ -92,8 +100,9 @@ export function AnySpendCustom(props) {
92
100
  const fingerprintConfig = getFingerprintConfig();
93
101
  return (_jsx(AnySpendFingerprintWrapper, { fingerprint: fingerprintConfig, children: _jsx(AnySpendCustomInner, { ...props }) }));
94
102
  }
95
- function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabProps = "crypto", recipientAddress: recipientAddressProps, spenderAddress, orderType, dstChainId, dstToken, dstAmount, contractAddress, encodedData, metadata, header, onSuccess, showRecipient = true, }) {
103
+ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabProps = "crypto", recipientAddress: recipientAddressProps, spenderAddress, orderType, dstChainId, dstToken, dstAmount, contractAddress, encodedData, metadata, header, onSuccess, showRecipient = true, onShowPointsDetail, }) {
96
104
  const hasMounted = useHasMounted();
105
+ const featureFlags = useFeatureFlags();
97
106
  const searchParams = useSearchParamsSSR();
98
107
  const router = useRouter();
99
108
  const [activePanel, setActivePanel] = useState(loadOrder ? PanelView.ORDER_DETAILS : PanelView.CONFIRM_ORDER);
@@ -168,10 +177,11 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
168
177
  srcToken: activeTab === "fiat" ? USDC_BASE : srcToken,
169
178
  dstChainId: dstChainId,
170
179
  dstToken: dstToken,
180
+ recipientAddress,
171
181
  dstAmount: dstAmount,
172
182
  contractAddress: contractAddress,
173
- tokenId: orderType === "mint_nft" ? metadata.nftContract.tokenId : undefined,
174
- contractType: orderType === "mint_nft" ? metadata.nftContract.type : undefined,
183
+ tokenId: orderType === "mint_nft" ? metadata?.nftContract?.tokenId : undefined,
184
+ contractType: orderType === "mint_nft" ? metadata?.nftContract?.type : undefined,
175
185
  encodedData: encodedData,
176
186
  spenderAddress: spenderAddress,
177
187
  });
@@ -185,6 +195,7 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
185
195
  metadata?.nftContract?.tokenId,
186
196
  metadata?.nftContract?.type,
187
197
  orderType,
198
+ recipientAddress,
188
199
  spenderAddress,
189
200
  srcChainId,
190
201
  srcToken,
@@ -419,6 +430,16 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
419
430
  router.push(`${window.location.pathname}?${params.toString()}`);
420
431
  } })), mode === "page" && _jsx("div", { className: "h-12" })] }));
421
432
  const loadingView = (_jsxs("div", { className: cn("mx-auto flex w-full flex-col items-center gap-4 p-5", mode === "modal" && "bg-b3-react-background"), children: [_jsxs(Badge, { variant: "default", className: "bg-b3-react-muted/30 border-b3-react-border hover:bg-b3-react-muted/50 flex items-center gap-3 px-4 py-1 text-base transition-all", children: [_jsx(Loader2, { className: "text-b3-react-foreground size-4 animate-spin" }), _jsx(TextShimmer, { duration: 1, className: "font-sf-rounded text-base font-semibold", children: "Loading..." })] }), _jsxs("div", { className: "flex w-full flex-1 flex-col", children: [_jsxs("div", { className: "mb-4 flex flex-col gap-1", children: [_jsx(Skeleton, { className: "h-4 w-24" }), _jsxs("div", { className: "mt-2 flex items-center gap-2", children: [_jsx(Skeleton, { className: "h-8 w-48" }), _jsx(Skeleton, { className: "ml-4 h-8 w-32" })] }), _jsx(Skeleton, { className: "mt-4 h-8 w-24" })] }), _jsx(Skeleton, { className: "mb-4 h-12 w-full" }), _jsxs("div", { className: "flex w-full items-center justify-between gap-4", children: [_jsxs(Skeleton, { className: "rounded-lg bg-white/5 p-6 pb-3", children: [_jsx("div", { className: "size-[200px]" }), _jsx("div", { className: "mt-3 flex items-center justify-center gap-2", children: _jsx("div", { className: "size-5 rounded-full" }) })] }), _jsx("div", { className: "flex flex-1 flex-col gap-2", children: [1, 2, 3].map(i => (_jsx(Skeleton, { className: "h-10 w-full" }, i))) })] })] }), _jsxs("div", { className: "bg-b3-react-muted/30 mt-8 w-full rounded-lg p-4", children: [_jsx(Skeleton, { className: "mb-3 h-4 w-48" }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(Skeleton, { className: "h-10 flex-1" }), _jsx(Skeleton, { className: "h-10 flex-1" })] })] }), _jsx("div", { className: "flex w-full flex-col gap-3", children: [1, 2, 3, 4, 5].map(i => (_jsxs("div", { className: "flex w-full justify-between", children: [_jsx(Skeleton, { className: "h-4 w-24" }), _jsx(Skeleton, { className: "h-4 w-32" })] }, i))) }), _jsx(Skeleton, { className: "h-10 w-full" }), mode === "page" && _jsx("div", { className: "h-12" })] }));
433
+ // Render points badge if conditions are met
434
+ const renderPointsBadge = () => {
435
+ if (featureFlags.showPoints && anyspendQuote?.data?.pointsAmount && anyspendQuote.data.pointsAmount > 0) {
436
+ return (_jsx(PointsBadge, { pointsAmount: anyspendQuote.data.pointsAmount, pointsMultiplier: anyspendQuote.data.pointsMultiplier, onClick: () => {
437
+ onShowPointsDetail?.();
438
+ setActivePanel(PanelView.POINTS_DETAIL);
439
+ } }));
440
+ }
441
+ return null;
442
+ };
422
443
  // Confirm order view.
423
444
  const confirmOrderView = (_jsxs("div", { className: "relative mx-auto flex w-full flex-col items-center", children: [header({ anyspendPrice: anyspendQuote, isLoadingAnyspendPrice: isLoadingAnyspendQuote }), _jsxs(Tabs, { value: activeTab, onValueChange: value => setActiveTab(value), className: "bg-b3-react-background max-h-[60dvh] w-full overflow-y-auto p-5", children: [_jsx("div", { className: "w-full", children: _jsxs("div", { className: "bg-as-surface-secondary relative mb-4 grid h-10 grid-cols-2 rounded-xl", children: [_jsx("div", { className: cn("bg-as-brand absolute bottom-0 left-0 top-0 z-0 rounded-xl transition-transform duration-100", "h-full w-1/2", activeTab === "fiat" ? "translate-x-full" : "translate-x-0"), style: { willChange: "transform" } }), _jsx("button", { className: cn("relative z-10 h-full w-full rounded-xl px-3 text-sm font-medium transition-colors duration-100", activeTab === "crypto" ? "text-white" : "text-as-primary/70 hover:bg-as-on-surface-2 bg-transparent"), onClick: () => {
424
445
  setActiveTab("crypto");
@@ -443,7 +464,7 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
443
464
  opacity: hasMounted ? 1 : 0,
444
465
  y: hasMounted ? 0 : 20,
445
466
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
446
- }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [_jsxs("span", { className: "text-as-tertiarry text-sm", children: ["Total ", _jsx("span", { className: "text-as-tertiarry", children: "(with fee)" })] }), _jsxs("span", { className: "text-as-primary font-semibold", children: [formattedSrcAmount || "--", " ", srcToken.symbol] })] })] })] }), _jsx("div", { className: cn("flex w-full flex-col items-center justify-between gap-2"), children: _jsx(motion.div, { initial: false, animate: {
467
+ }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("span", { className: "text-as-tertiarry text-sm", children: ["Total ", _jsx("span", { className: "text-as-tertiarry", children: "(with fee)" })] }), renderPointsBadge()] }), _jsxs("span", { className: "text-as-primary font-semibold", children: [formattedSrcAmount || "--", " ", srcToken.symbol] })] })] })] }), _jsx("div", { className: cn("flex w-full flex-col items-center justify-between gap-2"), children: _jsx(motion.div, { initial: false, animate: {
447
468
  opacity: hasMounted ? 1 : 0,
448
469
  y: hasMounted ? 0 : 20,
449
470
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
@@ -455,7 +476,7 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
455
476
  opacity: hasMounted ? 1 : 0,
456
477
  y: hasMounted ? 0 : 20,
457
478
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
458
- }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [_jsxs("span", { className: "text-as-tertiarry text-sm", children: ["Total ", _jsx("span", { className: "text-as-tertiarry", children: "(USD)" })] }), _jsxs("span", { className: "text-as-primary text-xl font-semibold", children: ["$", srcFiatAmount || "0.00"] })] })] }), _jsx("div", { className: cn("flex w-full flex-col items-center justify-between gap-2"), children: _jsx(motion.div, { initial: false, animate: {
479
+ }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "relative flex w-full items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("span", { className: "text-as-tertiarry text-sm", children: ["Total ", _jsx("span", { className: "text-as-tertiarry", children: "(USD)" })] }), renderPointsBadge()] }), _jsxs("span", { className: "text-as-primary text-xl font-semibold", children: ["$", srcFiatAmount || "0.00"] })] })] }), _jsx("div", { className: cn("flex w-full flex-col items-center justify-between gap-2"), children: _jsx(motion.div, { initial: false, animate: {
459
480
  opacity: hasMounted ? 1 : 0,
460
481
  y: hasMounted ? 0 : 20,
461
482
  filter: hasMounted ? "blur(0px)" : "blur(10px)",
@@ -482,6 +503,8 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
482
503
  setSelectedFiatPaymentMethod(method);
483
504
  setActivePanel(PanelView.CONFIRM_ORDER);
484
505
  }, srcAmountOnRamp: srcFiatAmount }) }));
506
+ // Points detail view
507
+ const pointsDetailView = (_jsx("div", { className: cn("bg-as-surface-primary mx-auto w-[460px] max-w-full rounded-xl p-4"), children: _jsx(PointsDetailPanel, { pointsAmount: anyspendQuote?.data?.pointsAmount || 0, onBack: () => setActivePanel(PanelView.CONFIRM_ORDER) }) }));
485
508
  // Return the TransitionPanel with all views
486
509
  return (_jsx(StyleRoot, { children: _jsx(TransitionPanel, { activeIndex: orderId
487
510
  ? oat
@@ -501,5 +524,6 @@ function AnySpendCustomInner({ loadOrder, mode = "modal", activeTab: activeTabPr
501
524
  _jsx("div", { className: "w-full", children: recipientSelectionView }, "recipient-selection-view"),
502
525
  _jsx("div", { className: "w-full", children: cryptoPaymentMethodView }, "crypto-payment-method-view"),
503
526
  _jsx("div", { className: "w-full", children: fiatPaymentMethodView }, "fiat-payment-method-view"),
527
+ _jsx("div", { className: "w-full", children: pointsDetailView }, "points-detail-view"),
504
528
  ] }) }));
505
529
  }
@@ -1,8 +1,9 @@
1
1
  import { components } from "../../../anyspend/types/api";
2
- export declare function AnySpendNFT({ loadOrder, mode, recipientAddress, nftContract, onSuccess, }: {
2
+ export declare function AnySpendNFT({ loadOrder, mode, recipientAddress, nftContract, onSuccess, onShowPointsDetail, }: {
3
3
  loadOrder?: string;
4
4
  mode?: "modal" | "page";
5
5
  recipientAddress?: string;
6
6
  nftContract: components["schemas"]["NftContract"];
7
7
  onSuccess?: (txHash?: string) => void;
8
+ onShowPointsDetail?: () => void;
8
9
  }): import("react/jsx-runtime").JSX.Element;
@@ -26,7 +26,7 @@ const CONTRACT_URI_ABI = [
26
26
  type: "function",
27
27
  },
28
28
  ];
29
- export function AnySpendNFT({ loadOrder, mode = "modal", recipientAddress, nftContract, onSuccess, }) {
29
+ export function AnySpendNFT({ loadOrder, mode = "modal", recipientAddress, nftContract, onSuccess, onShowPointsDetail, }) {
30
30
  const [imageUrlWithFallback, setFallbackImageUrl] = useState(nftContract.imageUrl);
31
31
  const [isLoadingFallback, setIsLoadingFallback] = useState(false);
32
32
  // Fetch contract metadata when imageUrl is empty
@@ -86,7 +86,7 @@ export function AnySpendNFT({ loadOrder, mode = "modal", recipientAddress, nftCo
86
86
  return (_jsx(AnySpendCustom, { loadOrder: loadOrder, mode: mode, activeTab: "fiat", recipientAddress: recipientAddress, orderType: "mint_nft", dstChainId: nftContract.chainId, dstToken: nftContract.currency, dstAmount: nftContract.price, contractAddress: nftContract.contractAddress, encodedData: "0x", metadata: {
87
87
  type: "mint_nft",
88
88
  nftContract: nftContract,
89
- }, header: header, onSuccess: onSuccess }));
89
+ }, header: header, onSuccess: onSuccess, onShowPointsDetail: onShowPointsDetail }));
90
90
  }
91
91
  function DropdownMenu({ nftContract }) {
92
92
  const [open, setOpen] = useState(false);
@@ -7,6 +7,7 @@ import { ChevronRight } from "lucide-react";
7
7
  import { motion } from "motion/react";
8
8
  import { useFeatureFlags } from "../../contexts/FeatureFlagsContext.js";
9
9
  import { OrderTokenAmount } from "./OrderTokenAmount.js";
10
+ import { PointsBadge } from "./PointsBadge.js";
10
11
  export function CryptoReceiveSection({ isDepositMode = false, isBuyMode = false, selectedRecipientAddress, recipientName, onSelectRecipient, dstAmount, dstToken, selectedDstChainId, setSelectedDstChainId, setSelectedDstToken, onChangeDstAmount, anyspendQuote, dstTokenSymbol, dstTokenLogoURI, onShowPointsDetail, }) {
11
12
  const featureFlags = useFeatureFlags();
12
13
  return (_jsxs(motion.div, { initial: { opacity: 0, y: 20, filter: "blur(10px)" }, animate: { opacity: 1, y: 0, filter: "blur(0px)" }, transition: { duration: 0.3, delay: 0.1, ease: "easeInOut" }, className: "receive-section bg-as-surface-secondary border-as-border-secondary relative flex w-full flex-col gap-2 rounded-2xl border p-4 sm:p-6", children: [_jsxs("div", { className: "flex w-full items-center justify-between", children: [_jsx("div", { className: "text-as-primary/50 flex h-7 items-center text-sm", children: isDepositMode ? "Deposit" : "Receive" }), selectedRecipientAddress ? (_jsx("button", { className: cn("text-as-tertiarry flex h-7 items-center gap-2 rounded-lg"), onClick: onSelectRecipient, children: _jsxs(_Fragment, { children: [_jsx("span", { className: "text-as-tertiarry flex items-center gap-1 text-sm", children: recipientName ? formatUsername(recipientName) : shortenAddress(selectedRecipientAddress || "") }), _jsx(ChevronRight, { className: "h-4 w-4" })] }) })) : (_jsx("button", { className: "text-as-primary/70 flex items-center gap-1 rounded-lg", onClick: onSelectRecipient, children: _jsx("div", { className: "text-sm font-medium", children: "Select recipient" }) }))] }), isBuyMode || isDepositMode ? (
@@ -48,5 +49,5 @@ export function CryptoReceiveSection({ isDepositMode = false, isBuyMode = false,
48
49
  }
49
50
  // Using inline style to ensure color displays
50
51
  return (_jsxs("span", { className: "ml-2", style: { color: percentageNum >= 10 ? "red" : "#FFD700" }, children: ["(", isNegative ? "-" : "", percentage, "%)"] }));
51
- })()] }), featureFlags.showPoints && anyspendQuote?.data?.pointsAmount && anyspendQuote.data.pointsAmount > 0 && (_jsxs("button", { className: "bg-as-brand hover:scale-102 active:scale-98 active:scale-98 relative flex cursor-pointer items-center gap-1 rounded-lg px-2 py-1 transition-all", onClick: () => onShowPointsDetail?.(), children: [_jsx("div", { className: "pointer-events-none absolute inset-0 h-full w-full rounded-lg border border-white/10 border-t-white/20 bg-gradient-to-b from-white/10 to-white/0" }), _jsxs("span", { className: "text-xs text-white", children: ["+", anyspendQuote.data.pointsAmount.toLocaleString(), " pts"] })] }, `points-${anyspendQuote.data.pointsAmount}`))] })] }));
52
+ })()] }), featureFlags.showPoints && anyspendQuote?.data?.pointsAmount > 0 && (_jsx(PointsBadge, { pointsAmount: anyspendQuote.data.pointsAmount, pointsMultiplier: anyspendQuote.data.pointsMultiplier, onClick: () => onShowPointsDetail?.() }))] })] }));
52
53
  }
@@ -10,6 +10,7 @@ import { toast } from "sonner";
10
10
  import { useFeatureFlags } from "../../contexts/FeatureFlagsContext.js";
11
11
  import { FiatPaymentMethod } from "./FiatPaymentMethod.js";
12
12
  import { OrderTokenAmountFiat } from "./OrderTokenAmountFiat.js";
13
+ import { PointsBadge } from "./PointsBadge.js";
13
14
  export function PanelOnramp({ srcAmountOnRamp, setSrcAmountOnRamp, selectedPaymentMethod, setActivePanel, _recipientAddress, destinationToken, destinationChainId, destinationAmount, onDestinationTokenChange, onDestinationChainChange, fiatPaymentMethodIndex, recipientSelectionPanelIndex, dstTokenSymbol, hideDstToken = false, anyspendQuote, onShowPointsDetail, }) {
14
15
  const featureFlags = useFeatureFlags();
15
16
  // Get geo-based onramp options to access fee information
@@ -75,5 +76,7 @@ export function PanelOnramp({ srcAmountOnRamp, setSrcAmountOnRamp, selectedPayme
75
76
  : "bg-as-surface-secondary hover:bg-as-surface-secondary"}`, children: ["$", value] }, value))) }), destinationToken && destinationChainId && !hideDstToken && (_jsx(OrderTokenAmountFiat, { address: _recipientAddress, context: "to", inputValue: destinationAmount || "0", onChangeInput: () => { }, chainId: destinationChainId, setChainId: onDestinationChainChange || (() => { }), token: destinationToken, setToken: onDestinationTokenChange || (() => { }) }))] }), _jsxs("div", { className: "border-as-border-secondary bg-as-surface-secondary mt-4 flex w-full flex-col gap-3 rounded-xl border p-4", children: [_jsxs("div", { className: "flex w-full items-center justify-between gap-2", children: [_jsx("span", { className: "text-as-tertiarry flex items-center text-sm", children: "Recipient" }), _recipientAddress ? (_jsxs("button", { className: "text-as-tertiarry flex h-7 items-center gap-1 text-sm transition-colors hover:text-blue-700", onClick: () => setActivePanel(recipientSelectionPanelIndex), children: [_jsx("span", { className: "text-sm", children: recipientName ? formatUsername(recipientName) : formatAddress(_recipientAddress) }), _jsx(ChevronRight, { size: 16 })] })) : (_jsxs("button", { className: "text-as-tertiarry flex h-7 items-center gap-1 text-sm transition-colors hover:text-blue-700", onClick: () => setActivePanel(5), children: [_jsx(Wallet, { className: "text-as-brand", size: 16 }), "Select recipient", _jsx(ChevronRight, { size: 16 })] }))] }), _jsx("div", { className: "divider w-full" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-as-tertiarry text-sm", children: "Expected to receive" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("span", { className: "text-as-primary font-semibold", children: [destinationAmount || "0", " ", dstTokenSymbol || destinationToken?.symbol || ""] }), _jsxs("span", { className: "text-as-tertiarry text-sm", children: ["on ", destinationChainId ? ALL_CHAINS[destinationChainId]?.name : ""] }), destinationToken && destinationChainId && destinationToken.metadata?.logoURI && (_jsx("img", { src: ALL_CHAINS[destinationChainId]?.logoUrl, alt: "Chain", className: "h-4 w-4 rounded-full" }))] })] }), _jsx("div", { className: "divider w-full" }), _jsx("div", { className: "", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-as-tertiarry text-sm", children: (() => {
76
77
  const fee = getFeeFromApi(selectedPaymentMethod || FiatPaymentMethod.NONE);
77
78
  return fee !== null ? `Total (included $${fee.toFixed(2)} fee)` : "Total";
78
- })() }), featureFlags.showPoints && anyspendQuote?.data?.pointsAmount && anyspendQuote.data.pointsAmount > 0 && (_jsxs("button", { className: "bg-as-brand hover:scale-102 active:scale-98 relative flex cursor-pointer items-center gap-1 rounded-lg px-2 py-1 transition-all", onClick: () => onShowPointsDetail?.(), children: [_jsx("div", { className: "pointer-events-none absolute inset-0 h-full w-full rounded-lg border border-white/10 border-t-white/20 bg-gradient-to-b from-white/10 to-white/0" }), _jsxs("span", { className: "text-xs text-white", children: ["+", anyspendQuote.data.pointsAmount.toLocaleString(), " pts"] })] }, `points-${anyspendQuote.data.pointsAmount}`))] }), _jsxs("span", { className: "text-as-primary font-semibold", children: ["$", getTotalAmount(selectedPaymentMethod || FiatPaymentMethod.NONE).toFixed(2)] })] }) })] })] }));
79
+ })() }), featureFlags.showPoints &&
80
+ anyspendQuote?.data?.pointsAmount &&
81
+ anyspendQuote?.data?.pointsAmount > 0 && (_jsx(PointsBadge, { pointsAmount: anyspendQuote.data.pointsAmount, pointsMultiplier: anyspendQuote.data.pointsMultiplier, onClick: () => onShowPointsDetail?.() }))] }), _jsxs("span", { className: "text-as-primary font-semibold", children: ["$", getTotalAmount(selectedPaymentMethod || FiatPaymentMethod.NONE).toFixed(2)] })] }) })] })] }));
79
82
  }