@superlogic/spree-pay 0.4.2 → 0.4.8
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/build/{CryptoComTab-GNJ4XACU.js → CryptoComTab-3SEGMLPB.js} +2 -2
- package/build/{CryptoTab-RY2NTNZJ.js → CryptoTab-DQCQF6BG.js} +4 -4
- package/build/{chunk-4ELDS4N4.js → chunk-EXKCBGNL.js} +1 -1
- package/build/{chunk-I35SE3K2.js → chunk-SKM7ZAUY.js} +3 -1
- package/build/{chunk-LXX5P2LL.js → chunk-W43VOUYP.js} +51 -2
- package/build/index.cjs +200 -110
- package/build/index.css +5 -14
- package/build/index.js +85 -49
- package/package.json +5 -3
- package/src/styles/bridge.css +53 -0
package/build/index.css
CHANGED
|
@@ -695,6 +695,9 @@
|
|
|
695
695
|
background-color: color-mix(in oklab, var(--s-warning) 10%, transparent);
|
|
696
696
|
}
|
|
697
697
|
}
|
|
698
|
+
.sl-spreepay .bg-\(--s-warning-subtle\) {
|
|
699
|
+
background-color: var(--s-warning-subtle);
|
|
700
|
+
}
|
|
698
701
|
.sl-spreepay .bg-\(--secondary\) {
|
|
699
702
|
background-color: var(--secondary);
|
|
700
703
|
}
|
|
@@ -1408,14 +1411,9 @@
|
|
|
1408
1411
|
translate: var(--tw-translate-x) var(--tw-translate-y);
|
|
1409
1412
|
}
|
|
1410
1413
|
}
|
|
1411
|
-
.sl-spreepay .data-\[state\=checked\]\:border-\(--
|
|
1414
|
+
.sl-spreepay .data-\[state\=checked\]\:border-\(--s-brand\) {
|
|
1412
1415
|
&[data-state=checked] {
|
|
1413
|
-
border-color: var(--
|
|
1414
|
-
}
|
|
1415
|
-
}
|
|
1416
|
-
.sl-spreepay .data-\[state\=checked\]\:bg-\(--primary\) {
|
|
1417
|
-
&[data-state=checked] {
|
|
1418
|
-
background-color: var(--primary);
|
|
1416
|
+
border-color: var(--s-brand);
|
|
1419
1417
|
}
|
|
1420
1418
|
}
|
|
1421
1419
|
.sl-spreepay .data-\[state\=checked\]\:bg-\(--s-brand\) {
|
|
@@ -1592,13 +1590,6 @@
|
|
|
1592
1590
|
}
|
|
1593
1591
|
}
|
|
1594
1592
|
}
|
|
1595
|
-
.sl-spreepay .dark\:data-\[state\=checked\]\:bg-\(--primary\) {
|
|
1596
|
-
&:is(.dark *) {
|
|
1597
|
-
&[data-state=checked] {
|
|
1598
|
-
background-color: var(--primary);
|
|
1599
|
-
}
|
|
1600
|
-
}
|
|
1601
|
-
}
|
|
1602
1593
|
.sl-spreepay .\[\&_a\]\:underline {
|
|
1603
1594
|
& a {
|
|
1604
1595
|
text-decoration-line: underline;
|
package/build/index.js
CHANGED
|
@@ -8,10 +8,10 @@ import {
|
|
|
8
8
|
getSplitAmount,
|
|
9
9
|
getTransactionFee,
|
|
10
10
|
useSlapiBalance
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-W43VOUYP.js";
|
|
12
12
|
import {
|
|
13
13
|
Iframe3ds
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-EXKCBGNL.js";
|
|
15
15
|
import {
|
|
16
16
|
InfoBanner,
|
|
17
17
|
LogLevel,
|
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
StaticConfigProvider,
|
|
24
24
|
cn,
|
|
25
25
|
configureLogger,
|
|
26
|
+
isNewCard,
|
|
26
27
|
logger,
|
|
27
28
|
registerApi,
|
|
28
29
|
useSpreePay,
|
|
@@ -31,10 +32,10 @@ import {
|
|
|
31
32
|
useSpreePayRegister,
|
|
32
33
|
useSpreePaymentMethod,
|
|
33
34
|
useStaticConfig
|
|
34
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-SKM7ZAUY.js";
|
|
35
36
|
|
|
36
37
|
// src/SpreePay.tsx
|
|
37
|
-
import { useCallback as
|
|
38
|
+
import { useCallback as useCallback8, useEffect as useEffect8, useMemo as useMemo9, useState as useState12 } from "react";
|
|
38
39
|
import NiceModal4 from "@ebay/nice-modal-react";
|
|
39
40
|
import { SWRConfig } from "swr";
|
|
40
41
|
|
|
@@ -42,7 +43,7 @@ import { SWRConfig } from "swr";
|
|
|
42
43
|
import { Suspense, lazy } from "react";
|
|
43
44
|
|
|
44
45
|
// src/components/CreditCardTab/CreditCardTab.tsx
|
|
45
|
-
import { useCallback as
|
|
46
|
+
import { useCallback as useCallback6, useEffect as useEffect6, useState as useState10 } from "react";
|
|
46
47
|
|
|
47
48
|
// src/hooks/payments/useCardPayment.ts
|
|
48
49
|
import NiceModal from "@ebay/nice-modal-react";
|
|
@@ -540,25 +541,27 @@ var useSplitCardPayments = (mode = "web2") => {
|
|
|
540
541
|
};
|
|
541
542
|
|
|
542
543
|
// src/hooks/useCards.ts
|
|
544
|
+
import { useMemo } from "react";
|
|
543
545
|
import useSWR from "swr";
|
|
544
546
|
var URL = "/v1/payments/cards";
|
|
545
547
|
var useCards = () => {
|
|
546
548
|
const { origin } = useSpreePayEnv();
|
|
547
549
|
const { data, isLoading, mutate } = useSWR(origin ? `${URL}?origin=${origin}` : URL);
|
|
550
|
+
const cards = useMemo(() => data?.data.filter((c) => c.active) ?? [], [data]);
|
|
548
551
|
return {
|
|
549
|
-
cards
|
|
552
|
+
cards,
|
|
550
553
|
cardsIsLoading: isLoading,
|
|
551
554
|
mutateCards: mutate
|
|
552
555
|
};
|
|
553
556
|
};
|
|
554
557
|
|
|
555
558
|
// src/components/CreditCardTab/CreditCard/CreditCard.tsx
|
|
556
|
-
import { useMemo, useState as useState3 } from "react";
|
|
559
|
+
import { useCallback as useCallback2, useMemo as useMemo3, useState as useState3 } from "react";
|
|
557
560
|
import { Elements } from "@stripe/react-stripe-js";
|
|
558
561
|
import { loadStripe } from "@stripe/stripe-js";
|
|
559
562
|
|
|
560
563
|
// src/components/CreditCardTab/CreditCard/CardsList.tsx
|
|
561
|
-
import { useState } from "react";
|
|
564
|
+
import { useMemo as useMemo2, useState } from "react";
|
|
562
565
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
563
566
|
var CardListItem = ({ card, isSelected, onSelect, onRemove }) => {
|
|
564
567
|
const [isRemoving, setIsRemoving] = useState(false);
|
|
@@ -624,19 +627,22 @@ var CardListItem = ({ card, isSelected, onSelect, onRemove }) => {
|
|
|
624
627
|
}
|
|
625
628
|
);
|
|
626
629
|
};
|
|
627
|
-
var CardsList = ({ selectedCard, setCard }) => {
|
|
630
|
+
var CardsList = ({ selectedCard, setCard, newCards, onRemoveNewCard }) => {
|
|
628
631
|
const { cards, cardsIsLoading, mutateCards } = useCards();
|
|
632
|
+
const allCards = useMemo2(() => [...cards, ...newCards], [cards, newCards]);
|
|
629
633
|
const handleRemove = async (card) => {
|
|
630
|
-
if (
|
|
634
|
+
if (isNewCard(card)) {
|
|
635
|
+
onRemoveNewCard(card);
|
|
636
|
+
} else {
|
|
631
637
|
await SlapiPaymentService.removeCard({ cardId: card.id });
|
|
638
|
+
mutateCards((data) => ({ ...data, data: (data?.data ?? []).filter((c) => c.id !== card.id) }));
|
|
632
639
|
}
|
|
633
|
-
mutateCards((data) => ({ ...data, data: (data?.data ?? []).filter((c) => c.id !== card.id) }));
|
|
634
640
|
};
|
|
635
641
|
if (cardsIsLoading) {
|
|
636
642
|
return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-col", children: /* @__PURE__ */ jsx("div", { className: "h-11 animate-pulse rounded-sm bg-(--s-primary)" }) });
|
|
637
643
|
}
|
|
638
|
-
if (
|
|
639
|
-
return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-col gap-4", children:
|
|
644
|
+
if (allCards.length === 0) return null;
|
|
645
|
+
return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-col gap-4", children: allCards.map((card) => /* @__PURE__ */ jsx(
|
|
640
646
|
CardListItem,
|
|
641
647
|
{
|
|
642
648
|
isSelected: selectedCard?.id === card.id,
|
|
@@ -649,7 +655,7 @@ var CardsList = ({ selectedCard, setCard }) => {
|
|
|
649
655
|
};
|
|
650
656
|
|
|
651
657
|
// src/components/CreditCardTab/CreditCard/CreditCardForm.tsx
|
|
652
|
-
import { useCallback, useEffect,
|
|
658
|
+
import { useCallback, useEffect, useRef, useState as useState2 } from "react";
|
|
653
659
|
import { CardCvcElement, CardExpiryElement, CardNumberElement, useElements, useStripe } from "@stripe/react-stripe-js";
|
|
654
660
|
|
|
655
661
|
// src/ui/button.tsx
|
|
@@ -703,7 +709,7 @@ function Checkbox({ className, ...props }) {
|
|
|
703
709
|
{
|
|
704
710
|
"data-slot": "checkbox",
|
|
705
711
|
className: cn(
|
|
706
|
-
"peer border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-sm border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-(--
|
|
712
|
+
"peer border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-sm border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-(--s-brand) data-[state=checked]:bg-(--s-brand) data-[state=checked]:text-(--inverse)",
|
|
707
713
|
className
|
|
708
714
|
),
|
|
709
715
|
...props,
|
|
@@ -734,7 +740,7 @@ var CreditCardForm = ({ cancel, saveCard }) => {
|
|
|
734
740
|
const formRef = useRef(null);
|
|
735
741
|
const elements = useElements();
|
|
736
742
|
const stripe = useStripe();
|
|
737
|
-
const id =
|
|
743
|
+
const [id] = useState2(() => crypto.randomUUID());
|
|
738
744
|
const computeStripeStyles = useCallback(() => {
|
|
739
745
|
const formRefCurrent = formRef.current;
|
|
740
746
|
if (typeof window === "undefined" || !formRefCurrent) return {};
|
|
@@ -859,13 +865,12 @@ var CreditCardForm = ({ cancel, saveCard }) => {
|
|
|
859
865
|
// src/components/CreditCardTab/CreditCard/CreditCard.tsx
|
|
860
866
|
import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
861
867
|
var StripeWrapper = ({ onCancel, saveNewCard, publicKey }) => {
|
|
862
|
-
const stripePromise =
|
|
868
|
+
const stripePromise = useMemo3(() => loadStripe(publicKey), [publicKey]);
|
|
863
869
|
return /* @__PURE__ */ jsx5(Elements, { stripe: stripePromise, children: /* @__PURE__ */ jsx5(CreditCardForm, { cancel: onCancel, saveCard: saveNewCard }) });
|
|
864
870
|
};
|
|
865
|
-
var CreditCard = () => {
|
|
871
|
+
var CreditCard = ({ newCards, setNewCards }) => {
|
|
866
872
|
const [showForm, setShowForm] = useState3(false);
|
|
867
873
|
const { selectedPaymentMethod, setSelectedPaymentMethod } = useSpreePaymentMethod();
|
|
868
|
-
const { mutateCards } = useCards();
|
|
869
874
|
const { spreePayConfig } = useSpreePayConfig();
|
|
870
875
|
const setCard = (card) => {
|
|
871
876
|
const isAlreadySelected = selectedPaymentMethod?.type === "CREDIT_CARD" /* CREDIT_CARD */ && selectedPaymentMethod.method?.id === card.id;
|
|
@@ -876,10 +881,16 @@ var CreditCard = () => {
|
|
|
876
881
|
});
|
|
877
882
|
};
|
|
878
883
|
const saveNewCard = (newCard) => {
|
|
879
|
-
|
|
884
|
+
setNewCards((prev) => [...prev, newCard]);
|
|
880
885
|
setCard(newCard);
|
|
881
886
|
setShowForm(false);
|
|
882
887
|
};
|
|
888
|
+
const removeNewCard = useCallback2(
|
|
889
|
+
(card) => {
|
|
890
|
+
setNewCards((prev) => prev.filter((c) => c.id !== card.id));
|
|
891
|
+
},
|
|
892
|
+
[setNewCards]
|
|
893
|
+
);
|
|
883
894
|
const handleCancel = () => {
|
|
884
895
|
setShowForm(false);
|
|
885
896
|
};
|
|
@@ -890,7 +901,9 @@ var CreditCard = () => {
|
|
|
890
901
|
CardsList,
|
|
891
902
|
{
|
|
892
903
|
selectedCard: selectedPaymentMethod?.type === "CREDIT_CARD" /* CREDIT_CARD */ ? selectedPaymentMethod.method : null,
|
|
893
|
-
setCard
|
|
904
|
+
setCard,
|
|
905
|
+
newCards,
|
|
906
|
+
onRemoveNewCard: removeNewCard
|
|
894
907
|
}
|
|
895
908
|
),
|
|
896
909
|
spreePayConfig?.creditCard.infoMessage && /* @__PURE__ */ jsx5(InfoBanner, { message: spreePayConfig.creditCard.infoMessage }),
|
|
@@ -912,7 +925,7 @@ var CreditCard = () => {
|
|
|
912
925
|
import { useState as useState9 } from "react";
|
|
913
926
|
|
|
914
927
|
// src/components/CreditCardTab/Points/SplitBlock.tsx
|
|
915
|
-
import { useCallback as
|
|
928
|
+
import { useCallback as useCallback5, useEffect as useEffect5, useRef as useRef6, useState as useState8 } from "react";
|
|
916
929
|
import { BUILD_ENV as BUILD_ENV2 } from "@mocanetwork/airkit";
|
|
917
930
|
|
|
918
931
|
// src/components/CreditCardTab/Points/PointsSelector.tsx
|
|
@@ -2014,7 +2027,7 @@ var SplitBlock = (props) => {
|
|
|
2014
2027
|
const hasForeignCurrency = !!(currencyCode && exchangeRate && foreignCurrencyAmount);
|
|
2015
2028
|
const formatPointsValue = (usd) => hasForeignCurrency ? formatCurrency(usd / exchangeRate, currencyCode) : formatCurrency(usd);
|
|
2016
2029
|
const prevPointsChainRef = useRef6(spreePayConfig?.pointsChain);
|
|
2017
|
-
const initWallet =
|
|
2030
|
+
const initWallet = useCallback5(
|
|
2018
2031
|
async (pointsChain) => {
|
|
2019
2032
|
if (!pointsChain) return;
|
|
2020
2033
|
try {
|
|
@@ -2108,13 +2121,14 @@ var CreditCardTab = ({ isLoggedIn }) => {
|
|
|
2108
2121
|
const { appProps } = useStaticConfig();
|
|
2109
2122
|
const { spreePayConfig } = useSpreePayConfig();
|
|
2110
2123
|
const { register } = useSpreePayRegister();
|
|
2111
|
-
const { mutateCards } = useCards();
|
|
2124
|
+
const { cards, mutateCards } = useCards();
|
|
2112
2125
|
const { mutateBalance } = useSlapiBalance();
|
|
2126
|
+
const [newCards, setNewCards] = useState10([]);
|
|
2113
2127
|
const isWeb3Enabled = Boolean(useWeb3Points);
|
|
2114
2128
|
const { cardPayment } = useCardPayment();
|
|
2115
2129
|
const { splitPayment } = useSplitCardPayments(isWeb3Enabled ? "web3" : "web2");
|
|
2116
2130
|
const { pointsPayment } = usePointsPayment(isWeb3Enabled ? "web3" : "web2");
|
|
2117
|
-
const handlePay =
|
|
2131
|
+
const handlePay = useCallback6(
|
|
2118
2132
|
async (data) => {
|
|
2119
2133
|
try {
|
|
2120
2134
|
let res = null;
|
|
@@ -2134,14 +2148,24 @@ var CreditCardTab = ({ isLoggedIn }) => {
|
|
|
2134
2148
|
} catch (_) {
|
|
2135
2149
|
return Promise.reject(new PaymentError("Payment failed", "FAILED" /* FAILED */));
|
|
2136
2150
|
} finally {
|
|
2137
|
-
if ("token" in (selectedPaymentMethod.method || {})) {
|
|
2138
|
-
setSelectedPaymentMethod({ ...selectedPaymentMethod, type: "CREDIT_CARD" /* CREDIT_CARD */, method: null });
|
|
2139
|
-
}
|
|
2140
|
-
mutateCards();
|
|
2141
2151
|
mutateBalance();
|
|
2152
|
+
if (selectedPaymentMethod.type === "CREDIT_CARD" /* CREDIT_CARD */ && selectedPaymentMethod.method && isNewCard(selectedPaymentMethod.method)) {
|
|
2153
|
+
const knownIds = new Set(cards.map((c) => c.id));
|
|
2154
|
+
const updated = await mutateCards();
|
|
2155
|
+
const newSavedCard = (updated?.data ?? []).find((c) => c.active && !knownIds.has(c.id));
|
|
2156
|
+
setSelectedPaymentMethod({
|
|
2157
|
+
...selectedPaymentMethod,
|
|
2158
|
+
type: "CREDIT_CARD" /* CREDIT_CARD */,
|
|
2159
|
+
method: newSavedCard ?? null
|
|
2160
|
+
});
|
|
2161
|
+
setNewCards([]);
|
|
2162
|
+
} else {
|
|
2163
|
+
mutateCards();
|
|
2164
|
+
}
|
|
2142
2165
|
}
|
|
2143
2166
|
},
|
|
2144
2167
|
[
|
|
2168
|
+
cards,
|
|
2145
2169
|
mutateCards,
|
|
2146
2170
|
selectedPaymentMethod,
|
|
2147
2171
|
pointsPayment,
|
|
@@ -2157,7 +2181,7 @@ var CreditCardTab = ({ isLoggedIn }) => {
|
|
|
2157
2181
|
register(handlePay);
|
|
2158
2182
|
}, [register, handlePay]);
|
|
2159
2183
|
return /* @__PURE__ */ jsxs9("div", { children: [
|
|
2160
|
-
/* @__PURE__ */ jsx16("div", { className: "border-b border-b-(--border-component-specific-card) px-5 py-5 md:px-7 md:py-6", children: /* @__PURE__ */ jsx16(CreditCard, {}) }),
|
|
2184
|
+
/* @__PURE__ */ jsx16("div", { className: "border-b border-b-(--border-component-specific-card) px-5 py-5 md:px-7 md:py-6", children: /* @__PURE__ */ jsx16(CreditCard, { newCards, setNewCards }) }),
|
|
2161
2185
|
!spreePayConfig?.creditCard.hidePoints && /* @__PURE__ */ jsx16("div", { className: "flex flex-col gap-4 border-b border-b-(--border-component-specific-card) px-5 pt-5 pb-5 md:px-7 md:pt-6 md:pb-7", children: /* @__PURE__ */ jsx16(Points, {}) }),
|
|
2162
2186
|
/* @__PURE__ */ jsx16(CheckoutButton, { isLoggedIn })
|
|
2163
2187
|
] });
|
|
@@ -2235,9 +2259,9 @@ var TabButtons = (props) => {
|
|
|
2235
2259
|
|
|
2236
2260
|
// src/SpreePayContent.tsx
|
|
2237
2261
|
import { jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
2238
|
-
var CryptoTab = lazy(() => import("./CryptoTab-
|
|
2262
|
+
var CryptoTab = lazy(() => import("./CryptoTab-DQCQF6BG.js").then((module) => ({ default: module.CryptoTab })));
|
|
2239
2263
|
var CryptoComTab = lazy(
|
|
2240
|
-
() => import("./CryptoComTab-
|
|
2264
|
+
() => import("./CryptoComTab-3SEGMLPB.js").then((module) => ({ default: module.CryptoComTab }))
|
|
2241
2265
|
);
|
|
2242
2266
|
var TabLoadingFallback = () => /* @__PURE__ */ jsx18("div", { className: "flex items-center justify-center px-5 py-8 md:px-7", children: /* @__PURE__ */ jsxs11("div", { className: "flex flex-col items-center gap-3", children: [
|
|
2243
2267
|
/* @__PURE__ */ jsx18("div", { className: "h-8 w-8 animate-spin rounded-full border-4 border-(--border-component-specific-card) border-t-(--brand-primary)" }),
|
|
@@ -2279,8 +2303,8 @@ var ErrorBoundary = class extends Component {
|
|
|
2279
2303
|
if (this.props.fallback) {
|
|
2280
2304
|
return this.props.fallback;
|
|
2281
2305
|
}
|
|
2282
|
-
return /* @__PURE__ */ jsxs12("div", { className: "flex w-full flex-col items-center justify-center rounded-3xl border border-(--
|
|
2283
|
-
/* @__PURE__ */ jsx19("div", { className: "mb-4 flex size-12 items-center justify-center rounded-full bg-(--s-
|
|
2306
|
+
return /* @__PURE__ */ jsx19("div", { className: cn("sl-spreepay", this.props.className), children: /* @__PURE__ */ jsxs12("div", { className: "flex w-full flex-col items-center justify-center rounded-3xl border border-(--border-component-specific-card) bg-(--surface-component-specific-card-default-card) p-8 shadow-[0_6.25px_25px_0_var(--shadow-component-specific-card)]", children: [
|
|
2307
|
+
/* @__PURE__ */ jsx19("div", { className: "mb-4 flex size-12 items-center justify-center rounded-full bg-(--s-warning-subtle)", children: /* @__PURE__ */ jsxs12(
|
|
2284
2308
|
"svg",
|
|
2285
2309
|
{
|
|
2286
2310
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -2298,16 +2322,16 @@ var ErrorBoundary = class extends Component {
|
|
|
2298
2322
|
]
|
|
2299
2323
|
}
|
|
2300
2324
|
) }),
|
|
2301
|
-
/* @__PURE__ */ jsx19("h3", { className: "mb-2 text-lg font-semibold text-(--primary)", children: "Payment Widget Error" }),
|
|
2302
|
-
/* @__PURE__ */ jsx19("p", { className: "text-center text-sm text-(--
|
|
2303
|
-
] });
|
|
2325
|
+
/* @__PURE__ */ jsx19("h3", { className: "mb-2 text-lg font-semibold text-(--brand-primary)", children: "Payment Widget Error" }),
|
|
2326
|
+
/* @__PURE__ */ jsx19("p", { className: "text-center text-sm text-(--text-tertiary)", children: "Something went wrong loading the payment widget. Please refresh the page and try again." })
|
|
2327
|
+
] }) });
|
|
2304
2328
|
}
|
|
2305
2329
|
return this.props.children;
|
|
2306
2330
|
}
|
|
2307
2331
|
};
|
|
2308
2332
|
|
|
2309
2333
|
// src/hooks/useKeycloakSSO.ts
|
|
2310
|
-
import { useCallback as
|
|
2334
|
+
import { useCallback as useCallback7, useEffect as useEffect7, useRef as useRef7, useState as useState11 } from "react";
|
|
2311
2335
|
import Keycloak from "keycloak-js";
|
|
2312
2336
|
var refreshAheadSeconds = 60;
|
|
2313
2337
|
var keycloakLogger = logger.child("keycloak");
|
|
@@ -2318,10 +2342,10 @@ function useKeycloakSSO(config) {
|
|
|
2318
2342
|
const refreshTimerRef = useRef7(null);
|
|
2319
2343
|
const scheduleRefreshRef = useRef7(() => {
|
|
2320
2344
|
});
|
|
2321
|
-
const [error, setError] =
|
|
2322
|
-
const [isChecking, setIsChecking] =
|
|
2323
|
-
const [accessToken, setAccessToken] =
|
|
2324
|
-
const scheduleRefresh =
|
|
2345
|
+
const [error, setError] = useState11(null);
|
|
2346
|
+
const [isChecking, setIsChecking] = useState11(enabled);
|
|
2347
|
+
const [accessToken, setAccessToken] = useState11(null);
|
|
2348
|
+
const scheduleRefresh = useCallback7(() => {
|
|
2325
2349
|
const kc = kcRef.current;
|
|
2326
2350
|
if (!kc || !kc.tokenParsed || !kc.tokenParsed.exp) {
|
|
2327
2351
|
return;
|
|
@@ -2381,11 +2405,22 @@ function useKeycloakSSO(config) {
|
|
|
2381
2405
|
return { isChecking, accessToken, error };
|
|
2382
2406
|
}
|
|
2383
2407
|
|
|
2408
|
+
// src/utils/token.ts
|
|
2409
|
+
import { jwtDecode } from "jwt-decode";
|
|
2410
|
+
var isTokenExpired = (token) => {
|
|
2411
|
+
try {
|
|
2412
|
+
const { exp } = jwtDecode(token);
|
|
2413
|
+
return typeof exp === "number" && exp < Math.floor(Date.now() / 1e3);
|
|
2414
|
+
} catch {
|
|
2415
|
+
return true;
|
|
2416
|
+
}
|
|
2417
|
+
};
|
|
2418
|
+
|
|
2384
2419
|
// src/SpreePay.tsx
|
|
2385
2420
|
import { jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
2386
2421
|
var SpreePayInner = () => {
|
|
2387
|
-
const [portalEl, setPortalEl] =
|
|
2388
|
-
const rootRef =
|
|
2422
|
+
const [portalEl, setPortalEl] = useState12(null);
|
|
2423
|
+
const rootRef = useCallback8((node) => {
|
|
2389
2424
|
if (!node) return;
|
|
2390
2425
|
const el = node.querySelector(":scope > .sl-spreepay__portal");
|
|
2391
2426
|
setPortalEl(el ?? null);
|
|
@@ -2396,16 +2431,17 @@ var SpreePayInner = () => {
|
|
|
2396
2431
|
logger.logVersion();
|
|
2397
2432
|
}, [environment]);
|
|
2398
2433
|
const { staticConfig, appProps } = useStaticConfig();
|
|
2434
|
+
const envTokenValid = Boolean(envAccessToken && !isTokenExpired(envAccessToken));
|
|
2399
2435
|
const { isChecking, accessToken } = useKeycloakSSO({
|
|
2400
2436
|
realm: tenantId,
|
|
2401
2437
|
url: staticConfig.keycloakUrl,
|
|
2402
2438
|
clientId: keycloakClientId ?? "oneof-next",
|
|
2403
2439
|
ssoPageURI,
|
|
2404
|
-
enabled: !
|
|
2440
|
+
enabled: !envTokenValid
|
|
2405
2441
|
});
|
|
2406
|
-
const _accessToken = envAccessToken
|
|
2407
|
-
const unauthenticatedFetcher =
|
|
2408
|
-
const slapiFetcher =
|
|
2442
|
+
const _accessToken = envTokenValid ? envAccessToken : accessToken;
|
|
2443
|
+
const unauthenticatedFetcher = useCallback8(() => Promise.resolve(null), []);
|
|
2444
|
+
const slapiFetcher = useMemo9(() => {
|
|
2409
2445
|
if (_accessToken) {
|
|
2410
2446
|
return registerApi({
|
|
2411
2447
|
accessToken: _accessToken,
|
|
@@ -2441,7 +2477,7 @@ var SpreePayInner = () => {
|
|
|
2441
2477
|
] });
|
|
2442
2478
|
};
|
|
2443
2479
|
var SpreePay = (props) => {
|
|
2444
|
-
return /* @__PURE__ */ jsx20(ErrorBoundary, { children: /* @__PURE__ */ jsx20(StaticConfigProvider, { props, children: /* @__PURE__ */ jsx20(SpreePayInner, {}) }) });
|
|
2480
|
+
return /* @__PURE__ */ jsx20(ErrorBoundary, { className: props.className, children: /* @__PURE__ */ jsx20(StaticConfigProvider, { props, children: /* @__PURE__ */ jsx20(SpreePayInner, {}) }) });
|
|
2445
2481
|
};
|
|
2446
2482
|
|
|
2447
2483
|
// src/hooks/useCapture3DS.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@superlogic/spree-pay",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.8",
|
|
4
4
|
"description": "Spree-pay React component and utilities",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"require": "./build/index.cjs",
|
|
19
19
|
"default": "./build/index.js"
|
|
20
20
|
},
|
|
21
|
-
"./styles.css": "./build/index.css"
|
|
21
|
+
"./styles.css": "./build/index.css",
|
|
22
|
+
"./bridge.css": "./src/styles/bridge.css"
|
|
22
23
|
},
|
|
23
24
|
"files": [
|
|
24
25
|
"build",
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
},
|
|
41
42
|
"dependencies": {
|
|
42
43
|
"@ebay/nice-modal-react": "^1.2.13",
|
|
43
|
-
"@mocanetwork/airkit": "
|
|
44
|
+
"@mocanetwork/airkit": "1.7.0",
|
|
44
45
|
"@radix-ui/react-checkbox": "^1.1.3",
|
|
45
46
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
46
47
|
"@radix-ui/react-label": "^2.1.8",
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
"@tanstack/react-query": "^5.97.0",
|
|
53
54
|
"class-variance-authority": "^0.7.0",
|
|
54
55
|
"clsx": "^2.1.1",
|
|
56
|
+
"jwt-decode": "^4.0.0",
|
|
55
57
|
"keycloak-js": "^26.2.3",
|
|
56
58
|
"lucide-react": "^1.8.0",
|
|
57
59
|
"swr": "^2.4.1",
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spree-pay CSS variable bridge — live-tickets context only.
|
|
3
|
+
*
|
|
4
|
+
* Exposes legacy short-name CSS variables that spree-pay TSX components
|
|
5
|
+
* still reference, mapped to the current Figma token names. This file is
|
|
6
|
+
* imported by apps/live-tickets/src/theme/globals.css so the host app's
|
|
7
|
+
* tenant *.figma.css tokens are available under the old names.
|
|
8
|
+
*
|
|
9
|
+
* NOT used in standalone mode — the standalone build gets default values
|
|
10
|
+
* from packages/spree-pay/src/styles/globals.css instead.
|
|
11
|
+
*/
|
|
12
|
+
:root {
|
|
13
|
+
/* text / icons */
|
|
14
|
+
--primary: var(--color-text-icons-primary-default);
|
|
15
|
+
--secondary: var(--color-text-icons-secondary-default);
|
|
16
|
+
--tertiary: var(--color-text-icons-tertiary-default);
|
|
17
|
+
--text-tertiary: var(--color-text-icons-tertiary-default); /* pre-existing alias bug */
|
|
18
|
+
--brand-primary: var(--color-text-icons-brand-default);
|
|
19
|
+
--accent: var(--color-text-icons-accent-default);
|
|
20
|
+
--inverse: var(--color-text-icons-inverse-default);
|
|
21
|
+
--disabled: var(--color-text-icons-primary-disabled);
|
|
22
|
+
--positive: var(--color-feedback-success);
|
|
23
|
+
--warning: var(--color-feedback-attention);
|
|
24
|
+
--negative: var(--color-feedback-error);
|
|
25
|
+
|
|
26
|
+
/* surface */
|
|
27
|
+
--s-default: var(--color-surface-layer-page);
|
|
28
|
+
--s-primary: var(--color-surface-container-subtle);
|
|
29
|
+
--s-primary-hover: var(--color-component-list-row-subtle-hover);
|
|
30
|
+
--s-secondary: var(--color-component-table-header);
|
|
31
|
+
--s-tertiary: var(--color-control-tertiary-bg-default);
|
|
32
|
+
--s-brand: var(--color-surface-container-brand);
|
|
33
|
+
--s-brand-hover: var(--color-control-primary-bg-hover);
|
|
34
|
+
--s-disabled: var(--color-component-bg-disabled);
|
|
35
|
+
--s-warning: var(--color-feedback-attention);
|
|
36
|
+
|
|
37
|
+
/* border */
|
|
38
|
+
--b-primary: var(--color-border-subtle);
|
|
39
|
+
--b-secondary: var(--color-border-default);
|
|
40
|
+
--b-tertiary: var(--color-component-divider-default);
|
|
41
|
+
--b-brand: var(--color-control-primary-border-default);
|
|
42
|
+
--b-inverse: var(--color-border-inverse);
|
|
43
|
+
|
|
44
|
+
/* overlay / component-specific */
|
|
45
|
+
--overlay: var(--color-surface-layer-backdrop);
|
|
46
|
+
--border-component-specific-card: var(--color-component-divider-subtle);
|
|
47
|
+
--surface-component-specific-card-default-card: var(--color-surface-layer-card);
|
|
48
|
+
--shadow-component-specific-card: var(--color-effect-shadow-card);
|
|
49
|
+
|
|
50
|
+
/* Crypto.com brand colors — same across all tenants */
|
|
51
|
+
--crypto-pay-bg: #00307d;
|
|
52
|
+
--crypto-pay-bg-hover: #002655;
|
|
53
|
+
}
|