@easypayment/medusa-paypal-ui 1.0.52 → 1.0.54
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
CHANGED
|
@@ -583,7 +583,7 @@ function PayPalSmartButtons(props) {
|
|
|
583
583
|
const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey);
|
|
584
584
|
await onPaid?.({ ...result, ...completeResult });
|
|
585
585
|
} catch (e) {
|
|
586
|
-
if (isNextRouterError(e))
|
|
586
|
+
if (isNextRouterError(e)) return;
|
|
587
587
|
hideProcessingOverlay();
|
|
588
588
|
setProcessing(false);
|
|
589
589
|
const msg = e instanceof Error ? e.message : "Payment capture failed";
|
|
@@ -743,6 +743,7 @@ function PayPalAdvancedCard(props) {
|
|
|
743
743
|
const [error, setError] = (0, import_react4.useState)(null);
|
|
744
744
|
const [submitting, setSubmitting] = (0, import_react4.useState)(false);
|
|
745
745
|
const submittingRef = (0, import_react4.useRef)(false);
|
|
746
|
+
const creatingOrderRef = (0, import_react4.useRef)(false);
|
|
746
747
|
const [{ isPending, isResolved, isRejected }] = (0, import_react_paypal_js3.usePayPalScriptReducer)();
|
|
747
748
|
if (!config.currency_supported) return null;
|
|
748
749
|
if (isRejected) {
|
|
@@ -931,10 +932,16 @@ function PayPalAdvancedCard(props) {
|
|
|
931
932
|
{
|
|
932
933
|
style: cardStyle,
|
|
933
934
|
createOrder: async () => {
|
|
934
|
-
if (
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
935
|
+
if (creatingOrderRef.current) throw new Error("Payment already processing");
|
|
936
|
+
creatingOrderRef.current = true;
|
|
937
|
+
try {
|
|
938
|
+
setError(null);
|
|
939
|
+
const r = await api.createOrder(cartId, true);
|
|
940
|
+
return r.id;
|
|
941
|
+
} catch (e) {
|
|
942
|
+
creatingOrderRef.current = false;
|
|
943
|
+
throw e;
|
|
944
|
+
}
|
|
938
945
|
},
|
|
939
946
|
onApprove: async (data) => {
|
|
940
947
|
try {
|
|
@@ -945,8 +952,9 @@ function PayPalAdvancedCard(props) {
|
|
|
945
952
|
const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey);
|
|
946
953
|
await onPaid?.({ ...result, ...completeResult });
|
|
947
954
|
} catch (e) {
|
|
948
|
-
if (isNextRouterError(e))
|
|
955
|
+
if (isNextRouterError(e)) return;
|
|
949
956
|
hideProcessingOverlay();
|
|
957
|
+
creatingOrderRef.current = false;
|
|
950
958
|
submittingRef.current = false;
|
|
951
959
|
setSubmitting(false);
|
|
952
960
|
const msg = e instanceof Error ? e.message : "Card payment failed";
|
|
@@ -956,6 +964,7 @@ function PayPalAdvancedCard(props) {
|
|
|
956
964
|
},
|
|
957
965
|
onCancel: () => {
|
|
958
966
|
hideProcessingOverlay();
|
|
967
|
+
creatingOrderRef.current = false;
|
|
959
968
|
submittingRef.current = false;
|
|
960
969
|
setSubmitting(false);
|
|
961
970
|
},
|
|
@@ -964,6 +973,7 @@ function PayPalAdvancedCard(props) {
|
|
|
964
973
|
setError(msg);
|
|
965
974
|
onError?.(msg);
|
|
966
975
|
hideProcessingOverlay();
|
|
976
|
+
creatingOrderRef.current = false;
|
|
967
977
|
submittingRef.current = false;
|
|
968
978
|
setSubmitting(false);
|
|
969
979
|
},
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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/utils/next-errors.ts","../src/utils/processing-overlay.ts","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx","../src/components/PayPalPaymentSection.tsx","../src/hooks/usePayPalPaymentMethods.ts"],"sourcesContent":["export * from \"./client/types\"\r\nexport * from \"./client/paypal\"\r\nexport * from \"./hooks/usePayPalConfig\"\r\nexport * from \"./components/PayPalProvider\"\r\nexport * from \"./components/PayPalCurrencyNotice\"\r\nexport * from \"./components/PayPalSmartButtons\"\r\nexport * from \"./components/PayPalAdvancedCard\"\r\nexport * from \"./adapters/MedusaNextPayPalAdapter\"\r\nexport * from \"./components/PayPalPaymentSection\"\r\nexport * from \"./hooks/usePayPalPaymentMethods\"\r\nexport { showProcessingOverlay, hideProcessingOverlay } from \"./utils/processing-overlay\"\r\n","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 timeoutMs = 30_000\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined\r\n const controller = new AbortController()\r\n if (!init?.signal) {\r\n timeoutId = setTimeout(() => controller.abort(), timeoutMs)\r\n }\r\n const effectiveSignal = init?.signal || controller.signal\r\n let res: Response\r\n try {\r\n res = await fetch(url, { ...init, headers, credentials: \"include\", signal: effectiveSignal })\r\n } catch (err) {\r\n if (err instanceof Error && err.name === \"AbortError\" && !init?.signal) {\r\n throw new Error(`[PayPal] Request to ${path} timed out after ${timeoutMs / 1000}s`)\r\n }\r\n throw err\r\n } finally {\r\n if (timeoutId !== undefined) clearTimeout(timeoutId)\r\n }\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(\r\n text.slice(0, 500).replace(/<[^>]*>/g, \"\") || `Request failed (${res.status})`\r\n )\r\n }\r\n if (!text) {\r\n throw new Error(`[PayPal] Empty response body from ${path} (${res.status})`)\r\n }\r\n\r\n const contentType = res.headers.get(\"content-type\") || \"\"\r\n if (!contentType.includes(\"application/json\")) {\r\n throw new Error(\r\n `[PayPal] Unexpected non-JSON response (${contentType}) from ${path}`\r\n )\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T\r\n } catch {\r\n throw new Error(`[PayPal] Failed to parse JSON response from ${path}`)\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 async function markPaymentComplete(\r\n baseUrl: string,\r\n cartId: string,\r\n publishableApiKey?: string\r\n): Promise<Record<string, unknown>> {\r\n const http = createHttpClient({ baseUrl, publishableApiKey })\r\n return http.request<Record<string, unknown>>(`/store/paypal-complete`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId }),\r\n })\r\n}\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","\"use client\"\r\n\r\nimport { 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\nconst MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { config: PayPalConfig; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { config: PayPalConfig; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 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 const fetchIdRef = useRef(0)\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n setLoading(false)\r\n setError(null)\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 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 cacheSet(k, { config: cfg, at: Date.now() })\r\n setConfig(cfg)\r\n } catch (e: unknown) {\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n setError(e instanceof Error ? 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\nconst BN_CODE = \"MBJTechnolabs_SI_SPB\"\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 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 \"data-partner-attribution-id\": BN_CODE,\r\n }\r\n }, [config.client_id, config.currency, config.client_token, 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\"\r\n\r\nimport React from \"react\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\r\n if (config.currency_supported) return null\r\n\r\n return (\r\n <div role=\"alert\" style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\r\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\r\n <ul style={{ margin: 0, paddingLeft: 18 }}>\r\n {(config.currency_errors || []).map((e) => (\r\n <li key={e}>{e}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\nimport React, { useCallback, useMemo, useState } from \"react\"\r\nimport { PayPalButtons, usePayPalScriptReducer } from \"@paypal/react-paypal-js\"\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\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 const [processing, setProcessing] = useState(false)\r\n const [buttonsReady, setButtonsReady] = useState(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n const handleInit = useCallback(() => {\r\n setButtonsReady(true)\r\n }, [])\r\n\r\n const showSpinner = isPending || (isResolved && !buttonsReady)\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 <div style={{ width: containerWidth, position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {processing && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#0070ba\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #0070ba, #003087)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showSpinner && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\r\n }}\r\n >\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading PayPal…\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isRejected && (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )}\r\n\r\n {config.environment === \"sandbox\" && buttonsReady && (\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 {isResolved && (\r\n <div style={buttonsReady ? undefined : { position: \"absolute\", left: -9999, opacity: 0, pointerEvents: \"none\" }}>\r\n <PayPalButtons\r\n forceReRender={[config.currency, config.intent, cartId]}\r\n onInit={handleInit}\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 if (processing) throw new Error(\"Payment already processing\")\r\n setError(null)\r\n setProcessing(true)\r\n try {\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n } catch (e: unknown) {\r\n setProcessing(false)\r\n throw e\r\n }\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setProcessing(true)\r\n showProcessingOverlay()\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n if (!orderId) throw new Error(\"PayPal order ID is missing from approval response\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) throw e\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n const msg = e instanceof Error ? e.message : \"Payment capture failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n }}\r\n onError={(err: Error | { message?: string }) => {\r\n hideProcessingOverlay()\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 </div>\r\n )}\r\n\r\n {error ? (\r\n <div\r\n role=\"alert\"\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","/**\r\n * Detect Next.js router errors (redirect / notFound) that must be re-thrown.\r\n *\r\n * Next.js implements redirect() and notFound() by throwing special errors with\r\n * a `digest` property starting with \"NEXT_REDIRECT\" or \"NEXT_NOT_FOUND\".\r\n * Catching these in user-land try/catch blocks prevents the navigation from\r\n * happening. Because this package can't import from `next` (it's a peer dep),\r\n * we detect them by duck-typing the digest.\r\n */\r\nexport function isNextRouterError(e: unknown): boolean {\r\n if (typeof e !== \"object\" || e === null || !(\"digest\" in e)) return false\r\n const digest = (e as { digest: unknown }).digest\r\n return (\r\n typeof digest === \"string\" &&\r\n (digest.startsWith(\"NEXT_REDIRECT\") || digest.startsWith(\"NEXT_NOT_FOUND\"))\r\n )\r\n}\r\n","const OVERLAY_ID = \"__pp_processing_overlay\"\r\n\r\nexport function showProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n if (document.getElementById(OVERLAY_ID)) return\r\n\r\n const overlay = document.createElement(\"div\")\r\n overlay.id = OVERLAY_ID\r\n overlay.setAttribute(\"role\", \"status\")\r\n overlay.setAttribute(\"aria-label\", \"Processing payment\")\r\n\r\n overlay.innerHTML = `\r\n <style>\r\n @keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n @keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n </style>\r\n <div style=\"position:relative;width:56px;height:56px\">\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid #e5e7eb\"></div>\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid transparent;border-top-color:#0070ba;animation:_pp_spin .8s linear infinite\"></div>\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#0070ba\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:24px;height:24px\">\r\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>\r\n </svg>\r\n </div>\r\n <div style=\"text-align:center\">\r\n <div style=\"font-size:18px;font-weight:600;color:#111827;letter-spacing:-0.01em\">Processing your payment</div>\r\n <div style=\"font-size:14px;color:#6b7280;margin-top:6px;line-height:1.5\">\r\n This may take a few moments. Please do not close<br>or refresh this page.\r\n </div>\r\n </div>\r\n <div style=\"width:200px;height:3px;background:#e5e7eb;border-radius:3px;overflow:hidden;margin-top:4px\">\r\n <div style=\"width:40%;height:100%;background:linear-gradient(90deg,#0070ba,#003087);border-radius:3px;animation:_pp_progress 1.5s ease-in-out infinite\"></div>\r\n </div>\r\n `\r\n\r\n Object.assign(overlay.style, {\r\n position: \"fixed\",\r\n inset: \"0\",\r\n zIndex: \"99999\",\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: \"20px\",\r\n fontFamily: \"-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif\",\r\n })\r\n\r\n document.body.appendChild(overlay)\r\n}\r\n\r\nexport function hideProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n document.getElementById(OVERLAY_ID)?.remove()\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo, useRef, useState } from \"react\"\r\nimport {\r\n PayPalCardFieldsProvider,\r\n PayPalNumberField,\r\n PayPalExpiryField,\r\n PayPalCVVField,\r\n usePayPalCardFields,\r\n usePayPalScriptReducer,\r\n} from \"@paypal/react-paypal-js\"\r\n\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\r\n\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\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\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 aria-busy={disabled}\r\n onClick={() => {\r\n onSubmit()\r\n try {\r\n cardFieldsForm?.submit()\r\n } catch {\r\n // submit() error is handled by PayPalCardFieldsProvider onError\r\n }\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\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 const submittingRef = useRef(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n if (!config.currency_supported) return null\r\n\r\n if (isRejected) {\r\n return (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )\r\n }\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 if (isPending) {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading card fields…\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (!isResolved) return null\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {submitting && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#2563eb\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#2563eb\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #2563eb, #1d4ed8)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n <PayPalCardFieldsProvider\r\n style={cardStyle}\r\n createOrder={async () => {\r\n if (submittingRef.current) throw new Error(\"Payment already processing\")\r\n setError(null)\r\n const r = await api.createOrder(cartId, true)\r\n return r.id\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setError(null)\r\n showProcessingOverlay()\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) throw e\r\n hideProcessingOverlay()\r\n submittingRef.current = false\r\n setSubmitting(false)\r\n const msg = e instanceof Error ? e.message : \"Card payment failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n submittingRef.current = false\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 hideProcessingOverlay()\r\n submittingRef.current = false\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 {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 <div>\r\n <label style={labelStyle}>Card number</label>\r\n <PayPalNumberField />\r\n </div>\r\n\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 <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 <SubmitButton\r\n disabled={submitting}\r\n label={submitting ? \"Processing…\" : \"Pay by Card\"}\r\n onSubmit={() => {\r\n if (submittingRef.current) return\r\n submittingRef.current = true\r\n setError(null)\r\n setSubmitting(true)\r\n showProcessingOverlay()\r\n }}\r\n />\r\n\r\n {error && (\r\n <div\r\n role=\"alert\"\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}\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\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction PayPalLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction PayPalErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\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 const handlePaid = useCallback(\r\n async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await onSuccess?.(cartId)\r\n },\r\n [cartId, onPaid, onSuccess]\r\n )\r\n\r\n if (!shouldRender) return null\r\n\r\n if (loading) return <PayPalLoadingCard />\r\n\r\n if (error) return <PayPalErrorCard message={error} />\r\n\r\n if (!config) return null\r\n\r\n const isCardProvider = selectedProviderId === paypalCardProviderId\r\n if (config.paypal_enabled === false && !isCardProvider) return null\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\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\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\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\nconst SPIN_STYLE = `@keyframes _pp_section_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction SessionInitCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Setting up payment\"\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\nfunction ConfigLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction ErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 PayPalPaymentSectionProps = {\r\n cartId: string\r\n selectedProviderId: string | null | undefined\r\n baseUrl: string\r\n publishableApiKey?: string\r\n sessionLoading?: boolean\r\n onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\r\n onPaid?: (result: unknown) => void\r\n}\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 async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await 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\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 MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { result: Result; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { result: Result; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 cacheSet(k, { result: next, at: Date.now() })\r\n setResult(next)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"\"\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n\r\n if (msg.includes(\"403\") || msg.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"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_react_paypal_js","import_jsx_runtime","import_react","import_react_paypal_js","import_jsx_runtime","SPIN_STYLE","import_react","import_jsx_runtime","SPIN_STYLE","import_react","import_jsx_runtime","SPIN_STYLE","import_react","MAX_CACHE_ENTRIES","_cache","CACHE_TTL","cacheSet","cacheKey"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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/utils/next-errors.ts","../src/utils/processing-overlay.ts","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx","../src/components/PayPalPaymentSection.tsx","../src/hooks/usePayPalPaymentMethods.ts"],"sourcesContent":["export * from \"./client/types\"\r\nexport * from \"./client/paypal\"\r\nexport * from \"./hooks/usePayPalConfig\"\r\nexport * from \"./components/PayPalProvider\"\r\nexport * from \"./components/PayPalCurrencyNotice\"\r\nexport * from \"./components/PayPalSmartButtons\"\r\nexport * from \"./components/PayPalAdvancedCard\"\r\nexport * from \"./adapters/MedusaNextPayPalAdapter\"\r\nexport * from \"./components/PayPalPaymentSection\"\r\nexport * from \"./hooks/usePayPalPaymentMethods\"\r\nexport { showProcessingOverlay, hideProcessingOverlay } from \"./utils/processing-overlay\"\r\n","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 timeoutMs = 30_000\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined\r\n const controller = new AbortController()\r\n if (!init?.signal) {\r\n timeoutId = setTimeout(() => controller.abort(), timeoutMs)\r\n }\r\n const effectiveSignal = init?.signal || controller.signal\r\n let res: Response\r\n try {\r\n res = await fetch(url, { ...init, headers, credentials: \"include\", signal: effectiveSignal })\r\n } catch (err) {\r\n if (err instanceof Error && err.name === \"AbortError\" && !init?.signal) {\r\n throw new Error(`[PayPal] Request to ${path} timed out after ${timeoutMs / 1000}s`)\r\n }\r\n throw err\r\n } finally {\r\n if (timeoutId !== undefined) clearTimeout(timeoutId)\r\n }\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(\r\n text.slice(0, 500).replace(/<[^>]*>/g, \"\") || `Request failed (${res.status})`\r\n )\r\n }\r\n if (!text) {\r\n throw new Error(`[PayPal] Empty response body from ${path} (${res.status})`)\r\n }\r\n\r\n const contentType = res.headers.get(\"content-type\") || \"\"\r\n if (!contentType.includes(\"application/json\")) {\r\n throw new Error(\r\n `[PayPal] Unexpected non-JSON response (${contentType}) from ${path}`\r\n )\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T\r\n } catch {\r\n throw new Error(`[PayPal] Failed to parse JSON response from ${path}`)\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 async function markPaymentComplete(\r\n baseUrl: string,\r\n cartId: string,\r\n publishableApiKey?: string\r\n): Promise<Record<string, unknown>> {\r\n const http = createHttpClient({ baseUrl, publishableApiKey })\r\n return http.request<Record<string, unknown>>(`/store/paypal-complete`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId }),\r\n })\r\n}\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","\"use client\"\r\n\r\nimport { 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\nconst MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { config: PayPalConfig; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { config: PayPalConfig; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 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 const fetchIdRef = useRef(0)\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n setLoading(false)\r\n setError(null)\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 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 cacheSet(k, { config: cfg, at: Date.now() })\r\n setConfig(cfg)\r\n } catch (e: unknown) {\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n setError(e instanceof Error ? 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\nconst BN_CODE = \"MBJTechnolabs_SI_SPB\"\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 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 \"data-partner-attribution-id\": BN_CODE,\r\n }\r\n }, [config.client_id, config.currency, config.client_token, 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\"\r\n\r\nimport React from \"react\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\r\n if (config.currency_supported) return null\r\n\r\n return (\r\n <div role=\"alert\" style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\r\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\r\n <ul style={{ margin: 0, paddingLeft: 18 }}>\r\n {(config.currency_errors || []).map((e) => (\r\n <li key={e}>{e}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\nimport React, { useCallback, useMemo, useState } from \"react\"\r\nimport { PayPalButtons, usePayPalScriptReducer } from \"@paypal/react-paypal-js\"\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\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 const [processing, setProcessing] = useState(false)\r\n const [buttonsReady, setButtonsReady] = useState(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n const handleInit = useCallback(() => {\r\n setButtonsReady(true)\r\n }, [])\r\n\r\n const showSpinner = isPending || (isResolved && !buttonsReady)\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 <div style={{ width: containerWidth, position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {processing && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#0070ba\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #0070ba, #003087)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showSpinner && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\r\n }}\r\n >\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading PayPal…\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isRejected && (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )}\r\n\r\n {config.environment === \"sandbox\" && buttonsReady && (\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 {isResolved && (\r\n <div style={buttonsReady ? undefined : { position: \"absolute\", left: -9999, opacity: 0, pointerEvents: \"none\" }}>\r\n <PayPalButtons\r\n forceReRender={[config.currency, config.intent, cartId]}\r\n onInit={handleInit}\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 if (processing) throw new Error(\"Payment already processing\")\r\n setError(null)\r\n setProcessing(true)\r\n try {\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n } catch (e: unknown) {\r\n setProcessing(false)\r\n throw e\r\n }\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setProcessing(true)\r\n showProcessingOverlay()\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n if (!orderId) throw new Error(\"PayPal order ID is missing from approval response\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) return\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n const msg = e instanceof Error ? e.message : \"Payment capture failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n }}\r\n onError={(err: Error | { message?: string }) => {\r\n hideProcessingOverlay()\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 </div>\r\n )}\r\n\r\n {error ? (\r\n <div\r\n role=\"alert\"\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","/**\r\n * Detect Next.js router errors (redirect / notFound) that must be re-thrown.\r\n *\r\n * Next.js implements redirect() and notFound() by throwing special errors with\r\n * a `digest` property starting with \"NEXT_REDIRECT\" or \"NEXT_NOT_FOUND\".\r\n * Catching these in user-land try/catch blocks prevents the navigation from\r\n * happening. Because this package can't import from `next` (it's a peer dep),\r\n * we detect them by duck-typing the digest.\r\n */\r\nexport function isNextRouterError(e: unknown): boolean {\r\n if (typeof e !== \"object\" || e === null || !(\"digest\" in e)) return false\r\n const digest = (e as { digest: unknown }).digest\r\n return (\r\n typeof digest === \"string\" &&\r\n (digest.startsWith(\"NEXT_REDIRECT\") || digest.startsWith(\"NEXT_NOT_FOUND\"))\r\n )\r\n}\r\n","const OVERLAY_ID = \"__pp_processing_overlay\"\r\n\r\nexport function showProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n if (document.getElementById(OVERLAY_ID)) return\r\n\r\n const overlay = document.createElement(\"div\")\r\n overlay.id = OVERLAY_ID\r\n overlay.setAttribute(\"role\", \"status\")\r\n overlay.setAttribute(\"aria-label\", \"Processing payment\")\r\n\r\n overlay.innerHTML = `\r\n <style>\r\n @keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n @keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n </style>\r\n <div style=\"position:relative;width:56px;height:56px\">\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid #e5e7eb\"></div>\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid transparent;border-top-color:#0070ba;animation:_pp_spin .8s linear infinite\"></div>\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#0070ba\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:24px;height:24px\">\r\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>\r\n </svg>\r\n </div>\r\n <div style=\"text-align:center\">\r\n <div style=\"font-size:18px;font-weight:600;color:#111827;letter-spacing:-0.01em\">Processing your payment</div>\r\n <div style=\"font-size:14px;color:#6b7280;margin-top:6px;line-height:1.5\">\r\n This may take a few moments. Please do not close<br>or refresh this page.\r\n </div>\r\n </div>\r\n <div style=\"width:200px;height:3px;background:#e5e7eb;border-radius:3px;overflow:hidden;margin-top:4px\">\r\n <div style=\"width:40%;height:100%;background:linear-gradient(90deg,#0070ba,#003087);border-radius:3px;animation:_pp_progress 1.5s ease-in-out infinite\"></div>\r\n </div>\r\n `\r\n\r\n Object.assign(overlay.style, {\r\n position: \"fixed\",\r\n inset: \"0\",\r\n zIndex: \"99999\",\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: \"20px\",\r\n fontFamily: \"-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif\",\r\n })\r\n\r\n document.body.appendChild(overlay)\r\n}\r\n\r\nexport function hideProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n document.getElementById(OVERLAY_ID)?.remove()\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo, useRef, useState } from \"react\"\r\nimport {\r\n PayPalCardFieldsProvider,\r\n PayPalNumberField,\r\n PayPalExpiryField,\r\n PayPalCVVField,\r\n usePayPalCardFields,\r\n usePayPalScriptReducer,\r\n} from \"@paypal/react-paypal-js\"\r\n\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\r\n\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\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\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 aria-busy={disabled}\r\n onClick={() => {\r\n onSubmit()\r\n try {\r\n cardFieldsForm?.submit()\r\n } catch {\r\n // submit() error is handled by PayPalCardFieldsProvider onError\r\n }\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\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 const submittingRef = useRef(false)\r\n const creatingOrderRef = useRef(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n if (!config.currency_supported) return null\r\n\r\n if (isRejected) {\r\n return (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )\r\n }\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 if (isPending) {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading card fields…\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (!isResolved) return null\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {submitting && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#2563eb\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#2563eb\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #2563eb, #1d4ed8)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n <PayPalCardFieldsProvider\r\n style={cardStyle}\r\n createOrder={async () => {\r\n if (creatingOrderRef.current) throw new Error(\"Payment already processing\")\r\n creatingOrderRef.current = true\r\n try {\r\n setError(null)\r\n const r = await api.createOrder(cartId, true)\r\n return r.id\r\n } catch (e) {\r\n creatingOrderRef.current = false\r\n throw e\r\n }\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setError(null)\r\n showProcessingOverlay()\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) return\r\n hideProcessingOverlay()\r\n creatingOrderRef.current = false\r\n submittingRef.current = false\r\n setSubmitting(false)\r\n const msg = e instanceof Error ? e.message : \"Card payment failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n creatingOrderRef.current = false\r\n submittingRef.current = false\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 hideProcessingOverlay()\r\n creatingOrderRef.current = false\r\n submittingRef.current = false\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 {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 <div>\r\n <label style={labelStyle}>Card number</label>\r\n <PayPalNumberField />\r\n </div>\r\n\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 <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 <SubmitButton\r\n disabled={submitting}\r\n label={submitting ? \"Processing…\" : \"Pay by Card\"}\r\n onSubmit={() => {\r\n if (submittingRef.current) return\r\n submittingRef.current = true\r\n setError(null)\r\n setSubmitting(true)\r\n showProcessingOverlay()\r\n }}\r\n />\r\n\r\n {error && (\r\n <div\r\n role=\"alert\"\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}\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\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction PayPalLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction PayPalErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\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 const handlePaid = useCallback(\r\n async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await onSuccess?.(cartId)\r\n },\r\n [cartId, onPaid, onSuccess]\r\n )\r\n\r\n if (!shouldRender) return null\r\n\r\n if (loading) return <PayPalLoadingCard />\r\n\r\n if (error) return <PayPalErrorCard message={error} />\r\n\r\n if (!config) return null\r\n\r\n const isCardProvider = selectedProviderId === paypalCardProviderId\r\n if (config.paypal_enabled === false && !isCardProvider) return null\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\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\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\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\nconst SPIN_STYLE = `@keyframes _pp_section_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction SessionInitCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Setting up payment\"\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\nfunction ConfigLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction ErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 PayPalPaymentSectionProps = {\r\n cartId: string\r\n selectedProviderId: string | null | undefined\r\n baseUrl: string\r\n publishableApiKey?: string\r\n sessionLoading?: boolean\r\n onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\r\n onPaid?: (result: unknown) => void\r\n}\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 async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await 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\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 MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { result: Result; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { result: Result; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 cacheSet(k, { result: next, at: Date.now() })\r\n setResult(next)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"\"\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n\r\n if (msg.includes(\"403\") || msg.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"],"mappings":"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","names":["import_react","import_jsx_runtime","import_react","import_react_paypal_js","import_jsx_runtime","import_react","import_react_paypal_js","import_jsx_runtime","SPIN_STYLE","import_react","import_jsx_runtime","SPIN_STYLE","import_react","import_jsx_runtime","SPIN_STYLE","import_react","MAX_CACHE_ENTRIES","_cache","CACHE_TTL","cacheSet","cacheKey"]}
|
package/dist/index.mjs
CHANGED
|
@@ -544,7 +544,7 @@ function PayPalSmartButtons(props) {
|
|
|
544
544
|
const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey);
|
|
545
545
|
await onPaid?.({ ...result, ...completeResult });
|
|
546
546
|
} catch (e) {
|
|
547
|
-
if (isNextRouterError(e))
|
|
547
|
+
if (isNextRouterError(e)) return;
|
|
548
548
|
hideProcessingOverlay();
|
|
549
549
|
setProcessing(false);
|
|
550
550
|
const msg = e instanceof Error ? e.message : "Payment capture failed";
|
|
@@ -711,6 +711,7 @@ function PayPalAdvancedCard(props) {
|
|
|
711
711
|
const [error, setError] = useState3(null);
|
|
712
712
|
const [submitting, setSubmitting] = useState3(false);
|
|
713
713
|
const submittingRef = useRef2(false);
|
|
714
|
+
const creatingOrderRef = useRef2(false);
|
|
714
715
|
const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer2();
|
|
715
716
|
if (!config.currency_supported) return null;
|
|
716
717
|
if (isRejected) {
|
|
@@ -899,10 +900,16 @@ function PayPalAdvancedCard(props) {
|
|
|
899
900
|
{
|
|
900
901
|
style: cardStyle,
|
|
901
902
|
createOrder: async () => {
|
|
902
|
-
if (
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
903
|
+
if (creatingOrderRef.current) throw new Error("Payment already processing");
|
|
904
|
+
creatingOrderRef.current = true;
|
|
905
|
+
try {
|
|
906
|
+
setError(null);
|
|
907
|
+
const r = await api.createOrder(cartId, true);
|
|
908
|
+
return r.id;
|
|
909
|
+
} catch (e) {
|
|
910
|
+
creatingOrderRef.current = false;
|
|
911
|
+
throw e;
|
|
912
|
+
}
|
|
906
913
|
},
|
|
907
914
|
onApprove: async (data) => {
|
|
908
915
|
try {
|
|
@@ -913,8 +920,9 @@ function PayPalAdvancedCard(props) {
|
|
|
913
920
|
const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey);
|
|
914
921
|
await onPaid?.({ ...result, ...completeResult });
|
|
915
922
|
} catch (e) {
|
|
916
|
-
if (isNextRouterError(e))
|
|
923
|
+
if (isNextRouterError(e)) return;
|
|
917
924
|
hideProcessingOverlay();
|
|
925
|
+
creatingOrderRef.current = false;
|
|
918
926
|
submittingRef.current = false;
|
|
919
927
|
setSubmitting(false);
|
|
920
928
|
const msg = e instanceof Error ? e.message : "Card payment failed";
|
|
@@ -924,6 +932,7 @@ function PayPalAdvancedCard(props) {
|
|
|
924
932
|
},
|
|
925
933
|
onCancel: () => {
|
|
926
934
|
hideProcessingOverlay();
|
|
935
|
+
creatingOrderRef.current = false;
|
|
927
936
|
submittingRef.current = false;
|
|
928
937
|
setSubmitting(false);
|
|
929
938
|
},
|
|
@@ -932,6 +941,7 @@ function PayPalAdvancedCard(props) {
|
|
|
932
941
|
setError(msg);
|
|
933
942
|
onError?.(msg);
|
|
934
943
|
hideProcessingOverlay();
|
|
944
|
+
creatingOrderRef.current = false;
|
|
935
945
|
submittingRef.current = false;
|
|
936
946
|
setSubmitting(false);
|
|
937
947
|
},
|
package/dist/index.mjs.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/utils/next-errors.ts","../src/utils/processing-overlay.ts","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx","../src/components/PayPalPaymentSection.tsx","../src/hooks/usePayPalPaymentMethods.ts"],"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 timeoutMs = 30_000\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined\r\n const controller = new AbortController()\r\n if (!init?.signal) {\r\n timeoutId = setTimeout(() => controller.abort(), timeoutMs)\r\n }\r\n const effectiveSignal = init?.signal || controller.signal\r\n let res: Response\r\n try {\r\n res = await fetch(url, { ...init, headers, credentials: \"include\", signal: effectiveSignal })\r\n } catch (err) {\r\n if (err instanceof Error && err.name === \"AbortError\" && !init?.signal) {\r\n throw new Error(`[PayPal] Request to ${path} timed out after ${timeoutMs / 1000}s`)\r\n }\r\n throw err\r\n } finally {\r\n if (timeoutId !== undefined) clearTimeout(timeoutId)\r\n }\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(\r\n text.slice(0, 500).replace(/<[^>]*>/g, \"\") || `Request failed (${res.status})`\r\n )\r\n }\r\n if (!text) {\r\n throw new Error(`[PayPal] Empty response body from ${path} (${res.status})`)\r\n }\r\n\r\n const contentType = res.headers.get(\"content-type\") || \"\"\r\n if (!contentType.includes(\"application/json\")) {\r\n throw new Error(\r\n `[PayPal] Unexpected non-JSON response (${contentType}) from ${path}`\r\n )\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T\r\n } catch {\r\n throw new Error(`[PayPal] Failed to parse JSON response from ${path}`)\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 async function markPaymentComplete(\r\n baseUrl: string,\r\n cartId: string,\r\n publishableApiKey?: string\r\n): Promise<Record<string, unknown>> {\r\n const http = createHttpClient({ baseUrl, publishableApiKey })\r\n return http.request<Record<string, unknown>>(`/store/paypal-complete`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId }),\r\n })\r\n}\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","\"use client\"\r\n\r\nimport { 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\nconst MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { config: PayPalConfig; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { config: PayPalConfig; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 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 const fetchIdRef = useRef(0)\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n setLoading(false)\r\n setError(null)\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 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 cacheSet(k, { config: cfg, at: Date.now() })\r\n setConfig(cfg)\r\n } catch (e: unknown) {\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n setError(e instanceof Error ? 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\nconst BN_CODE = \"MBJTechnolabs_SI_SPB\"\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 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 \"data-partner-attribution-id\": BN_CODE,\r\n }\r\n }, [config.client_id, config.currency, config.client_token, 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\"\r\n\r\nimport React from \"react\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\r\n if (config.currency_supported) return null\r\n\r\n return (\r\n <div role=\"alert\" style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\r\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\r\n <ul style={{ margin: 0, paddingLeft: 18 }}>\r\n {(config.currency_errors || []).map((e) => (\r\n <li key={e}>{e}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\nimport React, { useCallback, useMemo, useState } from \"react\"\r\nimport { PayPalButtons, usePayPalScriptReducer } from \"@paypal/react-paypal-js\"\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\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 const [processing, setProcessing] = useState(false)\r\n const [buttonsReady, setButtonsReady] = useState(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n const handleInit = useCallback(() => {\r\n setButtonsReady(true)\r\n }, [])\r\n\r\n const showSpinner = isPending || (isResolved && !buttonsReady)\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 <div style={{ width: containerWidth, position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {processing && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#0070ba\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #0070ba, #003087)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showSpinner && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\r\n }}\r\n >\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading PayPal…\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isRejected && (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )}\r\n\r\n {config.environment === \"sandbox\" && buttonsReady && (\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 {isResolved && (\r\n <div style={buttonsReady ? undefined : { position: \"absolute\", left: -9999, opacity: 0, pointerEvents: \"none\" }}>\r\n <PayPalButtons\r\n forceReRender={[config.currency, config.intent, cartId]}\r\n onInit={handleInit}\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 if (processing) throw new Error(\"Payment already processing\")\r\n setError(null)\r\n setProcessing(true)\r\n try {\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n } catch (e: unknown) {\r\n setProcessing(false)\r\n throw e\r\n }\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setProcessing(true)\r\n showProcessingOverlay()\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n if (!orderId) throw new Error(\"PayPal order ID is missing from approval response\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) throw e\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n const msg = e instanceof Error ? e.message : \"Payment capture failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n }}\r\n onError={(err: Error | { message?: string }) => {\r\n hideProcessingOverlay()\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 </div>\r\n )}\r\n\r\n {error ? (\r\n <div\r\n role=\"alert\"\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","/**\r\n * Detect Next.js router errors (redirect / notFound) that must be re-thrown.\r\n *\r\n * Next.js implements redirect() and notFound() by throwing special errors with\r\n * a `digest` property starting with \"NEXT_REDIRECT\" or \"NEXT_NOT_FOUND\".\r\n * Catching these in user-land try/catch blocks prevents the navigation from\r\n * happening. Because this package can't import from `next` (it's a peer dep),\r\n * we detect them by duck-typing the digest.\r\n */\r\nexport function isNextRouterError(e: unknown): boolean {\r\n if (typeof e !== \"object\" || e === null || !(\"digest\" in e)) return false\r\n const digest = (e as { digest: unknown }).digest\r\n return (\r\n typeof digest === \"string\" &&\r\n (digest.startsWith(\"NEXT_REDIRECT\") || digest.startsWith(\"NEXT_NOT_FOUND\"))\r\n )\r\n}\r\n","const OVERLAY_ID = \"__pp_processing_overlay\"\r\n\r\nexport function showProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n if (document.getElementById(OVERLAY_ID)) return\r\n\r\n const overlay = document.createElement(\"div\")\r\n overlay.id = OVERLAY_ID\r\n overlay.setAttribute(\"role\", \"status\")\r\n overlay.setAttribute(\"aria-label\", \"Processing payment\")\r\n\r\n overlay.innerHTML = `\r\n <style>\r\n @keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n @keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n </style>\r\n <div style=\"position:relative;width:56px;height:56px\">\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid #e5e7eb\"></div>\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid transparent;border-top-color:#0070ba;animation:_pp_spin .8s linear infinite\"></div>\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#0070ba\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:24px;height:24px\">\r\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>\r\n </svg>\r\n </div>\r\n <div style=\"text-align:center\">\r\n <div style=\"font-size:18px;font-weight:600;color:#111827;letter-spacing:-0.01em\">Processing your payment</div>\r\n <div style=\"font-size:14px;color:#6b7280;margin-top:6px;line-height:1.5\">\r\n This may take a few moments. Please do not close<br>or refresh this page.\r\n </div>\r\n </div>\r\n <div style=\"width:200px;height:3px;background:#e5e7eb;border-radius:3px;overflow:hidden;margin-top:4px\">\r\n <div style=\"width:40%;height:100%;background:linear-gradient(90deg,#0070ba,#003087);border-radius:3px;animation:_pp_progress 1.5s ease-in-out infinite\"></div>\r\n </div>\r\n `\r\n\r\n Object.assign(overlay.style, {\r\n position: \"fixed\",\r\n inset: \"0\",\r\n zIndex: \"99999\",\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: \"20px\",\r\n fontFamily: \"-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif\",\r\n })\r\n\r\n document.body.appendChild(overlay)\r\n}\r\n\r\nexport function hideProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n document.getElementById(OVERLAY_ID)?.remove()\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo, useRef, useState } from \"react\"\r\nimport {\r\n PayPalCardFieldsProvider,\r\n PayPalNumberField,\r\n PayPalExpiryField,\r\n PayPalCVVField,\r\n usePayPalCardFields,\r\n usePayPalScriptReducer,\r\n} from \"@paypal/react-paypal-js\"\r\n\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\r\n\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\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\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 aria-busy={disabled}\r\n onClick={() => {\r\n onSubmit()\r\n try {\r\n cardFieldsForm?.submit()\r\n } catch {\r\n // submit() error is handled by PayPalCardFieldsProvider onError\r\n }\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\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 const submittingRef = useRef(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n if (!config.currency_supported) return null\r\n\r\n if (isRejected) {\r\n return (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )\r\n }\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 if (isPending) {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading card fields…\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (!isResolved) return null\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {submitting && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#2563eb\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#2563eb\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #2563eb, #1d4ed8)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n <PayPalCardFieldsProvider\r\n style={cardStyle}\r\n createOrder={async () => {\r\n if (submittingRef.current) throw new Error(\"Payment already processing\")\r\n setError(null)\r\n const r = await api.createOrder(cartId, true)\r\n return r.id\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setError(null)\r\n showProcessingOverlay()\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) throw e\r\n hideProcessingOverlay()\r\n submittingRef.current = false\r\n setSubmitting(false)\r\n const msg = e instanceof Error ? e.message : \"Card payment failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n submittingRef.current = false\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 hideProcessingOverlay()\r\n submittingRef.current = false\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 {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 <div>\r\n <label style={labelStyle}>Card number</label>\r\n <PayPalNumberField />\r\n </div>\r\n\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 <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 <SubmitButton\r\n disabled={submitting}\r\n label={submitting ? \"Processing…\" : \"Pay by Card\"}\r\n onSubmit={() => {\r\n if (submittingRef.current) return\r\n submittingRef.current = true\r\n setError(null)\r\n setSubmitting(true)\r\n showProcessingOverlay()\r\n }}\r\n />\r\n\r\n {error && (\r\n <div\r\n role=\"alert\"\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}\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\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction PayPalLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction PayPalErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\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 const handlePaid = useCallback(\r\n async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await onSuccess?.(cartId)\r\n },\r\n [cartId, onPaid, onSuccess]\r\n )\r\n\r\n if (!shouldRender) return null\r\n\r\n if (loading) return <PayPalLoadingCard />\r\n\r\n if (error) return <PayPalErrorCard message={error} />\r\n\r\n if (!config) return null\r\n\r\n const isCardProvider = selectedProviderId === paypalCardProviderId\r\n if (config.paypal_enabled === false && !isCardProvider) return null\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\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\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\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\nconst SPIN_STYLE = `@keyframes _pp_section_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction SessionInitCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Setting up payment\"\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\nfunction ConfigLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction ErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 PayPalPaymentSectionProps = {\r\n cartId: string\r\n selectedProviderId: string | null | undefined\r\n baseUrl: string\r\n publishableApiKey?: string\r\n sessionLoading?: boolean\r\n onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\r\n onPaid?: (result: unknown) => void\r\n}\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 async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await 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\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 MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { result: Result; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { result: Result; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 cacheSet(k, { result: next, at: Date.now() })\r\n setResult(next)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"\"\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n\r\n if (msg.includes(\"403\") || msg.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"],"mappings":"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","names":["useMemo","jsx","useMemo","useState","jsx","jsxs","useMemo","useState","useMemo","useRef","useState","usePayPalScriptReducer","jsx","jsxs","SPIN_STYLE","useMemo","useState","useRef","usePayPalScriptReducer","useCallback","jsx","jsxs","SPIN_STYLE","useCallback","useCallback","jsx","jsxs","SPIN_STYLE","useCallback","useEffect","useMemo","useRef","useState","MAX_CACHE_ENTRIES","_cache","CACHE_TTL","cacheSet","cacheKey","useMemo","useState","useRef","useEffect"]}
|
|
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/utils/next-errors.ts","../src/utils/processing-overlay.ts","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx","../src/components/PayPalPaymentSection.tsx","../src/hooks/usePayPalPaymentMethods.ts"],"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 timeoutMs = 30_000\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined\r\n const controller = new AbortController()\r\n if (!init?.signal) {\r\n timeoutId = setTimeout(() => controller.abort(), timeoutMs)\r\n }\r\n const effectiveSignal = init?.signal || controller.signal\r\n let res: Response\r\n try {\r\n res = await fetch(url, { ...init, headers, credentials: \"include\", signal: effectiveSignal })\r\n } catch (err) {\r\n if (err instanceof Error && err.name === \"AbortError\" && !init?.signal) {\r\n throw new Error(`[PayPal] Request to ${path} timed out after ${timeoutMs / 1000}s`)\r\n }\r\n throw err\r\n } finally {\r\n if (timeoutId !== undefined) clearTimeout(timeoutId)\r\n }\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(\r\n text.slice(0, 500).replace(/<[^>]*>/g, \"\") || `Request failed (${res.status})`\r\n )\r\n }\r\n if (!text) {\r\n throw new Error(`[PayPal] Empty response body from ${path} (${res.status})`)\r\n }\r\n\r\n const contentType = res.headers.get(\"content-type\") || \"\"\r\n if (!contentType.includes(\"application/json\")) {\r\n throw new Error(\r\n `[PayPal] Unexpected non-JSON response (${contentType}) from ${path}`\r\n )\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T\r\n } catch {\r\n throw new Error(`[PayPal] Failed to parse JSON response from ${path}`)\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 async function markPaymentComplete(\r\n baseUrl: string,\r\n cartId: string,\r\n publishableApiKey?: string\r\n): Promise<Record<string, unknown>> {\r\n const http = createHttpClient({ baseUrl, publishableApiKey })\r\n return http.request<Record<string, unknown>>(`/store/paypal-complete`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ cart_id: cartId }),\r\n })\r\n}\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","\"use client\"\r\n\r\nimport { 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\nconst MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { config: PayPalConfig; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { config: PayPalConfig; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 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 const fetchIdRef = useRef(0)\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n setLoading(false)\r\n setError(null)\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 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 cacheSet(k, { config: cfg, at: Date.now() })\r\n setConfig(cfg)\r\n } catch (e: unknown) {\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n setError(e instanceof Error ? 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\nconst BN_CODE = \"MBJTechnolabs_SI_SPB\"\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 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 \"data-partner-attribution-id\": BN_CODE,\r\n }\r\n }, [config.client_id, config.currency, config.client_token, 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\"\r\n\r\nimport React from \"react\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\n\r\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\r\n if (config.currency_supported) return null\r\n\r\n return (\r\n <div role=\"alert\" style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\r\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\r\n <ul style={{ margin: 0, paddingLeft: 18 }}>\r\n {(config.currency_errors || []).map((e) => (\r\n <li key={e}>{e}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )\r\n}\r\n","\"use client\"\r\nimport React, { useCallback, useMemo, useState } from \"react\"\r\nimport { PayPalButtons, usePayPalScriptReducer } from \"@paypal/react-paypal-js\"\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\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 const [processing, setProcessing] = useState(false)\r\n const [buttonsReady, setButtonsReady] = useState(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n const handleInit = useCallback(() => {\r\n setButtonsReady(true)\r\n }, [])\r\n\r\n const showSpinner = isPending || (isResolved && !buttonsReady)\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 <div style={{ width: containerWidth, position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {processing && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#0070ba\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#0070ba\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #0070ba, #003087)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {showSpinner && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\r\n }}\r\n >\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading PayPal…\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isRejected && (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )}\r\n\r\n {config.environment === \"sandbox\" && buttonsReady && (\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 {isResolved && (\r\n <div style={buttonsReady ? undefined : { position: \"absolute\", left: -9999, opacity: 0, pointerEvents: \"none\" }}>\r\n <PayPalButtons\r\n forceReRender={[config.currency, config.intent, cartId]}\r\n onInit={handleInit}\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 if (processing) throw new Error(\"Payment already processing\")\r\n setError(null)\r\n setProcessing(true)\r\n try {\r\n const r = await api.createOrder(cartId)\r\n return r.id\r\n } catch (e: unknown) {\r\n setProcessing(false)\r\n throw e\r\n }\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setProcessing(true)\r\n showProcessingOverlay()\r\n setError(null)\r\n const orderId = String(data?.orderID || \"\")\r\n if (!orderId) throw new Error(\"PayPal order ID is missing from approval response\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) return\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n const msg = e instanceof Error ? e.message : \"Payment capture failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n setProcessing(false)\r\n }}\r\n onError={(err: Error | { message?: string }) => {\r\n hideProcessingOverlay()\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 </div>\r\n )}\r\n\r\n {error ? (\r\n <div\r\n role=\"alert\"\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","/**\r\n * Detect Next.js router errors (redirect / notFound) that must be re-thrown.\r\n *\r\n * Next.js implements redirect() and notFound() by throwing special errors with\r\n * a `digest` property starting with \"NEXT_REDIRECT\" or \"NEXT_NOT_FOUND\".\r\n * Catching these in user-land try/catch blocks prevents the navigation from\r\n * happening. Because this package can't import from `next` (it's a peer dep),\r\n * we detect them by duck-typing the digest.\r\n */\r\nexport function isNextRouterError(e: unknown): boolean {\r\n if (typeof e !== \"object\" || e === null || !(\"digest\" in e)) return false\r\n const digest = (e as { digest: unknown }).digest\r\n return (\r\n typeof digest === \"string\" &&\r\n (digest.startsWith(\"NEXT_REDIRECT\") || digest.startsWith(\"NEXT_NOT_FOUND\"))\r\n )\r\n}\r\n","const OVERLAY_ID = \"__pp_processing_overlay\"\r\n\r\nexport function showProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n if (document.getElementById(OVERLAY_ID)) return\r\n\r\n const overlay = document.createElement(\"div\")\r\n overlay.id = OVERLAY_ID\r\n overlay.setAttribute(\"role\", \"status\")\r\n overlay.setAttribute(\"aria-label\", \"Processing payment\")\r\n\r\n overlay.innerHTML = `\r\n <style>\r\n @keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n @keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n </style>\r\n <div style=\"position:relative;width:56px;height:56px\">\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid #e5e7eb\"></div>\r\n <div style=\"position:absolute;inset:0;border-radius:50%;border:3px solid transparent;border-top-color:#0070ba;animation:_pp_spin .8s linear infinite\"></div>\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#0070ba\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:24px;height:24px\">\r\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>\r\n </svg>\r\n </div>\r\n <div style=\"text-align:center\">\r\n <div style=\"font-size:18px;font-weight:600;color:#111827;letter-spacing:-0.01em\">Processing your payment</div>\r\n <div style=\"font-size:14px;color:#6b7280;margin-top:6px;line-height:1.5\">\r\n This may take a few moments. Please do not close<br>or refresh this page.\r\n </div>\r\n </div>\r\n <div style=\"width:200px;height:3px;background:#e5e7eb;border-radius:3px;overflow:hidden;margin-top:4px\">\r\n <div style=\"width:40%;height:100%;background:linear-gradient(90deg,#0070ba,#003087);border-radius:3px;animation:_pp_progress 1.5s ease-in-out infinite\"></div>\r\n </div>\r\n `\r\n\r\n Object.assign(overlay.style, {\r\n position: \"fixed\",\r\n inset: \"0\",\r\n zIndex: \"99999\",\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: \"20px\",\r\n fontFamily: \"-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif\",\r\n })\r\n\r\n document.body.appendChild(overlay)\r\n}\r\n\r\nexport function hideProcessingOverlay() {\r\n if (typeof document === \"undefined\") return\r\n document.getElementById(OVERLAY_ID)?.remove()\r\n}\r\n","\"use client\"\r\n\r\nimport React, { useMemo, useRef, useState } from \"react\"\r\nimport {\r\n PayPalCardFieldsProvider,\r\n PayPalNumberField,\r\n PayPalExpiryField,\r\n PayPalCVVField,\r\n usePayPalCardFields,\r\n usePayPalScriptReducer,\r\n} from \"@paypal/react-paypal-js\"\r\n\r\nimport { createPayPalStoreApi, markPaymentComplete } from \"../client/paypal\"\r\nimport type { PayPalConfig } from \"../client/types\"\r\nimport { isNextRouterError } from \"../utils/next-errors\"\r\nimport { showProcessingOverlay, hideProcessingOverlay } from \"../utils/processing-overlay\"\r\n\r\nconst SPIN_STYLE = `\r\n@keyframes _pp_spin { to { transform: rotate(360deg) } }\r\n@keyframes _pp_progress { 0% { transform: translateX(-100%) } 100% { transform: translateX(350%) } }\r\n`\r\n\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\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\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 aria-busy={disabled}\r\n onClick={() => {\r\n onSubmit()\r\n try {\r\n cardFieldsForm?.submit()\r\n } catch {\r\n // submit() error is handled by PayPalCardFieldsProvider onError\r\n }\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\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 const submittingRef = useRef(false)\r\n const creatingOrderRef = useRef(false)\r\n const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()\r\n\r\n if (!config.currency_supported) return null\r\n\r\n if (isRejected) {\r\n return (\r\n <div\r\n role=\"alert\"\r\n style={{\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>\r\n PayPal failed to load. Please refresh the page or try a different\r\n payment method.\r\n </span>\r\n </div>\r\n )\r\n }\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 if (isPending) {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Loading PayPal\"\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 10,\r\n padding: \"18px 16px\",\r\n background: \"#f9fafb\",\r\n border: \"1px solid #e5e7eb\",\r\n borderRadius: 8,\r\n minHeight: 55,\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 style={{ fontSize: 13, fontWeight: 500, color: \"#6b7280\" }}>\r\n Loading card fields…\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n if (!isResolved) return null\r\n\r\n return (\r\n <div style={{ position: \"relative\" }}>\r\n <style>{SPIN_STYLE}</style>\r\n\r\n {submitting && (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Processing payment\"\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 9999,\r\n background: \"rgba(255,255,255,0.96)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 20,\r\n }}\r\n >\r\n <div style={{ position: \"relative\", width: 56, height: 56 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid #e5e7eb\",\r\n }}\r\n />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n borderRadius: \"50%\",\r\n border: \"3px solid transparent\",\r\n borderTopColor: \"#2563eb\",\r\n animation: \"_pp_spin .8s linear infinite\",\r\n }}\r\n />\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"#2563eb\"\r\n strokeWidth=\"1.8\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n style={{\r\n position: \"absolute\",\r\n top: \"50%\",\r\n left: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n width: 24,\r\n height: 24,\r\n }}\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 </div>\r\n <div style={{ textAlign: \"center\" }}>\r\n <div style={{ fontSize: 18, fontWeight: 600, color: \"#111827\", letterSpacing: \"-0.01em\" }}>\r\n Processing your payment\r\n </div>\r\n <div style={{ fontSize: 14, color: \"#6b7280\", marginTop: 6, lineHeight: 1.5 }}>\r\n This may take a few moments. Please do not close<br />\r\n or refresh this page.\r\n </div>\r\n </div>\r\n <div\r\n style={{\r\n width: 200,\r\n height: 3,\r\n background: \"#e5e7eb\",\r\n borderRadius: 3,\r\n overflow: \"hidden\",\r\n marginTop: 4,\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"40%\",\r\n height: \"100%\",\r\n background: \"linear-gradient(90deg, #2563eb, #1d4ed8)\",\r\n borderRadius: 3,\r\n animation: \"_pp_progress 1.5s ease-in-out infinite\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n <PayPalCardFieldsProvider\r\n style={cardStyle}\r\n createOrder={async () => {\r\n if (creatingOrderRef.current) throw new Error(\"Payment already processing\")\r\n creatingOrderRef.current = true\r\n try {\r\n setError(null)\r\n const r = await api.createOrder(cartId, true)\r\n return r.id\r\n } catch (e) {\r\n creatingOrderRef.current = false\r\n throw e\r\n }\r\n }}\r\n onApprove={async (data: { orderID?: string }) => {\r\n try {\r\n setError(null)\r\n showProcessingOverlay()\r\n const orderId = String(data?.orderID || \"\")\r\n const result = await api.captureOrder(cartId, orderId)\r\n\r\n const completeResult = await markPaymentComplete(baseUrl, cartId, publishableApiKey)\r\n\r\n await onPaid?.({ ...result, ...completeResult })\r\n } catch (e: unknown) {\r\n if (isNextRouterError(e)) return\r\n hideProcessingOverlay()\r\n creatingOrderRef.current = false\r\n submittingRef.current = false\r\n setSubmitting(false)\r\n const msg = e instanceof Error ? e.message : \"Card payment failed\"\r\n setError(msg)\r\n onError?.(msg)\r\n }\r\n }}\r\n onCancel={() => {\r\n hideProcessingOverlay()\r\n creatingOrderRef.current = false\r\n submittingRef.current = false\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 hideProcessingOverlay()\r\n creatingOrderRef.current = false\r\n submittingRef.current = false\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 {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 <div>\r\n <label style={labelStyle}>Card number</label>\r\n <PayPalNumberField />\r\n </div>\r\n\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 <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 <SubmitButton\r\n disabled={submitting}\r\n label={submitting ? \"Processing…\" : \"Pay by Card\"}\r\n onSubmit={() => {\r\n if (submittingRef.current) return\r\n submittingRef.current = true\r\n setError(null)\r\n setSubmitting(true)\r\n showProcessingOverlay()\r\n }}\r\n />\r\n\r\n {error && (\r\n <div\r\n role=\"alert\"\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}\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\nconst SPIN_STYLE = `@keyframes _pp_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction PayPalLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction PayPalErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\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 const handlePaid = useCallback(\r\n async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await onSuccess?.(cartId)\r\n },\r\n [cartId, onPaid, onSuccess]\r\n )\r\n\r\n if (!shouldRender) return null\r\n\r\n if (loading) return <PayPalLoadingCard />\r\n\r\n if (error) return <PayPalErrorCard message={error} />\r\n\r\n if (!config) return null\r\n\r\n const isCardProvider = selectedProviderId === paypalCardProviderId\r\n if (config.paypal_enabled === false && !isCardProvider) return null\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\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\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\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\nconst SPIN_STYLE = `@keyframes _pp_section_spin { to { transform: rotate(360deg) } }`\r\n\r\nfunction SessionInitCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Setting up payment\"\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\nfunction ConfigLoadingCard() {\r\n return (\r\n <div\r\n role=\"status\"\r\n aria-label=\"Connecting to PayPal\"\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\nfunction ErrorCard({ message }: { message: string }) {\r\n return (\r\n <div\r\n role=\"alert\"\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 PayPalPaymentSectionProps = {\r\n cartId: string\r\n selectedProviderId: string | null | undefined\r\n baseUrl: string\r\n publishableApiKey?: string\r\n sessionLoading?: boolean\r\n onSuccess?: (cartId: string) => void\r\n onError?: (message: string) => void\r\n onPaid?: (result: unknown) => void\r\n}\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 async (captureResult: unknown) => {\r\n onPaid?.(captureResult)\r\n await 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\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 MAX_CACHE_ENTRIES = 50\r\nconst _cache = new Map<string, { result: Result; at: number }>()\r\nconst CACHE_TTL = 5 * 60 * 1000\r\n\r\nfunction cacheSet(key: string, value: { result: Result; at: number }) {\r\n if (_cache.size >= MAX_CACHE_ENTRIES) {\r\n const oldest = _cache.keys().next().value\r\n if (oldest !== undefined) _cache.delete(oldest)\r\n }\r\n _cache.set(key, value)\r\n}\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 cacheSet(k, { result: next, at: Date.now() })\r\n setResult(next)\r\n } catch (e: unknown) {\r\n const msg = e instanceof Error ? e.message : \"\"\r\n if (e instanceof Error && e.name === \"AbortError\") return\r\n if (!mounted || id !== fetchIdRef.current) return\r\n\r\n if (msg.includes(\"403\") || msg.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"],"mappings":"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","names":["useMemo","jsx","useMemo","useState","jsx","jsxs","useMemo","useState","useMemo","useRef","useState","usePayPalScriptReducer","jsx","jsxs","SPIN_STYLE","useMemo","useState","useRef","usePayPalScriptReducer","useCallback","jsx","jsxs","SPIN_STYLE","useCallback","useCallback","jsx","jsxs","SPIN_STYLE","useCallback","useEffect","useMemo","useRef","useState","MAX_CACHE_ENTRIES","_cache","CACHE_TTL","cacheSet","cacheKey","useMemo","useState","useRef","useEffect"]}
|
package/package.json
CHANGED
|
@@ -149,6 +149,7 @@ export function PayPalAdvancedCard(props: {
|
|
|
149
149
|
const [error, setError] = useState<string | null>(null)
|
|
150
150
|
const [submitting, setSubmitting] = useState(false)
|
|
151
151
|
const submittingRef = useRef(false)
|
|
152
|
+
const creatingOrderRef = useRef(false)
|
|
152
153
|
const [{ isPending, isResolved, isRejected }] = usePayPalScriptReducer()
|
|
153
154
|
|
|
154
155
|
if (!config.currency_supported) return null
|
|
@@ -329,10 +330,16 @@ export function PayPalAdvancedCard(props: {
|
|
|
329
330
|
<PayPalCardFieldsProvider
|
|
330
331
|
style={cardStyle}
|
|
331
332
|
createOrder={async () => {
|
|
332
|
-
if (
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
333
|
+
if (creatingOrderRef.current) throw new Error("Payment already processing")
|
|
334
|
+
creatingOrderRef.current = true
|
|
335
|
+
try {
|
|
336
|
+
setError(null)
|
|
337
|
+
const r = await api.createOrder(cartId, true)
|
|
338
|
+
return r.id
|
|
339
|
+
} catch (e) {
|
|
340
|
+
creatingOrderRef.current = false
|
|
341
|
+
throw e
|
|
342
|
+
}
|
|
336
343
|
}}
|
|
337
344
|
onApprove={async (data: { orderID?: string }) => {
|
|
338
345
|
try {
|
|
@@ -345,8 +352,9 @@ export function PayPalAdvancedCard(props: {
|
|
|
345
352
|
|
|
346
353
|
await onPaid?.({ ...result, ...completeResult })
|
|
347
354
|
} catch (e: unknown) {
|
|
348
|
-
if (isNextRouterError(e))
|
|
355
|
+
if (isNextRouterError(e)) return
|
|
349
356
|
hideProcessingOverlay()
|
|
357
|
+
creatingOrderRef.current = false
|
|
350
358
|
submittingRef.current = false
|
|
351
359
|
setSubmitting(false)
|
|
352
360
|
const msg = e instanceof Error ? e.message : "Card payment failed"
|
|
@@ -356,6 +364,7 @@ export function PayPalAdvancedCard(props: {
|
|
|
356
364
|
}}
|
|
357
365
|
onCancel={() => {
|
|
358
366
|
hideProcessingOverlay()
|
|
367
|
+
creatingOrderRef.current = false
|
|
359
368
|
submittingRef.current = false
|
|
360
369
|
setSubmitting(false)
|
|
361
370
|
}}
|
|
@@ -364,6 +373,7 @@ export function PayPalAdvancedCard(props: {
|
|
|
364
373
|
setError(msg)
|
|
365
374
|
onError?.(msg)
|
|
366
375
|
hideProcessingOverlay()
|
|
376
|
+
creatingOrderRef.current = false
|
|
367
377
|
submittingRef.current = false
|
|
368
378
|
setSubmitting(false)
|
|
369
379
|
}}
|
|
@@ -267,7 +267,7 @@ export function PayPalSmartButtons(props: {
|
|
|
267
267
|
|
|
268
268
|
await onPaid?.({ ...result, ...completeResult })
|
|
269
269
|
} catch (e: unknown) {
|
|
270
|
-
if (isNextRouterError(e))
|
|
270
|
+
if (isNextRouterError(e)) return
|
|
271
271
|
hideProcessingOverlay()
|
|
272
272
|
setProcessing(false)
|
|
273
273
|
const msg = e instanceof Error ? e.message : "Payment capture failed"
|