@easypayment/medusa-paypal-ui 1.0.39 → 1.0.40
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.cjs +250 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +70 -3
- package/dist/index.d.ts +70 -3
- package/dist/index.mjs +246 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/PayPalPaymentSection.tsx +284 -0
- package/src/hooks/usePayPalPaymentMethods.ts +129 -0
- package/src/index.ts +10 -8
package/dist/index.cjs
CHANGED
|
@@ -777,12 +777,262 @@ function MedusaNextPayPalAdapter(props) {
|
|
|
777
777
|
)
|
|
778
778
|
] }, selectedProviderId);
|
|
779
779
|
}
|
|
780
|
+
var PAYPAL_WALLET_PROVIDER_ID = "pp_paypal_paypal";
|
|
781
|
+
var PAYPAL_CARD_PROVIDER_ID = "pp_paypal_card_paypal_card";
|
|
782
|
+
var PAYPAL_PROVIDER_IDS = [
|
|
783
|
+
PAYPAL_WALLET_PROVIDER_ID,
|
|
784
|
+
PAYPAL_CARD_PROVIDER_ID
|
|
785
|
+
];
|
|
786
|
+
function isPayPalProviderId(id) {
|
|
787
|
+
if (!id) return false;
|
|
788
|
+
return PAYPAL_PROVIDER_IDS.includes(id);
|
|
789
|
+
}
|
|
790
|
+
var SPIN_STYLE4 = `@keyframes _pp_section_spin { to { transform: rotate(360deg) } }`;
|
|
791
|
+
function SessionInitCard() {
|
|
792
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
793
|
+
"div",
|
|
794
|
+
{
|
|
795
|
+
style: {
|
|
796
|
+
display: "flex",
|
|
797
|
+
alignItems: "center",
|
|
798
|
+
gap: 12,
|
|
799
|
+
padding: "14px 16px",
|
|
800
|
+
marginTop: 8,
|
|
801
|
+
background: "#f9fafb",
|
|
802
|
+
border: "1px solid #e5e7eb",
|
|
803
|
+
borderRadius: 10
|
|
804
|
+
},
|
|
805
|
+
children: [
|
|
806
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: SPIN_STYLE4 }),
|
|
807
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
808
|
+
"div",
|
|
809
|
+
{
|
|
810
|
+
style: {
|
|
811
|
+
width: 20,
|
|
812
|
+
height: 20,
|
|
813
|
+
borderRadius: "50%",
|
|
814
|
+
border: "2.5px solid #e5e7eb",
|
|
815
|
+
borderTopColor: "#0070ba",
|
|
816
|
+
animation: "_pp_section_spin .7s linear infinite",
|
|
817
|
+
flexShrink: 0
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
),
|
|
821
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, fontWeight: 500, color: "#111827" }, children: "Setting up payment\u2026" })
|
|
822
|
+
]
|
|
823
|
+
}
|
|
824
|
+
);
|
|
825
|
+
}
|
|
826
|
+
function ConfigLoadingCard() {
|
|
827
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
828
|
+
"div",
|
|
829
|
+
{
|
|
830
|
+
style: {
|
|
831
|
+
display: "flex",
|
|
832
|
+
alignItems: "center",
|
|
833
|
+
gap: 12,
|
|
834
|
+
padding: "14px 16px",
|
|
835
|
+
background: "#f9fafb",
|
|
836
|
+
border: "1px solid #e5e7eb",
|
|
837
|
+
borderRadius: 10
|
|
838
|
+
},
|
|
839
|
+
children: [
|
|
840
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: SPIN_STYLE4 }),
|
|
841
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
842
|
+
"div",
|
|
843
|
+
{
|
|
844
|
+
style: {
|
|
845
|
+
width: 22,
|
|
846
|
+
height: 22,
|
|
847
|
+
borderRadius: "50%",
|
|
848
|
+
border: "2.5px solid #e5e7eb",
|
|
849
|
+
borderTopColor: "#0070ba",
|
|
850
|
+
animation: "_pp_section_spin .7s linear infinite",
|
|
851
|
+
flexShrink: 0
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
),
|
|
855
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
856
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, fontWeight: 500, color: "#111827" }, children: "Connecting to PayPal\u2026" }),
|
|
857
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: "#6b7280", marginTop: 2 }, children: "Setting up secure payment" })
|
|
858
|
+
] })
|
|
859
|
+
]
|
|
860
|
+
}
|
|
861
|
+
);
|
|
862
|
+
}
|
|
863
|
+
function ErrorCard({ message }) {
|
|
864
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
865
|
+
"div",
|
|
866
|
+
{
|
|
867
|
+
style: {
|
|
868
|
+
padding: "12px 16px",
|
|
869
|
+
background: "#fef2f2",
|
|
870
|
+
border: "1px solid #fecaca",
|
|
871
|
+
borderRadius: 10,
|
|
872
|
+
fontSize: 13,
|
|
873
|
+
color: "#b91c1c"
|
|
874
|
+
},
|
|
875
|
+
children: message
|
|
876
|
+
}
|
|
877
|
+
);
|
|
878
|
+
}
|
|
879
|
+
function PayPalPaymentSection({
|
|
880
|
+
cartId,
|
|
881
|
+
selectedProviderId,
|
|
882
|
+
baseUrl,
|
|
883
|
+
publishableApiKey,
|
|
884
|
+
sessionLoading = false,
|
|
885
|
+
onSuccess,
|
|
886
|
+
onError,
|
|
887
|
+
onPaid
|
|
888
|
+
}) {
|
|
889
|
+
const shouldRender = isPayPalProviderId(selectedProviderId);
|
|
890
|
+
const { config, loading, error } = usePayPalConfig({
|
|
891
|
+
baseUrl,
|
|
892
|
+
publishableApiKey,
|
|
893
|
+
cartId,
|
|
894
|
+
enabled: shouldRender
|
|
895
|
+
});
|
|
896
|
+
const handlePaid = react.useCallback(
|
|
897
|
+
(captureResult) => {
|
|
898
|
+
onPaid?.(captureResult);
|
|
899
|
+
onSuccess?.(cartId);
|
|
900
|
+
},
|
|
901
|
+
[cartId, onPaid, onSuccess]
|
|
902
|
+
);
|
|
903
|
+
if (!shouldRender) return null;
|
|
904
|
+
if (sessionLoading) return /* @__PURE__ */ jsxRuntime.jsx(SessionInitCard, {});
|
|
905
|
+
if (loading) return /* @__PURE__ */ jsxRuntime.jsx(ConfigLoadingCard, {});
|
|
906
|
+
if (error) return /* @__PURE__ */ jsxRuntime.jsx(ErrorCard, { message: error });
|
|
907
|
+
if (!config) return null;
|
|
908
|
+
if (config.paypal_enabled === false && selectedProviderId === PAYPAL_WALLET_PROVIDER_ID) {
|
|
909
|
+
return null;
|
|
910
|
+
}
|
|
911
|
+
const isCardProvider = selectedProviderId === PAYPAL_CARD_PROVIDER_ID;
|
|
912
|
+
if (isCardProvider && config.card_enabled === false) return null;
|
|
913
|
+
const disableFunding = Array.isArray(config.disable_buttons) ? config.disable_buttons.join(",") : void 0;
|
|
914
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gap: 12 }, children: [
|
|
915
|
+
/* @__PURE__ */ jsxRuntime.jsx(PayPalCurrencyNotice, { config }),
|
|
916
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
917
|
+
PayPalProvider,
|
|
918
|
+
{
|
|
919
|
+
config,
|
|
920
|
+
intent: config.intent === "authorize" ? "authorize" : "capture",
|
|
921
|
+
disableFunding,
|
|
922
|
+
children: isCardProvider ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
923
|
+
PayPalAdvancedCard,
|
|
924
|
+
{
|
|
925
|
+
baseUrl,
|
|
926
|
+
publishableApiKey,
|
|
927
|
+
cartId,
|
|
928
|
+
config,
|
|
929
|
+
onPaid: handlePaid,
|
|
930
|
+
onError
|
|
931
|
+
}
|
|
932
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
933
|
+
PayPalSmartButtons,
|
|
934
|
+
{
|
|
935
|
+
baseUrl,
|
|
936
|
+
publishableApiKey,
|
|
937
|
+
cartId,
|
|
938
|
+
config,
|
|
939
|
+
onPaid: handlePaid,
|
|
940
|
+
onError
|
|
941
|
+
}
|
|
942
|
+
)
|
|
943
|
+
}
|
|
944
|
+
)
|
|
945
|
+
] }, selectedProviderId);
|
|
946
|
+
}
|
|
947
|
+
var _cache2 = /* @__PURE__ */ new Map();
|
|
948
|
+
var CACHE_TTL2 = 5 * 60 * 1e3;
|
|
949
|
+
function cacheKey2(baseUrl, cartId) {
|
|
950
|
+
return `ppm::${baseUrl}::${cartId ?? ""}`;
|
|
951
|
+
}
|
|
952
|
+
var DEFAULT_RESULT = {
|
|
953
|
+
paypalEnabled: true,
|
|
954
|
+
paypalTitle: "PayPal",
|
|
955
|
+
cardEnabled: true,
|
|
956
|
+
cardTitle: "Credit or Debit Card",
|
|
957
|
+
loading: false
|
|
958
|
+
};
|
|
959
|
+
function usePayPalPaymentMethods({
|
|
960
|
+
baseUrl,
|
|
961
|
+
publishableApiKey,
|
|
962
|
+
cartId,
|
|
963
|
+
enabled = true
|
|
964
|
+
}) {
|
|
965
|
+
const api = react.useMemo(
|
|
966
|
+
() => createPayPalStoreApi({ baseUrl, publishableApiKey }),
|
|
967
|
+
[baseUrl, publishableApiKey]
|
|
968
|
+
);
|
|
969
|
+
const key = cacheKey2(baseUrl, cartId);
|
|
970
|
+
const hit = _cache2.get(key);
|
|
971
|
+
const seed = hit && Date.now() - hit.at < CACHE_TTL2 ? hit.result : null;
|
|
972
|
+
const [result, setResult] = react.useState(seed ?? { ...DEFAULT_RESULT, loading: enabled });
|
|
973
|
+
const fetchIdRef = react.useRef(0);
|
|
974
|
+
react.useEffect(() => {
|
|
975
|
+
if (!enabled) {
|
|
976
|
+
setResult((prev) => ({ ...prev, loading: false }));
|
|
977
|
+
return;
|
|
978
|
+
}
|
|
979
|
+
const k = cacheKey2(baseUrl, cartId);
|
|
980
|
+
const cached = _cache2.get(k);
|
|
981
|
+
if (cached && Date.now() - cached.at < CACHE_TTL2) {
|
|
982
|
+
setResult(cached.result);
|
|
983
|
+
return;
|
|
984
|
+
}
|
|
985
|
+
const id = ++fetchIdRef.current;
|
|
986
|
+
let mounted = true;
|
|
987
|
+
const controller = new AbortController();
|
|
988
|
+
setResult((prev) => ({ ...prev, loading: true }));
|
|
989
|
+
(async () => {
|
|
990
|
+
try {
|
|
991
|
+
const cfg = await api.getConfig(cartId, controller.signal);
|
|
992
|
+
if (!mounted || id !== fetchIdRef.current) return;
|
|
993
|
+
const next = {
|
|
994
|
+
paypalEnabled: cfg.paypal_enabled !== false,
|
|
995
|
+
paypalTitle: typeof cfg.paypal_title === "string" && cfg.paypal_title ? cfg.paypal_title : "PayPal",
|
|
996
|
+
cardEnabled: cfg.card_enabled !== false,
|
|
997
|
+
cardTitle: typeof cfg.card_title === "string" && cfg.card_title ? cfg.card_title : "Credit or Debit Card",
|
|
998
|
+
loading: false
|
|
999
|
+
};
|
|
1000
|
+
_cache2.set(k, { result: next, at: Date.now() });
|
|
1001
|
+
setResult(next);
|
|
1002
|
+
} catch (e) {
|
|
1003
|
+
if (e?.name === "AbortError") return;
|
|
1004
|
+
if (!mounted || id !== fetchIdRef.current) return;
|
|
1005
|
+
if (e?.message?.includes("403") || e?.message?.includes("Forbidden")) {
|
|
1006
|
+
const disabled = {
|
|
1007
|
+
...DEFAULT_RESULT,
|
|
1008
|
+
paypalEnabled: false,
|
|
1009
|
+
cardEnabled: false,
|
|
1010
|
+
loading: false
|
|
1011
|
+
};
|
|
1012
|
+
setResult(disabled);
|
|
1013
|
+
return;
|
|
1014
|
+
}
|
|
1015
|
+
setResult({ ...DEFAULT_RESULT, loading: false });
|
|
1016
|
+
}
|
|
1017
|
+
})();
|
|
1018
|
+
return () => {
|
|
1019
|
+
mounted = false;
|
|
1020
|
+
controller.abort();
|
|
1021
|
+
};
|
|
1022
|
+
}, [api, baseUrl, cartId, enabled]);
|
|
1023
|
+
return result;
|
|
1024
|
+
}
|
|
780
1025
|
|
|
781
1026
|
exports.MedusaNextPayPalAdapter = MedusaNextPayPalAdapter;
|
|
1027
|
+
exports.PAYPAL_CARD_PROVIDER_ID = PAYPAL_CARD_PROVIDER_ID;
|
|
1028
|
+
exports.PAYPAL_WALLET_PROVIDER_ID = PAYPAL_WALLET_PROVIDER_ID;
|
|
782
1029
|
exports.PayPalAdvancedCard = PayPalAdvancedCard;
|
|
783
1030
|
exports.PayPalCurrencyNotice = PayPalCurrencyNotice;
|
|
1031
|
+
exports.PayPalPaymentSection = PayPalPaymentSection;
|
|
784
1032
|
exports.PayPalProvider = PayPalProvider;
|
|
785
1033
|
exports.PayPalSmartButtons = PayPalSmartButtons;
|
|
786
1034
|
exports.createPayPalStoreApi = createPayPalStoreApi;
|
|
1035
|
+
exports.isPayPalProviderId = isPayPalProviderId;
|
|
787
1036
|
exports.usePayPalConfig = usePayPalConfig;
|
|
1037
|
+
exports.usePayPalPaymentMethods = usePayPalPaymentMethods;
|
|
788
1038
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/http.ts","../src/client/paypal.ts","../src/hooks/usePayPalConfig.ts","../src/components/PayPalProvider.tsx","../src/components/PayPalCurrencyNotice.tsx","../src/components/PayPalSmartButtons.tsx","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx"],"names":["useMemo","useState","useRef","useEffect","jsx","PayPalScriptProvider","jsxs","PayPalButtons","SPIN_STYLE","usePayPalCardFields","PayPalCardFieldsProvider","PayPalNumberField","PayPalExpiryField","PayPalCVVField","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["export type HttpOptions = {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n}\r\n\r\nfunction toHeaderRecord(headers?: RequestInit[\"headers\"]): Record<string, string> {\r\n if (!headers) {\r\n return {}\r\n }\r\n\r\n if (headers instanceof Headers) {\r\n return Object.fromEntries(headers.entries())\r\n }\r\n\r\n if (Array.isArray(headers)) {\r\n return Object.fromEntries(headers)\r\n }\r\n\r\n return { ...headers }\r\n}\r\n\r\nexport function createHttpClient(opts: HttpOptions) {\r\n const base = opts.baseUrl.replace(/\\/+$/, \"\")\r\n\r\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\r\n const url = `${base}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`\r\n const headers: Record<string, string> = {\r\n Accept: \"application/json\",\r\n ...toHeaderRecord(init?.headers),\r\n }\r\n\r\n if (opts.publishableApiKey) {\r\n headers[\"x-publishable-api-key\"] = opts.publishableApiKey\r\n }\r\n\r\n const res = await fetch(url, { ...init, headers, credentials: \"include\" })\r\n const text = await res.text().catch(() => \"\")\r\n\r\n if (!res.ok) {\r\n if (res.status === 401) {\r\n throw new Error(\r\n \"[PayPal] Unauthorized (401) — check that your publishable API key is correct and set in NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY\"\r\n )\r\n }\r\n if (res.status === 403) {\r\n throw new Error(\r\n \"[PayPal] Forbidden (403) — this request is not allowed. Check your CORS and API key settings.\"\r\n )\r\n }\r\n throw new Error(text || `Request failed (${res.status})`)\r\n }\r\n if (!text) return {} as T\r\n\r\n const contentType = res.headers.get(\"content-type\") || \"\"\r\n if (!contentType.includes(\"application/json\")) {\r\n console.warn(\"[PayPal] Unexpected non-JSON response:\", contentType, text.slice(0, 200))\r\n return {} as T\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T\r\n } catch {\r\n console.warn(\"[PayPal] Failed to parse JSON response:\", text.slice(0, 200))\r\n return {} as T\r\n }\r\n }\r\n\r\n return { request }\r\n}\r\n","import type { PayPalConfig, PayPalSettingsResponse } from \"./types\"\r\nimport { createHttpClient, type HttpOptions } from \"./http\"\r\n\r\nexport function createPayPalStoreApi(opts: HttpOptions) {\r\n const http = createHttpClient(opts)\r\n\r\n return {\r\n getConfig(cartId?: string, signal?: AbortSignal) {\r\n const q = cartId ? `?cart_id=${encodeURIComponent(cartId)}` : \"\"\r\n return http.request<PayPalConfig>(`/store/paypal/config${q}`, { signal })\r\n },\r\n\r\n getSettings() {\r\n return http.request<PayPalSettingsResponse>(`/store/paypal/settings`)\r\n },\r\n\r\n createOrder(cartId: string, isCardPayment = false) {\r\n return http.request<{ id: string }>(`/store/paypal/create-order`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId, is_card_payment: isCardPayment }),\r\n })\r\n },\r\n\r\n captureOrder(cartId: string, orderId: string) {\r\n return http.request<Record<string, unknown>>(`/store/paypal/capture-order`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId, order_id: orderId }),\r\n })\r\n },\r\n }\r\n}\r\n","import { useEffect, useMemo, useRef, useState } from \"react\"\r\nimport { createPayPalStoreApi } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\ntype Args = {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n cartId?: string\r\n enabled?: boolean\r\n}\r\n\r\n// ── Module-level cache — persists across re-mounts and method switches ────────\r\nconst _cache = new Map<string, { config: PayPalConfig; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000 // 5 minutes\r\n\r\nfunction cacheKey(baseUrl: string, cartId?: string) {\r\n return `${baseUrl}::${cartId ?? \"\"}`\r\n}\r\n\r\nexport function usePayPalConfig({\r\n baseUrl,\r\n publishableApiKey,\r\n cartId,\r\n enabled = true,\r\n}: Args) {\r\n const api = useMemo(\r\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\r\n [baseUrl, publishableApiKey]\r\n )\r\n\r\n // Seed from cache immediately — avoids blank flash on revisit\r\n const key = cacheKey(baseUrl, cartId)\r\n const hit = _cache.get(key)\r\n const seedConfig = hit && Date.now() - hit.at < CACHE_TTL ? hit.config : null\r\n\r\n const [config, setConfig] = useState<PayPalConfig | null>(seedConfig)\r\n const [loading, setLoading] = useState<boolean>(seedConfig === null && enabled)\r\n const [error, setError] = useState<string | null>(null)\r\n\r\n // Prevents stale fetch from overwriting a newer one\r\n const fetchIdRef = useRef(0)\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n // ── KEY FIX: do NOT wipe config to null ───────────────────────────\r\n // Keeping last known config means switching away and back is instant\r\n // with no blank flash and no re-fetch needed.\r\n setLoading(false)\r\n setError(null)\r\n return\r\n }\r\n\r\n // Re-check cache inside effect (may have been populated since render)\r\n const k = cacheKey(baseUrl, cartId)\r\n const cached = _cache.get(k)\r\n if (cached && Date.now() - cached.at < CACHE_TTL) {\r\n setConfig(cached.config)\r\n setLoading(false)\r\n setError(null)\r\n return\r\n }\r\n\r\n const id = ++fetchIdRef.current\r\n let mounted = true\r\n const controller = new AbortController()\r\n\r\n setLoading(true)\r\n setError(null)\r\n\r\n ;(async () => {\r\n try {\r\n const cfg = await api.getConfig(cartId, controller.signal)\r\n if (!mounted || id !== fetchIdRef.current) return\r\n _cache.set(k, { config: cfg, at: Date.now() })\r\n setConfig(cfg)\r\n } catch (e: any) {\r\n if (e?.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n setError(e?.message || \"Failed to load PayPal config\")\r\n } finally {\r\n if (mounted && id === fetchIdRef.current) setLoading(false)\r\n }\r\n })()\r\n\r\n return () => {\r\n mounted = false\r\n controller.abort()\r\n }\r\n }, [api, baseUrl, cartId, enabled])\r\n\r\n return { config, loading, error }\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo } from \"react\"\r\nimport { PayPalScriptProvider } from \"@paypal/react-paypal-js\"\r\nimport type { ReactPayPalScriptOptions } from \"@paypal/react-paypal-js\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\nexport function PayPalProvider(props: {\r\n config: PayPalConfig\r\n intent?: \"capture\" | \"authorize\"\r\n disableFunding?: string\r\n children: React.ReactNode\r\n}) {\r\n const { config, intent = \"capture\", disableFunding, children } = props\r\n\r\n const options = useMemo((): ReactPayPalScriptOptions => {\r\n return {\r\n clientId: config.client_id,\r\n \"client-id\": config.client_id,\r\n currency: config.currency,\r\n intent,\r\n components: config.client_token ? \"buttons,card-fields\" : \"buttons\",\r\n \"data-client-token\": config.client_token || undefined,\r\n \"disable-funding\": disableFunding,\r\n }\r\n }, [config, intent, disableFunding])\r\n\r\n return (\r\n <PayPalScriptProvider\r\n key={`${options.clientId}-${options[\"data-client-token\"] ?? \"no-token\"}`}\r\n options={options}\r\n >\r\n {children}\r\n </PayPalScriptProvider>\r\n )\r\n}\r\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\n if (config.currency_supported) return null\n\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {(config.currency_errors || []).map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n )\n}\n","\"use client\"\r\nimport React, { useMemo, useState } from \"react\"\r\nimport { PayPalButtons } from \"@paypal/react-paypal-js\"\r\nimport { createPayPalStoreApi } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\n// ─── Spinner keyframes ────────────────────────────────────────────────────────\r\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\nconst BUTTON_WIDTH_MAP: Record<string, string> = {\r\n small: \"300px\",\r\n medium: \"400px\",\r\n large: \"500px\",\r\n responsive: \"100%\",\r\n}\r\n\r\nexport function PayPalSmartButtons(props: {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n cartId: string\r\n config: PayPalConfig\r\n onPaid?: (result: Record<string, unknown>) => void\r\n onError?: (message: string) => void\r\n}) {\r\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\r\n const api = useMemo(\r\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\r\n [baseUrl, publishableApiKey]\r\n )\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n // ── ADDED: track when PayPal payment is in-flight ─────────────────────────\r\n const [processing, setProcessing] = useState(false)\r\n\r\n if (!config.currency_supported) return null\r\n\r\n const containerWidth = BUTTON_WIDTH_MAP[config.button_width ?? \"responsive\"] ?? \"100%\"\r\n\r\n return (\r\n // ── CHANGED: added position: relative so the overlay can sit on top ──────\r\n <div style={{ width: containerWidth, position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {/* ── ADDED: processing overlay ────────────────────────────────────── */}\r\n {processing && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n zIndex: 10,\r\n background: \"rgba(255,255,255,0.90)\",\r\n borderRadius: 8,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n minHeight: 60,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: 28,\r\n height: 28,\r\n borderRadius: \"50%\",\r\n border: \"2.5px solid #e5e7eb\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .7s linear infinite\",\r\n }}\r\n />\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 13, color: \"#374151\", fontWeight: 500 }}>\r\n Processing your payment…\r\n </div>\r\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 4 }}>\r\n Please do not close or refresh this page\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Sandbox notice ─────────────────────────────────────────────────── */}\r\n {config.environment === \"sandbox\" && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 8,\r\n padding: \"10px 14px\",\r\n background: \"#eff6ff\",\r\n border: \"1px solid #bfdbfe\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#1e40af\",\r\n lineHeight: 1.5,\r\n marginBottom: 10,\r\n }}\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#1e40af\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n style={{ flexShrink: 0, marginTop: 1 }}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 8v4M12 16h.01\" />\r\n </svg>\r\n <span>\r\n Sandbox mode — you will not be charged. Use your PayPal sandbox\r\n account to complete the payment.\r\n </span>\r\n </div>\r\n )}\r\n\r\n <PayPalButtons\r\n style={{\r\n layout: \"vertical\",\r\n color: config.button_color,\r\n shape: config.button_shape,\r\n label: config.button_label,\r\n height: config.button_height,\r\n }}\r\n createOrder={async () => {\r\n setError(null)\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setProcessing(true)\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n onPaid?.(result)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"Payment capture failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n setProcessing(false)\r\n }\r\n }}\r\n onCancel={() => {\r\n setProcessing(false)\r\n }}\r\n onError={(err: Error | { message?: string }) => {\r\n setProcessing(false)\r\n const msg = err instanceof Error ? err.message : err?.message || \"PayPal error\"\r\n setError(msg)\r\n onError?.(msg)\r\n }}\r\n />\r\n\r\n {/* ── CHANGED: styled error box instead of plain crimson text ──────── */}\r\n {error ? (\r\n <div\r\n style={{\r\n marginTop: 10,\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 8,\r\n padding: \"10px 14px\",\r\n background: \"#fef2f2\",\r\n border: \"1px solid #fecaca\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#b91c1c\",\r\n lineHeight: 1.5,\r\n }}\r\n >\r\n <span style={{ flexShrink: 0, fontSize: 15 }}>⚠️</span>\r\n <span>{error}</span>\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo, useState } from \"react\"\r\nimport {\r\n PayPalCardFieldsProvider,\r\n PayPalNumberField,\r\n PayPalExpiryField,\r\n PayPalCVVField,\r\n usePayPalCardFields,\r\n} from \"@paypal/react-paypal-js\"\r\n\r\nimport { createPayPalStoreApi } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\n// ─── Spinner keyframes ────────────────────────────────────────────────────────\r\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\n// ─── PayPal hosted-field iframe styles ───────────────────────────────────────\r\nconst cardStyle = {\r\n input: {\r\n \"font-size\": \"15px\",\r\n \"font-family\": \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\r\n \"font-weight\": \"400\",\r\n color: \"#111827\",\r\n padding: \"0 14px\",\r\n height: \"42px\",\r\n \"border-radius\": \"8px\",\r\n border: \"1px solid #d1d5db\",\r\n background: \"#ffffff\",\r\n \"box-shadow\": \"none\",\r\n transition: \"border-color 0.15s ease\",\r\n },\r\n \"::placeholder\": {\r\n color: \"#9ca3af\",\r\n },\r\n \".invalid\": {\r\n color: \"#dc2626\",\r\n border: \"1px solid #fca5a5\",\r\n background: \"#fff7f7\",\r\n \"box-shadow\": \"none\",\r\n },\r\n \".valid\": {\r\n color: \"#111827\",\r\n border: \"1px solid #d1d5db\",\r\n \"box-shadow\": \"none\",\r\n },\r\n \"input:focus\": {\r\n outline: \"none\",\r\n border: \"1px solid #2563eb\",\r\n \"box-shadow\": \"0 0 0 3px rgba(37,99,235,0.12)\",\r\n },\r\n}\r\n\r\n// ─── Label style ─────────────────────────────────────────────────────────────\r\nconst labelStyle: React.CSSProperties = {\r\n display: \"block\",\r\n fontSize: 13,\r\n fontWeight: 500,\r\n color: \"#374151\",\r\n marginBottom: 6,\r\n letterSpacing: \"0.01em\",\r\n}\r\n\r\n// ─── Submit button ────────────────────────────────────────────────────────────\r\nfunction SubmitButton({\r\n disabled,\r\n label,\r\n onSubmit,\r\n}: {\r\n disabled: boolean\r\n label: string\r\n onSubmit: () => void\r\n}) {\r\n const { cardFieldsForm } = usePayPalCardFields()\r\n const isDisabled = disabled || !cardFieldsForm\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n disabled={isDisabled}\r\n onClick={() => {\r\n onSubmit()\r\n cardFieldsForm?.submit()\r\n }}\r\n style={{\r\n width: \"100%\",\r\n height: 48,\r\n padding: \"0 20px\",\r\n borderRadius: 8,\r\n border: \"none\",\r\n background: isDisabled\r\n ? \"#e5e7eb\"\r\n : \"linear-gradient(180deg, #2563eb 0%, #1d4ed8 100%)\",\r\n color: isDisabled ? \"#9ca3af\" : \"#ffffff\",\r\n fontSize: 15,\r\n fontWeight: 600,\r\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\r\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\r\n letterSpacing: \"0.01em\",\r\n boxShadow: isDisabled\r\n ? \"none\"\r\n : \"0 1px 3px rgba(37,99,235,0.3), 0 1px 2px rgba(0,0,0,0.06)\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isDisabled) {\r\n ;(e.target as HTMLButtonElement).style.background =\r\n \"linear-gradient(180deg, #1d4ed8 0%, #1e40af 100%)\"\r\n ;(e.target as HTMLButtonElement).style.boxShadow =\r\n \"0 4px 6px rgba(37,99,235,0.35), 0 2px 4px rgba(0,0,0,0.06)\"\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isDisabled) {\r\n ;(e.target as HTMLButtonElement).style.background =\r\n \"linear-gradient(180deg, #2563eb 0%, #1d4ed8 100%)\"\r\n ;(e.target as HTMLButtonElement).style.boxShadow =\r\n \"0 1px 3px rgba(37,99,235,0.3), 0 1px 2px rgba(0,0,0,0.06)\"\r\n }\r\n }}\r\n >\r\n {label}\r\n </button>\r\n )\r\n}\r\n\r\n// ─── Main component ───────────────────────────────────────────────────────────\r\nexport function PayPalAdvancedCard(props: {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n cartId: string\r\n config: PayPalConfig\r\n onPaid?: (result: Record<string, unknown>) => void\r\n onError?: (message: string) => void\r\n}) {\r\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\r\n\r\n const api = useMemo(\r\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\r\n [baseUrl, publishableApiKey]\r\n )\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n const [submitting, setSubmitting] = useState(false)\r\n\r\n if (!config.currency_supported) return null\r\n\r\n if (!config.client_token) {\r\n return (\r\n <div\r\n style={{\r\n padding: \"12px 16px\",\r\n background: \"#fefce8\",\r\n border: \"1px solid #fde68a\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#92400e\",\r\n }}\r\n >\r\n Card fields unavailable — missing client token from backend.\r\n </div>\r\n )\r\n }\r\n\r\n const isSandbox = config.environment === \"sandbox\"\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {/* ── Processing overlay ──────────────────────────────────────────────── */}\r\n {submitting && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n zIndex: 20,\r\n background: \"rgba(255,255,255,0.92)\",\r\n borderRadius: 12,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 14,\r\n minHeight: 180,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: 36,\r\n height: 36,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #dbeafe\",\r\n borderTopColor: \"#2563eb\",\r\n animation: \"_pp_spin .75s linear infinite\",\r\n }}\r\n />\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 15, fontWeight: 600, color: \"#111827\" }}>\r\n Processing your payment…\r\n </div>\r\n <div style={{ fontSize: 13, color: \"#6b7280\", marginTop: 4 }}>\r\n Please do not close or refresh this page\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <PayPalCardFieldsProvider\r\n style={cardStyle}\r\n createOrder={async () => {\r\n setError(null)\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n onPaid?.(result)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"Card payment failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n setSubmitting(false)\r\n }\r\n }}\r\n onCancel={() => {\r\n setSubmitting(false)\r\n }}\r\n onError={(e: Error | { message?: string }) => {\r\n const msg = e instanceof Error ? e.message : e?.message || \"CardFields error\"\r\n setError(msg)\r\n onError?.(msg)\r\n setSubmitting(false)\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 16,\r\n width: \"100%\",\r\n }}\r\n >\r\n {/* ── Sandbox notice ──────────────────────────────────────────────── */}\r\n {isSandbox && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 10,\r\n padding: \"10px 14px\",\r\n background: \"#eff6ff\",\r\n border: \"1px solid #bfdbfe\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#1e40af\",\r\n lineHeight: 1.55,\r\n }}\r\n >\r\n <span style={{ fontSize: 15, flexShrink: 0, marginTop: 1 }}>🧪</span>\r\n <span>\r\n Sandbox mode — use test card{\" \"}\r\n <strong style={{ fontFamily: \"monospace\", letterSpacing: \"0.05em\" }}>\r\n 4111 1111 1111 1111\r\n </strong>{\" \"}\r\n with any future date and any CVV.\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* ── Card number ─────────────────────────────────────────────────── */}\r\n <div>\r\n <label style={labelStyle}>Card number</label>\r\n <PayPalNumberField />\r\n </div>\r\n\r\n {/* ── Expiry + CVV ────────────────────────────────────────────────── */}\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n gap: 16,\r\n }}\r\n >\r\n <div>\r\n <label style={labelStyle}>Expiration date</label>\r\n <PayPalExpiryField />\r\n </div>\r\n <div>\r\n <label style={labelStyle}>Security code</label>\r\n <PayPalCVVField />\r\n </div>\r\n </div>\r\n\r\n {/* ── Security badge ──────────────────────────────────────────────── */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 6,\r\n fontSize: 12,\r\n color: \"#6b7280\",\r\n }}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#10b981\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\r\n </svg>\r\n <span>Your payment is secured with 256-bit SSL encryption</span>\r\n </div>\r\n\r\n {/* ── Submit button ────────────────────────────────────────────────── */}\r\n <SubmitButton\r\n disabled={submitting}\r\n label={submitting ? \"Processing…\" : \"Pay by Card\"}\r\n onSubmit={() => {\r\n setError(null)\r\n setSubmitting(true)\r\n }}\r\n />\r\n\r\n {/* ── Error box ───────────────────────────────────────────────────── */}\r\n {error && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 10,\r\n padding: \"10px 14px\",\r\n background: \"#fef2f2\",\r\n border: \"1px solid #fecaca\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#b91c1c\",\r\n lineHeight: 1.5,\r\n }}\r\n >\r\n <span style={{ flexShrink: 0, marginTop: 1 }}>⚠️</span>\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n </div>\r\n </PayPalCardFieldsProvider>\r\n </div>\r\n )\r\n}","\"use client\"\r\n\r\nimport React, { useCallback } from \"react\"\r\nimport { PayPalCurrencyNotice } from \"../components/PayPalCurrencyNotice\"\r\nimport { PayPalAdvancedCard } from \"../components/PayPalAdvancedCard\"\r\nimport { PayPalProvider } from \"../components/PayPalProvider\"\r\nimport { PayPalSmartButtons } from \"../components/PayPalSmartButtons\"\r\nimport { usePayPalConfig } from \"../hooks/usePayPalConfig\"\r\n\r\nconst DEFAULT_PAYPAL_PROVIDER_ID = \"pp_paypal_paypal\"\r\nconst DEFAULT_PAYPAL_CARD_PROVIDER_ID = \"pp_paypal_card_paypal_card\"\r\n\r\n// ─── Spinner keyframes (injected once, scoped to this component) ──────────────\r\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\n// ─── Loading card — replaces the old plain \"Loading PayPal…\" div ─────────────\r\nfunction PayPalLoadingCard() {\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n padding: \"14px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 10,\r\n }}\r\n >\r\n <style>{SPIN_STYLE}</style>\r\n <div\r\n style={{\r\n width: 22,\r\n height: 22,\r\n borderRadius: \"50%\",\r\n border: \"2.5px solid #e5e7eb\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .7s linear infinite\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n <div>\r\n <div style={{ fontSize: 13, fontWeight: 500, color: \"#111827\" }}>\r\n Connecting to PayPal…\r\n </div>\r\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 2 }}>\r\n Setting up secure payment\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ─── Error card — replaces the old plain crimson div ─────────────────────────\r\nfunction PayPalErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n style={{\r\n padding: \"12px 16px\",\r\n background: \"#fef2f2\",\r\n border: \"1px solid #fecaca\",\r\n borderRadius: 10,\r\n fontSize: 13,\r\n color: \"#b91c1c\",\r\n }}\r\n >\r\n {message}\r\n </div>\r\n )\r\n}\r\n\r\nexport type MedusaNextPayPalAdapterProps = {\r\n cartId: string\r\n selectedProviderId: string | null | undefined\r\n baseUrl: string\r\n publishableApiKey?: string\r\n providerIds?: {\r\n paypal?: string\r\n paypalCard?: string\r\n }\r\n /**\r\n * Called after PayPal capture succeeds.\r\n * The storefront must call placeOrder(cartId) here — that is the only\r\n * correct way to clear the _medusa_cart_id cookie, because placeOrder\r\n * is a Next.js Server Action that calls removeCartId() server-side.\r\n * A client-side fetch cannot clear an httpOnly cookie set by the server.\r\n */\r\n onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\r\n /** @deprecated use onSuccess */\r\n onPaid?: (result: unknown) => void\r\n}\r\n\r\nexport function MedusaNextPayPalAdapter(props: MedusaNextPayPalAdapterProps) {\r\n const {\r\n cartId,\r\n selectedProviderId,\r\n baseUrl,\r\n publishableApiKey,\r\n providerIds,\r\n onSuccess,\r\n onError,\r\n onPaid,\r\n } = props\r\n\r\n const paypalProviderId = providerIds?.paypal || DEFAULT_PAYPAL_PROVIDER_ID\r\n const paypalCardProviderId = providerIds?.paypalCard || DEFAULT_PAYPAL_CARD_PROVIDER_ID\r\n\r\n const shouldRender =\r\n selectedProviderId === paypalProviderId ||\r\n selectedProviderId === paypalCardProviderId\r\n\r\n const { config, loading, error } = usePayPalConfig({\r\n baseUrl,\r\n publishableApiKey,\r\n cartId,\r\n enabled: shouldRender,\r\n })\r\n\r\n // After capture succeeds: call both the legacy onPaid and the new onSuccess.\r\n // Cart completion and cookie clearing must happen in the storefront via\r\n // placeOrder() — we intentionally do NOT call /store/carts/:id/complete here\r\n // because that endpoint does not clear the Next.js server-side cart cookie.\r\n const handlePaid = useCallback(\r\n (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n onSuccess?.(cartId)\r\n },\r\n [cartId, onPaid, onSuccess]\r\n )\r\n\r\n if (!shouldRender) return null\r\n\r\n // ── CHANGED: was <div>Loading PayPal…</div> ───────────────────────────────\r\n if (loading) return <PayPalLoadingCard />\r\n\r\n // ── CHANGED: was <div style={{ color: \"crimson\" }}>{error}</div> ──────────\r\n if (error) return <PayPalErrorCard message={error} />\r\n\r\n if (!config) return null\r\n if (config.paypal_enabled === false) return null\r\n\r\n const isCardProvider = selectedProviderId === paypalCardProviderId\r\n if (selectedProviderId === paypalCardProviderId && config.card_enabled === false) return null\r\n\r\n const disableFunding = Array.isArray(config.disable_buttons)\r\n ? config.disable_buttons.join(\",\")\r\n : undefined\r\n\r\n return (\r\n <div key={selectedProviderId} style={{ display: \"grid\", gap: 12 }}>\r\n <PayPalCurrencyNotice config={config} />\r\n <PayPalProvider\r\n config={config}\r\n intent={config.intent === \"authorize\" ? \"authorize\" : \"capture\"}\r\n disableFunding={disableFunding}\r\n >\r\n {selectedProviderId === paypalCardProviderId ? (\r\n <PayPalAdvancedCard\r\n baseUrl={baseUrl}\r\n publishableApiKey={publishableApiKey}\r\n cartId={cartId}\r\n config={config}\r\n onPaid={handlePaid}\r\n onError={onError}\r\n />\r\n ) : (\r\n <PayPalSmartButtons\r\n baseUrl={baseUrl}\r\n publishableApiKey={publishableApiKey}\r\n cartId={cartId}\r\n config={config}\r\n onPaid={handlePaid}\r\n onError={onError}\r\n />\r\n )}\r\n </PayPalProvider>\r\n </div>\r\n )\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/http.ts","../src/client/paypal.ts","../src/hooks/usePayPalConfig.ts","../src/components/PayPalProvider.tsx","../src/components/PayPalCurrencyNotice.tsx","../src/components/PayPalSmartButtons.tsx","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx","../src/components/PayPalPaymentSection.tsx","../src/hooks/usePayPalPaymentMethods.ts"],"names":["useMemo","useState","useRef","useEffect","jsx","PayPalScriptProvider","jsxs","PayPalButtons","SPIN_STYLE","usePayPalCardFields","PayPalCardFieldsProvider","PayPalNumberField","PayPalExpiryField","PayPalCVVField","useCallback","_cache","CACHE_TTL","cacheKey"],"mappings":"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","file":"index.cjs","sourcesContent":["export type HttpOptions = {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n}\r\n\r\nfunction toHeaderRecord(headers?: RequestInit[\"headers\"]): Record<string, string> {\r\n if (!headers) {\r\n return {}\r\n }\r\n\r\n if (headers instanceof Headers) {\r\n return Object.fromEntries(headers.entries())\r\n }\r\n\r\n if (Array.isArray(headers)) {\r\n return Object.fromEntries(headers)\r\n }\r\n\r\n return { ...headers }\r\n}\r\n\r\nexport function createHttpClient(opts: HttpOptions) {\r\n const base = opts.baseUrl.replace(/\\/+$/, \"\")\r\n\r\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\r\n const url = `${base}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`\r\n const headers: Record<string, string> = {\r\n Accept: \"application/json\",\r\n ...toHeaderRecord(init?.headers),\r\n }\r\n\r\n if (opts.publishableApiKey) {\r\n headers[\"x-publishable-api-key\"] = opts.publishableApiKey\r\n }\r\n\r\n const res = await fetch(url, { ...init, headers, credentials: \"include\" })\r\n const text = await res.text().catch(() => \"\")\r\n\r\n if (!res.ok) {\r\n if (res.status === 401) {\r\n throw new Error(\r\n \"[PayPal] Unauthorized (401) — check that your publishable API key is correct and set in NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY\"\r\n )\r\n }\r\n if (res.status === 403) {\r\n throw new Error(\r\n \"[PayPal] Forbidden (403) — this request is not allowed. Check your CORS and API key settings.\"\r\n )\r\n }\r\n throw new Error(text || `Request failed (${res.status})`)\r\n }\r\n if (!text) return {} as T\r\n\r\n const contentType = res.headers.get(\"content-type\") || \"\"\r\n if (!contentType.includes(\"application/json\")) {\r\n console.warn(\"[PayPal] Unexpected non-JSON response:\", contentType, text.slice(0, 200))\r\n return {} as T\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T\r\n } catch {\r\n console.warn(\"[PayPal] Failed to parse JSON response:\", text.slice(0, 200))\r\n return {} as T\r\n }\r\n }\r\n\r\n return { request }\r\n}\r\n","import type { PayPalConfig, PayPalSettingsResponse } from \"./types\"\r\nimport { createHttpClient, type HttpOptions } from \"./http\"\r\n\r\nexport function createPayPalStoreApi(opts: HttpOptions) {\r\n const http = createHttpClient(opts)\r\n\r\n return {\r\n getConfig(cartId?: string, signal?: AbortSignal) {\r\n const q = cartId ? `?cart_id=${encodeURIComponent(cartId)}` : \"\"\r\n return http.request<PayPalConfig>(`/store/paypal/config${q}`, { signal })\r\n },\r\n\r\n getSettings() {\r\n return http.request<PayPalSettingsResponse>(`/store/paypal/settings`)\r\n },\r\n\r\n createOrder(cartId: string, isCardPayment = false) {\r\n return http.request<{ id: string }>(`/store/paypal/create-order`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId, is_card_payment: isCardPayment }),\r\n })\r\n },\r\n\r\n captureOrder(cartId: string, orderId: string) {\r\n return http.request<Record<string, unknown>>(`/store/paypal/capture-order`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId, order_id: orderId }),\r\n })\r\n },\r\n }\r\n}\r\n","import { useEffect, useMemo, useRef, useState } from \"react\"\r\nimport { createPayPalStoreApi } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\ntype Args = {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n cartId?: string\r\n enabled?: boolean\r\n}\r\n\r\n// ── Module-level cache — persists across re-mounts and method switches ────────\r\nconst _cache = new Map<string, { config: PayPalConfig; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000 // 5 minutes\r\n\r\nfunction cacheKey(baseUrl: string, cartId?: string) {\r\n return `${baseUrl}::${cartId ?? \"\"}`\r\n}\r\n\r\nexport function usePayPalConfig({\r\n baseUrl,\r\n publishableApiKey,\r\n cartId,\r\n enabled = true,\r\n}: Args) {\r\n const api = useMemo(\r\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\r\n [baseUrl, publishableApiKey]\r\n )\r\n\r\n // Seed from cache immediately — avoids blank flash on revisit\r\n const key = cacheKey(baseUrl, cartId)\r\n const hit = _cache.get(key)\r\n const seedConfig = hit && Date.now() - hit.at < CACHE_TTL ? hit.config : null\r\n\r\n const [config, setConfig] = useState<PayPalConfig | null>(seedConfig)\r\n const [loading, setLoading] = useState<boolean>(seedConfig === null && enabled)\r\n const [error, setError] = useState<string | null>(null)\r\n\r\n // Prevents stale fetch from overwriting a newer one\r\n const fetchIdRef = useRef(0)\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n // ── KEY FIX: do NOT wipe config to null ───────────────────────────\r\n // Keeping last known config means switching away and back is instant\r\n // with no blank flash and no re-fetch needed.\r\n setLoading(false)\r\n setError(null)\r\n return\r\n }\r\n\r\n // Re-check cache inside effect (may have been populated since render)\r\n const k = cacheKey(baseUrl, cartId)\r\n const cached = _cache.get(k)\r\n if (cached && Date.now() - cached.at < CACHE_TTL) {\r\n setConfig(cached.config)\r\n setLoading(false)\r\n setError(null)\r\n return\r\n }\r\n\r\n const id = ++fetchIdRef.current\r\n let mounted = true\r\n const controller = new AbortController()\r\n\r\n setLoading(true)\r\n setError(null)\r\n\r\n ;(async () => {\r\n try {\r\n const cfg = await api.getConfig(cartId, controller.signal)\r\n if (!mounted || id !== fetchIdRef.current) return\r\n _cache.set(k, { config: cfg, at: Date.now() })\r\n setConfig(cfg)\r\n } catch (e: any) {\r\n if (e?.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n setError(e?.message || \"Failed to load PayPal config\")\r\n } finally {\r\n if (mounted && id === fetchIdRef.current) setLoading(false)\r\n }\r\n })()\r\n\r\n return () => {\r\n mounted = false\r\n controller.abort()\r\n }\r\n }, [api, baseUrl, cartId, enabled])\r\n\r\n return { config, loading, error }\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo } from \"react\"\r\nimport { PayPalScriptProvider } from \"@paypal/react-paypal-js\"\r\nimport type { ReactPayPalScriptOptions } from \"@paypal/react-paypal-js\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\nexport function PayPalProvider(props: {\r\n config: PayPalConfig\r\n intent?: \"capture\" | \"authorize\"\r\n disableFunding?: string\r\n children: React.ReactNode\r\n}) {\r\n const { config, intent = \"capture\", disableFunding, children } = props\r\n\r\n const options = useMemo((): ReactPayPalScriptOptions => {\r\n return {\r\n clientId: config.client_id,\r\n \"client-id\": config.client_id,\r\n currency: config.currency,\r\n intent,\r\n components: config.client_token ? \"buttons,card-fields\" : \"buttons\",\r\n \"data-client-token\": config.client_token || undefined,\r\n \"disable-funding\": disableFunding,\r\n }\r\n }, [config, intent, disableFunding])\r\n\r\n return (\r\n <PayPalScriptProvider\r\n key={`${options.clientId}-${options[\"data-client-token\"] ?? \"no-token\"}`}\r\n options={options}\r\n >\r\n {children}\r\n </PayPalScriptProvider>\r\n )\r\n}\r\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\n if (config.currency_supported) return null\n\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {(config.currency_errors || []).map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n )\n}\n","\"use client\"\r\nimport React, { useMemo, useState } from \"react\"\r\nimport { PayPalButtons } from \"@paypal/react-paypal-js\"\r\nimport { createPayPalStoreApi } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\n// ─── Spinner keyframes ────────────────────────────────────────────────────────\r\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\nconst BUTTON_WIDTH_MAP: Record<string, string> = {\r\n small: \"300px\",\r\n medium: \"400px\",\r\n large: \"500px\",\r\n responsive: \"100%\",\r\n}\r\n\r\nexport function PayPalSmartButtons(props: {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n cartId: string\r\n config: PayPalConfig\r\n onPaid?: (result: Record<string, unknown>) => void\r\n onError?: (message: string) => void\r\n}) {\r\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\r\n const api = useMemo(\r\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\r\n [baseUrl, publishableApiKey]\r\n )\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n // ── ADDED: track when PayPal payment is in-flight ─────────────────────────\r\n const [processing, setProcessing] = useState(false)\r\n\r\n if (!config.currency_supported) return null\r\n\r\n const containerWidth = BUTTON_WIDTH_MAP[config.button_width ?? \"responsive\"] ?? \"100%\"\r\n\r\n return (\r\n // ── CHANGED: added position: relative so the overlay can sit on top ──────\r\n <div style={{ width: containerWidth, position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {/* ── ADDED: processing overlay ────────────────────────────────────── */}\r\n {processing && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n zIndex: 10,\r\n background: \"rgba(255,255,255,0.90)\",\r\n borderRadius: 8,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n minHeight: 60,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: 28,\r\n height: 28,\r\n borderRadius: \"50%\",\r\n border: \"2.5px solid #e5e7eb\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .7s linear infinite\",\r\n }}\r\n />\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 13, color: \"#374151\", fontWeight: 500 }}>\r\n Processing your payment…\r\n </div>\r\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 4 }}>\r\n Please do not close or refresh this page\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Sandbox notice ─────────────────────────────────────────────────── */}\r\n {config.environment === \"sandbox\" && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 8,\r\n padding: \"10px 14px\",\r\n background: \"#eff6ff\",\r\n border: \"1px solid #bfdbfe\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#1e40af\",\r\n lineHeight: 1.5,\r\n marginBottom: 10,\r\n }}\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#1e40af\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n style={{ flexShrink: 0, marginTop: 1 }}\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <path d=\"M12 8v4M12 16h.01\" />\r\n </svg>\r\n <span>\r\n Sandbox mode — you will not be charged. Use your PayPal sandbox\r\n account to complete the payment.\r\n </span>\r\n </div>\r\n )}\r\n\r\n <PayPalButtons\r\n style={{\r\n layout: \"vertical\",\r\n color: config.button_color,\r\n shape: config.button_shape,\r\n label: config.button_label,\r\n height: config.button_height,\r\n }}\r\n createOrder={async () => {\r\n setError(null)\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setProcessing(true)\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n onPaid?.(result)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"Payment capture failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n setProcessing(false)\r\n }\r\n }}\r\n onCancel={() => {\r\n setProcessing(false)\r\n }}\r\n onError={(err: Error | { message?: string }) => {\r\n setProcessing(false)\r\n const msg = err instanceof Error ? err.message : err?.message || \"PayPal error\"\r\n setError(msg)\r\n onError?.(msg)\r\n }}\r\n />\r\n\r\n {/* ── CHANGED: styled error box instead of plain crimson text ──────── */}\r\n {error ? (\r\n <div\r\n style={{\r\n marginTop: 10,\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 8,\r\n padding: \"10px 14px\",\r\n background: \"#fef2f2\",\r\n border: \"1px solid #fecaca\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#b91c1c\",\r\n lineHeight: 1.5,\r\n }}\r\n >\r\n <span style={{ flexShrink: 0, fontSize: 15 }}>⚠️</span>\r\n <span>{error}</span>\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo, useState } from \"react\"\r\nimport {\r\n PayPalCardFieldsProvider,\r\n PayPalNumberField,\r\n PayPalExpiryField,\r\n PayPalCVVField,\r\n usePayPalCardFields,\r\n} from \"@paypal/react-paypal-js\"\r\n\r\nimport { createPayPalStoreApi } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\n// ─── Spinner keyframes ────────────────────────────────────────────────────────\r\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\n// ─── PayPal hosted-field iframe styles ───────────────────────────────────────\r\nconst cardStyle = {\r\n input: {\r\n \"font-size\": \"15px\",\r\n \"font-family\": \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\r\n \"font-weight\": \"400\",\r\n color: \"#111827\",\r\n padding: \"0 14px\",\r\n height: \"42px\",\r\n \"border-radius\": \"8px\",\r\n border: \"1px solid #d1d5db\",\r\n background: \"#ffffff\",\r\n \"box-shadow\": \"none\",\r\n transition: \"border-color 0.15s ease\",\r\n },\r\n \"::placeholder\": {\r\n color: \"#9ca3af\",\r\n },\r\n \".invalid\": {\r\n color: \"#dc2626\",\r\n border: \"1px solid #fca5a5\",\r\n background: \"#fff7f7\",\r\n \"box-shadow\": \"none\",\r\n },\r\n \".valid\": {\r\n color: \"#111827\",\r\n border: \"1px solid #d1d5db\",\r\n \"box-shadow\": \"none\",\r\n },\r\n \"input:focus\": {\r\n outline: \"none\",\r\n border: \"1px solid #2563eb\",\r\n \"box-shadow\": \"0 0 0 3px rgba(37,99,235,0.12)\",\r\n },\r\n}\r\n\r\n// ─── Label style ─────────────────────────────────────────────────────────────\r\nconst labelStyle: React.CSSProperties = {\r\n display: \"block\",\r\n fontSize: 13,\r\n fontWeight: 500,\r\n color: \"#374151\",\r\n marginBottom: 6,\r\n letterSpacing: \"0.01em\",\r\n}\r\n\r\n// ─── Submit button ────────────────────────────────────────────────────────────\r\nfunction SubmitButton({\r\n disabled,\r\n label,\r\n onSubmit,\r\n}: {\r\n disabled: boolean\r\n label: string\r\n onSubmit: () => void\r\n}) {\r\n const { cardFieldsForm } = usePayPalCardFields()\r\n const isDisabled = disabled || !cardFieldsForm\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n disabled={isDisabled}\r\n onClick={() => {\r\n onSubmit()\r\n cardFieldsForm?.submit()\r\n }}\r\n style={{\r\n width: \"100%\",\r\n height: 48,\r\n padding: \"0 20px\",\r\n borderRadius: 8,\r\n border: \"none\",\r\n background: isDisabled\r\n ? \"#e5e7eb\"\r\n : \"linear-gradient(180deg, #2563eb 0%, #1d4ed8 100%)\",\r\n color: isDisabled ? \"#9ca3af\" : \"#ffffff\",\r\n fontSize: 15,\r\n fontWeight: 600,\r\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\r\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\r\n letterSpacing: \"0.01em\",\r\n boxShadow: isDisabled\r\n ? \"none\"\r\n : \"0 1px 3px rgba(37,99,235,0.3), 0 1px 2px rgba(0,0,0,0.06)\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n if (!isDisabled) {\r\n ;(e.target as HTMLButtonElement).style.background =\r\n \"linear-gradient(180deg, #1d4ed8 0%, #1e40af 100%)\"\r\n ;(e.target as HTMLButtonElement).style.boxShadow =\r\n \"0 4px 6px rgba(37,99,235,0.35), 0 2px 4px rgba(0,0,0,0.06)\"\r\n }\r\n }}\r\n onMouseLeave={(e) => {\r\n if (!isDisabled) {\r\n ;(e.target as HTMLButtonElement).style.background =\r\n \"linear-gradient(180deg, #2563eb 0%, #1d4ed8 100%)\"\r\n ;(e.target as HTMLButtonElement).style.boxShadow =\r\n \"0 1px 3px rgba(37,99,235,0.3), 0 1px 2px rgba(0,0,0,0.06)\"\r\n }\r\n }}\r\n >\r\n {label}\r\n </button>\r\n )\r\n}\r\n\r\n// ─── Main component ───────────────────────────────────────────────────────────\r\nexport function PayPalAdvancedCard(props: {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n cartId: string\r\n config: PayPalConfig\r\n onPaid?: (result: Record<string, unknown>) => void\r\n onError?: (message: string) => void\r\n}) {\r\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\r\n\r\n const api = useMemo(\r\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\r\n [baseUrl, publishableApiKey]\r\n )\r\n\r\n const [error, setError] = useState<string | null>(null)\r\n const [submitting, setSubmitting] = useState(false)\r\n\r\n if (!config.currency_supported) return null\r\n\r\n if (!config.client_token) {\r\n return (\r\n <div\r\n style={{\r\n padding: \"12px 16px\",\r\n background: \"#fefce8\",\r\n border: \"1px solid #fde68a\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#92400e\",\r\n }}\r\n >\r\n Card fields unavailable — missing client token from backend.\r\n </div>\r\n )\r\n }\r\n\r\n const isSandbox = config.environment === \"sandbox\"\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {/* ── Processing overlay ──────────────────────────────────────────────── */}\r\n {submitting && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n zIndex: 20,\r\n background: \"rgba(255,255,255,0.92)\",\r\n borderRadius: 12,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 14,\r\n minHeight: 180,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: 36,\r\n height: 36,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #dbeafe\",\r\n borderTopColor: \"#2563eb\",\r\n animation: \"_pp_spin .75s linear infinite\",\r\n }}\r\n />\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 15, fontWeight: 600, color: \"#111827\" }}>\r\n Processing your payment…\r\n </div>\r\n <div style={{ fontSize: 13, color: \"#6b7280\", marginTop: 4 }}>\r\n Please do not close or refresh this page\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <PayPalCardFieldsProvider\r\n style={cardStyle}\r\n createOrder={async () => {\r\n setError(null)\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n onPaid?.(result)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"Card payment failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n setSubmitting(false)\r\n }\r\n }}\r\n onCancel={() => {\r\n setSubmitting(false)\r\n }}\r\n onError={(e: Error | { message?: string }) => {\r\n const msg = e instanceof Error ? e.message : e?.message || \"CardFields error\"\r\n setError(msg)\r\n onError?.(msg)\r\n setSubmitting(false)\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 16,\r\n width: \"100%\",\r\n }}\r\n >\r\n {/* ── Sandbox notice ──────────────────────────────────────────────── */}\r\n {isSandbox && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 10,\r\n padding: \"10px 14px\",\r\n background: \"#eff6ff\",\r\n border: \"1px solid #bfdbfe\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#1e40af\",\r\n lineHeight: 1.55,\r\n }}\r\n >\r\n <span style={{ fontSize: 15, flexShrink: 0, marginTop: 1 }}>🧪</span>\r\n <span>\r\n Sandbox mode — use test card{\" \"}\r\n <strong style={{ fontFamily: \"monospace\", letterSpacing: \"0.05em\" }}>\r\n 4111 1111 1111 1111\r\n </strong>{\" \"}\r\n with any future date and any CVV.\r\n </span>\r\n </div>\r\n )}\r\n\r\n {/* ── Card number ─────────────────────────────────────────────────── */}\r\n <div>\r\n <label style={labelStyle}>Card number</label>\r\n <PayPalNumberField />\r\n </div>\r\n\r\n {/* ── Expiry + CVV ────────────────────────────────────────────────── */}\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n gap: 16,\r\n }}\r\n >\r\n <div>\r\n <label style={labelStyle}>Expiration date</label>\r\n <PayPalExpiryField />\r\n </div>\r\n <div>\r\n <label style={labelStyle}>Security code</label>\r\n <PayPalCVVField />\r\n </div>\r\n </div>\r\n\r\n {/* ── Security badge ──────────────────────────────────────────────── */}\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 6,\r\n fontSize: 12,\r\n color: \"#6b7280\",\r\n }}\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#10b981\"\r\n strokeWidth=\"2.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\r\n </svg>\r\n <span>Your payment is secured with 256-bit SSL encryption</span>\r\n </div>\r\n\r\n {/* ── Submit button ────────────────────────────────────────────────── */}\r\n <SubmitButton\r\n disabled={submitting}\r\n label={submitting ? \"Processing…\" : \"Pay by Card\"}\r\n onSubmit={() => {\r\n setError(null)\r\n setSubmitting(true)\r\n }}\r\n />\r\n\r\n {/* ── Error box ───────────────────────────────────────────────────── */}\r\n {error && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 10,\r\n padding: \"10px 14px\",\r\n background: \"#fef2f2\",\r\n border: \"1px solid #fecaca\",\r\n borderRadius: 8,\r\n fontSize: 13,\r\n color: \"#b91c1c\",\r\n lineHeight: 1.5,\r\n }}\r\n >\r\n <span style={{ flexShrink: 0, marginTop: 1 }}>⚠️</span>\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n </div>\r\n </PayPalCardFieldsProvider>\r\n </div>\r\n )\r\n}","\"use client\"\r\n\r\nimport React, { useCallback } from \"react\"\r\nimport { PayPalCurrencyNotice } from \"../components/PayPalCurrencyNotice\"\r\nimport { PayPalAdvancedCard } from \"../components/PayPalAdvancedCard\"\r\nimport { PayPalProvider } from \"../components/PayPalProvider\"\r\nimport { PayPalSmartButtons } from \"../components/PayPalSmartButtons\"\r\nimport { usePayPalConfig } from \"../hooks/usePayPalConfig\"\r\n\r\nconst DEFAULT_PAYPAL_PROVIDER_ID = \"pp_paypal_paypal\"\r\nconst DEFAULT_PAYPAL_CARD_PROVIDER_ID = \"pp_paypal_card_paypal_card\"\r\n\r\n// ─── Spinner keyframes (injected once, scoped to this component) ──────────────\r\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\n// ─── Loading card — replaces the old plain \"Loading PayPal…\" div ─────────────\r\nfunction PayPalLoadingCard() {\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n padding: \"14px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 10,\r\n }}\r\n >\r\n <style>{SPIN_STYLE}</style>\r\n <div\r\n style={{\r\n width: 22,\r\n height: 22,\r\n borderRadius: \"50%\",\r\n border: \"2.5px solid #e5e7eb\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .7s linear infinite\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n <div>\r\n <div style={{ fontSize: 13, fontWeight: 500, color: \"#111827\" }}>\r\n Connecting to PayPal…\r\n </div>\r\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 2 }}>\r\n Setting up secure payment\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ─── Error card — replaces the old plain crimson div ─────────────────────────\r\nfunction PayPalErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n style={{\r\n padding: \"12px 16px\",\r\n background: \"#fef2f2\",\r\n border: \"1px solid #fecaca\",\r\n borderRadius: 10,\r\n fontSize: 13,\r\n color: \"#b91c1c\",\r\n }}\r\n >\r\n {message}\r\n </div>\r\n )\r\n}\r\n\r\nexport type MedusaNextPayPalAdapterProps = {\r\n cartId: string\r\n selectedProviderId: string | null | undefined\r\n baseUrl: string\r\n publishableApiKey?: string\r\n providerIds?: {\r\n paypal?: string\r\n paypalCard?: string\r\n }\r\n /**\r\n * Called after PayPal capture succeeds.\r\n * The storefront must call placeOrder(cartId) here — that is the only\r\n * correct way to clear the _medusa_cart_id cookie, because placeOrder\r\n * is a Next.js Server Action that calls removeCartId() server-side.\r\n * A client-side fetch cannot clear an httpOnly cookie set by the server.\r\n */\r\n onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\r\n /** @deprecated use onSuccess */\r\n onPaid?: (result: unknown) => void\r\n}\r\n\r\nexport function MedusaNextPayPalAdapter(props: MedusaNextPayPalAdapterProps) {\r\n const {\r\n cartId,\r\n selectedProviderId,\r\n baseUrl,\r\n publishableApiKey,\r\n providerIds,\r\n onSuccess,\r\n onError,\r\n onPaid,\r\n } = props\r\n\r\n const paypalProviderId = providerIds?.paypal || DEFAULT_PAYPAL_PROVIDER_ID\r\n const paypalCardProviderId = providerIds?.paypalCard || DEFAULT_PAYPAL_CARD_PROVIDER_ID\r\n\r\n const shouldRender =\r\n selectedProviderId === paypalProviderId ||\r\n selectedProviderId === paypalCardProviderId\r\n\r\n const { config, loading, error } = usePayPalConfig({\r\n baseUrl,\r\n publishableApiKey,\r\n cartId,\r\n enabled: shouldRender,\r\n })\r\n\r\n // After capture succeeds: call both the legacy onPaid and the new onSuccess.\r\n // Cart completion and cookie clearing must happen in the storefront via\r\n // placeOrder() — we intentionally do NOT call /store/carts/:id/complete here\r\n // because that endpoint does not clear the Next.js server-side cart cookie.\r\n const handlePaid = useCallback(\r\n (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n onSuccess?.(cartId)\r\n },\r\n [cartId, onPaid, onSuccess]\r\n )\r\n\r\n if (!shouldRender) return null\r\n\r\n // ── CHANGED: was <div>Loading PayPal…</div> ───────────────────────────────\r\n if (loading) return <PayPalLoadingCard />\r\n\r\n // ── CHANGED: was <div style={{ color: \"crimson\" }}>{error}</div> ──────────\r\n if (error) return <PayPalErrorCard message={error} />\r\n\r\n if (!config) return null\r\n if (config.paypal_enabled === false) return null\r\n\r\n const isCardProvider = selectedProviderId === paypalCardProviderId\r\n if (selectedProviderId === paypalCardProviderId && config.card_enabled === false) return null\r\n\r\n const disableFunding = Array.isArray(config.disable_buttons)\r\n ? config.disable_buttons.join(\",\")\r\n : undefined\r\n\r\n return (\r\n <div key={selectedProviderId} style={{ display: \"grid\", gap: 12 }}>\r\n <PayPalCurrencyNotice config={config} />\r\n <PayPalProvider\r\n config={config}\r\n intent={config.intent === \"authorize\" ? \"authorize\" : \"capture\"}\r\n disableFunding={disableFunding}\r\n >\r\n {selectedProviderId === paypalCardProviderId ? (\r\n <PayPalAdvancedCard\r\n baseUrl={baseUrl}\r\n publishableApiKey={publishableApiKey}\r\n cartId={cartId}\r\n config={config}\r\n onPaid={handlePaid}\r\n onError={onError}\r\n />\r\n ) : (\r\n <PayPalSmartButtons\r\n baseUrl={baseUrl}\r\n publishableApiKey={publishableApiKey}\r\n cartId={cartId}\r\n config={config}\r\n onPaid={handlePaid}\r\n onError={onError}\r\n />\r\n )}\r\n </PayPalProvider>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * PayPalPaymentSection\r\n *\r\n * A single self-contained drop-in component that handles:\r\n * - Fetching /store/paypal/config (with caching)\r\n * - Showing a spinner while the PayPal session initialises\r\n * - Rendering <PayPalSmartButtons> or <PayPalAdvancedCard>\r\n * - Exposing `isPayPalProvider` so the storefront can disable its own submit\r\n *\r\n * Storefront integration is ~5 lines total — no other PayPal logic needed.\r\n *\r\n * Usage in your payment step:\r\n *\r\n * import { PayPalPaymentSection, isPayPalProviderId } from \"@easypayment/medusa-paypal-ui\"\r\n *\r\n * // 1. Disable the \"Continue to review\" button when PayPal is selected\r\n * disabled={isPayPalProviderId(selectedPaymentMethod)}\r\n *\r\n * // 2. Render the section after your RadioGroup\r\n * <PayPalPaymentSection\r\n * cartId={cart.id}\r\n * selectedProviderId={selectedPaymentMethod}\r\n * baseUrl={process.env.NEXT_PUBLIC_MEDUSA_BACKEND_URL!}\r\n * publishableApiKey={process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY}\r\n * onSuccess={async () => { await placeOrder(cart.id) }}\r\n * onError={(msg) => setError(msg)}\r\n * />\r\n *\r\n * // 3. When building the payment method list, filter + relabel from config:\r\n * // (optional) use usePayPalConfig() if you need paypal_title / card_title\r\n */\r\n\r\nimport React, { useCallback } from \"react\"\r\nimport { PayPalCurrencyNotice } from \"./PayPalCurrencyNotice\"\r\nimport { PayPalAdvancedCard } from \"./PayPalAdvancedCard\"\r\nimport { PayPalProvider } from \"./PayPalProvider\"\r\nimport { PayPalSmartButtons } from \"./PayPalSmartButtons\"\r\nimport { usePayPalConfig } from \"../hooks/usePayPalConfig\"\r\n\r\n// ─── Constants ────────────────────────────────────────────────────────────────\r\n\r\nexport const PAYPAL_WALLET_PROVIDER_ID = \"pp_paypal_paypal\" as const\r\nexport const PAYPAL_CARD_PROVIDER_ID = \"pp_paypal_card_paypal_card\" as const\r\n\r\nconst PAYPAL_PROVIDER_IDS = [\r\n PAYPAL_WALLET_PROVIDER_ID,\r\n PAYPAL_CARD_PROVIDER_ID,\r\n] as const\r\n\r\n/**\r\n * Returns true when the given provider ID is a PayPal provider.\r\n * Use this to disable the storefront's \"Continue to review\" button.\r\n *\r\n * @example\r\n * disabled={isPayPalProviderId(selectedPaymentMethod)}\r\n */\r\nexport function isPayPalProviderId(id?: string | null): boolean {\r\n if (!id) return false\r\n return PAYPAL_PROVIDER_IDS.includes(id as (typeof PAYPAL_PROVIDER_IDS)[number])\r\n}\r\n\r\n// ─── Spinner keyframes (injected once) ───────────────────────────────────────\r\n\r\nconst SPIN_STYLE = `@keyframes _pp_section_spin { to { transform: rotate(360deg) } }`\r\n\r\n// ─── Session-init loading card ────────────────────────────────────────────────\r\n\r\nfunction SessionInitCard() {\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n padding: \"14px 16px\",\r\n marginTop: 8,\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 10,\r\n }}\r\n >\r\n <style>{SPIN_STYLE}</style>\r\n <div\r\n style={{\r\n width: 20,\r\n height: 20,\r\n borderRadius: \"50%\",\r\n border: \"2.5px solid #e5e7eb\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_section_spin .7s linear infinite\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n <div style={{ fontSize: 13, fontWeight: 500, color: \"#111827\" }}>\r\n Setting up payment…\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ─── Config loading card ──────────────────────────────────────────────────────\r\n\r\nfunction ConfigLoadingCard() {\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 12,\r\n padding: \"14px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 10,\r\n }}\r\n >\r\n <style>{SPIN_STYLE}</style>\r\n <div\r\n style={{\r\n width: 22,\r\n height: 22,\r\n borderRadius: \"50%\",\r\n border: \"2.5px solid #e5e7eb\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_section_spin .7s linear infinite\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n <div>\r\n <div style={{ fontSize: 13, fontWeight: 500, color: \"#111827\" }}>\r\n Connecting to PayPal…\r\n </div>\r\n <div style={{ fontSize: 12, color: \"#6b7280\", marginTop: 2 }}>\r\n Setting up secure payment\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ─── Error card ───────────────────────────────────────────────────────────────\r\n\r\nfunction ErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n style={{\r\n padding: \"12px 16px\",\r\n background: \"#fef2f2\",\r\n border: \"1px solid #fecaca\",\r\n borderRadius: 10,\r\n fontSize: 13,\r\n color: \"#b91c1c\",\r\n }}\r\n >\r\n {message}\r\n </div>\r\n )\r\n}\r\n\r\n// ─── Props ────────────────────────────────────────────────────────────────────\r\n\r\nexport type PayPalPaymentSectionProps = {\r\n cartId: string\r\n selectedProviderId: string | null | undefined\r\n\r\n baseUrl: string\r\n publishableApiKey?: string\r\n\r\n /**\r\n * Whether a PayPal session is currently being initiated by the storefront\r\n * (i.e. the `initiatePaymentSession()` call is in-flight).\r\n * When true, the component shows a \"Setting up payment…\" spinner instead\r\n * of the PayPal buttons.\r\n *\r\n * @example\r\n * const [paypalLoading, setPaypalLoading] = useState(false)\r\n *\r\n * const setPaymentMethod = async (method: string) => {\r\n * if (isPayPalProviderId(method)) setPaypalLoading(true)\r\n * try { await initiatePaymentSession(cart, { provider_id: method }) }\r\n * finally { setPaypalLoading(false) }\r\n * }\r\n *\r\n * <PayPalPaymentSection sessionLoading={paypalLoading} ... />\r\n */\r\n sessionLoading?: boolean\r\n\r\n /**\r\n * Called after PayPal capture succeeds.\r\n * You must call placeOrder(cartId) here so the Next.js server action\r\n * can clear the httpOnly cart cookie.\r\n */\r\n onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\r\n\r\n /** @deprecated use onSuccess */\r\n onPaid?: (result: unknown) => void\r\n}\r\n\r\n// ─── Main component ───────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Drop-in PayPal payment section for Medusa storefronts.\r\n *\r\n * Renders nothing when a non-PayPal provider is selected.\r\n * Shows a spinner while config is loading or the session is being created.\r\n * Automatically picks Smart Buttons vs Advanced Card based on selectedProviderId.\r\n */\r\nexport function PayPalPaymentSection({\r\n cartId,\r\n selectedProviderId,\r\n baseUrl,\r\n publishableApiKey,\r\n sessionLoading = false,\r\n onSuccess,\r\n onError,\r\n onPaid,\r\n}: PayPalPaymentSectionProps) {\r\n const shouldRender = isPayPalProviderId(selectedProviderId)\r\n\r\n const { config, loading, error } = usePayPalConfig({\r\n baseUrl,\r\n publishableApiKey,\r\n cartId,\r\n enabled: shouldRender,\r\n })\r\n\r\n const handlePaid = useCallback(\r\n (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n onSuccess?.(cartId)\r\n },\r\n [cartId, onPaid, onSuccess]\r\n )\r\n\r\n if (!shouldRender) return null\r\n if (sessionLoading) return <SessionInitCard />\r\n if (loading) return <ConfigLoadingCard />\r\n if (error) return <ErrorCard message={error} />\r\n if (!config) return null\r\n\r\n if (config.paypal_enabled === false && selectedProviderId === PAYPAL_WALLET_PROVIDER_ID) {\r\n return null\r\n }\r\n\r\n const isCardProvider = selectedProviderId === PAYPAL_CARD_PROVIDER_ID\r\n if (isCardProvider && config.card_enabled === false) return null\r\n\r\n const disableFunding = Array.isArray(config.disable_buttons)\r\n ? config.disable_buttons.join(\",\")\r\n : undefined\r\n\r\n return (\r\n <div key={selectedProviderId} style={{ display: \"grid\", gap: 12 }}>\r\n <PayPalCurrencyNotice config={config} />\r\n <PayPalProvider\r\n config={config}\r\n intent={config.intent === \"authorize\" ? \"authorize\" : \"capture\"}\r\n disableFunding={disableFunding}\r\n >\r\n {isCardProvider ? (\r\n <PayPalAdvancedCard\r\n baseUrl={baseUrl}\r\n publishableApiKey={publishableApiKey}\r\n cartId={cartId}\r\n config={config}\r\n onPaid={handlePaid}\r\n onError={onError}\r\n />\r\n ) : (\r\n <PayPalSmartButtons\r\n baseUrl={baseUrl}\r\n publishableApiKey={publishableApiKey}\r\n cartId={cartId}\r\n config={config}\r\n onPaid={handlePaid}\r\n onError={onError}\r\n />\r\n )}\r\n </PayPalProvider>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\n\r\n/**\r\n * usePayPalPaymentMethods\r\n *\r\n * Thin hook that fetches /store/paypal/config and returns the information\r\n * storefronts need to filter and label PayPal payment methods in their\r\n * RadioGroup — without having to handle the fetch, caching, or error\r\n * handling themselves.\r\n */\r\n\r\nimport { useEffect, useMemo, useRef, useState } from \"react\"\r\nimport { createPayPalStoreApi } from \"../client/paypal\"\r\n\r\ntype Args = {\r\n baseUrl: string\r\n publishableApiKey?: string\r\n cartId?: string\r\n enabled?: boolean\r\n}\r\n\r\ntype Result = {\r\n paypalEnabled: boolean\r\n paypalTitle: string\r\n cardEnabled: boolean\r\n cardTitle: string\r\n loading: boolean\r\n}\r\n\r\nconst _cache = new Map<string, { result: Result; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheKey(baseUrl: string, cartId?: string) {\r\n return `ppm::${baseUrl}::${cartId ?? \"\"}`\r\n}\r\n\r\nconst DEFAULT_RESULT: Result = {\r\n paypalEnabled: true,\r\n paypalTitle: \"PayPal\",\r\n cardEnabled: true,\r\n cardTitle: \"Credit or Debit Card\",\r\n loading: false,\r\n}\r\n\r\nexport function usePayPalPaymentMethods({\r\n baseUrl,\r\n publishableApiKey,\r\n cartId,\r\n enabled = true,\r\n}: Args): Result {\r\n const api = useMemo(\r\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\r\n [baseUrl, publishableApiKey]\r\n )\r\n\r\n const key = cacheKey(baseUrl, cartId)\r\n const hit = _cache.get(key)\r\n const seed = hit && Date.now() - hit.at < CACHE_TTL ? hit.result : null\r\n\r\n const [result, setResult] = useState<Result>(seed ?? { ...DEFAULT_RESULT, loading: enabled })\r\n const fetchIdRef = useRef(0)\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n setResult((prev) => ({ ...prev, loading: false }))\r\n return\r\n }\r\n\r\n const k = cacheKey(baseUrl, cartId)\r\n const cached = _cache.get(k)\r\n if (cached && Date.now() - cached.at < CACHE_TTL) {\r\n setResult(cached.result)\r\n return\r\n }\r\n\r\n const id = ++fetchIdRef.current\r\n let mounted = true\r\n const controller = new AbortController()\r\n\r\n setResult((prev) => ({ ...prev, loading: true }))\r\n\r\n ;(async () => {\r\n try {\r\n const cfg = await api.getConfig(cartId, controller.signal)\r\n if (!mounted || id !== fetchIdRef.current) return\r\n\r\n const next: Result = {\r\n paypalEnabled: cfg.paypal_enabled !== false,\r\n paypalTitle:\r\n typeof cfg.paypal_title === \"string\" && cfg.paypal_title\r\n ? cfg.paypal_title\r\n : \"PayPal\",\r\n cardEnabled: cfg.card_enabled !== false,\r\n cardTitle:\r\n typeof cfg.card_title === \"string\" && cfg.card_title\r\n ? cfg.card_title\r\n : \"Credit or Debit Card\",\r\n loading: false,\r\n }\r\n\r\n _cache.set(k, { result: next, at: Date.now() })\r\n setResult(next)\r\n } catch (e: any) {\r\n if (e?.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n\r\n if (e?.message?.includes(\"403\") || e?.message?.includes(\"Forbidden\")) {\r\n const disabled: Result = {\r\n ...DEFAULT_RESULT,\r\n paypalEnabled: false,\r\n cardEnabled: false,\r\n loading: false,\r\n }\r\n setResult(disabled)\r\n return\r\n }\r\n\r\n setResult({ ...DEFAULT_RESULT, loading: false })\r\n }\r\n })()\r\n\r\n return () => {\r\n mounted = false\r\n controller.abort()\r\n }\r\n }, [api, baseUrl, cartId, enabled])\r\n\r\n return result\r\n}\r\n"]}
|