@easypayment/medusa-paypal-ui 0.0.3 → 1.0.5

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
@@ -201,11 +201,22 @@ function PayPalAdvancedCard(props) {
201
201
  }
202
202
  );
203
203
  }
204
+
205
+ // src/utils/normalize-provider-id.ts
206
+ function normalizeProviderId(id) {
207
+ if (!id) return id;
208
+ if (!id.startsWith("pp_")) return id;
209
+ if (id === "pp_paypal_paypal") return "paypal";
210
+ if (id === "pp_paypal_card_paypal_card") return "paypal_card";
211
+ const parts = id.split("_");
212
+ return parts.length >= 3 ? parts.slice(2).join("_") : id;
213
+ }
204
214
  function MedusaNextPayPalAdapter(props) {
205
215
  const { cartId, selectedProviderId, baseUrl, publishableApiKey, providerIds, onPaid } = props;
206
216
  const paypalProviderId = providerIds?.paypal || "paypal";
207
217
  const paypalCardProviderId = providerIds?.paypalCard || "paypal_card";
208
- const shouldRender = selectedProviderId === paypalProviderId || selectedProviderId === paypalCardProviderId;
218
+ const normalizedSelectedProviderId = normalizeProviderId(selectedProviderId ?? void 0);
219
+ const shouldRender = normalizedSelectedProviderId === paypalProviderId || normalizedSelectedProviderId === paypalCardProviderId;
209
220
  const { config, loading, error } = usePayPalConfig({ baseUrl, publishableApiKey, cartId });
210
221
  if (!shouldRender) return null;
211
222
  if (loading) return /* @__PURE__ */ jsxRuntime.jsx("div", { children: "Loading PayPal\u2026" });
@@ -213,7 +224,7 @@ function MedusaNextPayPalAdapter(props) {
213
224
  if (!config) return null;
214
225
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gap: 12 }, children: [
215
226
  /* @__PURE__ */ jsxRuntime.jsx(PayPalCurrencyNotice, { config }),
216
- /* @__PURE__ */ jsxRuntime.jsx(PayPalProvider, { config, intent: "capture", children: selectedProviderId === paypalCardProviderId ? /* @__PURE__ */ jsxRuntime.jsx(
227
+ /* @__PURE__ */ jsxRuntime.jsx(PayPalProvider, { config, intent: "capture", children: normalizedSelectedProviderId === paypalCardProviderId ? /* @__PURE__ */ jsxRuntime.jsx(
217
228
  PayPalAdvancedCard,
218
229
  {
219
230
  baseUrl,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/http.ts","../src/client/paypal.ts","../src/hooks/usePayPalConfig.ts","../src/components/PayPalProvider.tsx","../src/components/PayPalCurrencyNotice.tsx","../src/components/PayPalSmartButtons.tsx","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx"],"names":["useMemo","useState","useEffect","jsx","PayPalScriptProvider","jsxs","PayPalButtons","usePayPalCardFields","PayPalCardFieldsProvider","PayPalNameField","PayPalNumberField","PayPalExpiryField","PayPalCVVField"],"mappings":"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","file":"index.cjs","sourcesContent":["export type HttpOptions = {\n baseUrl: string\n publishableApiKey?: string\n}\n\nexport function createHttpClient(opts: HttpOptions) {\n const base = opts.baseUrl.replace(/\\/+$/, \"\")\n\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${base}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...(init?.headers as any),\n }\n\n if (opts.publishableApiKey) {\n headers[\"x-publishable-api-key\"] = opts.publishableApiKey\n }\n\n const res = await fetch(url, { ...init, headers, credentials: \"include\" })\n const text = await res.text().catch(() => \"\")\n\n if (!res.ok) {\n throw new Error(text || `Request failed (${res.status})`)\n }\n\n return (text ? JSON.parse(text) : {}) as T\n }\n\n return { request }\n}\n","import type { PayPalConfig, PayPalSettingsResponse } from \"./types\"\nimport { createHttpClient, type HttpOptions } from \"./http\"\n\nexport function createPayPalStoreApi(opts: HttpOptions) {\n const http = createHttpClient(opts)\n\n return {\n getConfig(cartId?: string) {\n const q = cartId ? `?cart_id=${encodeURIComponent(cartId)}` : \"\"\n return http.request<PayPalConfig>(`/store/paypal/config${q}`)\n },\n\n getSettings() {\n return http.request<PayPalSettingsResponse>(`/store/paypal/settings`)\n },\n\n createOrder(cartId: string) {\n return http.request<{ id: string }>(`/store/paypal/create-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId }),\n })\n },\n\n captureOrder(cartId: string, orderId: string) {\n return http.request<any>(`/store/paypal/capture-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId, order_id: orderId }),\n })\n },\n }\n}\n","import { useEffect, useMemo, useState } from \"react\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\ntype Args = {\n baseUrl: string\n publishableApiKey?: string\n cartId?: string\n}\n\nexport function usePayPalConfig({ baseUrl, publishableApiKey, cartId }: Args) {\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [config, setConfig] = useState<PayPalConfig | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let mounted = true\n ;(async () => {\n try {\n setLoading(true)\n setError(null)\n const cfg = await api.getConfig(cartId)\n if (mounted) setConfig(cfg)\n } catch (e: any) {\n if (mounted) setError(e?.message || \"Failed to load PayPal config\")\n } finally {\n if (mounted) setLoading(false)\n }\n })()\n\n return () => {\n mounted = false\n }\n }, [api, cartId])\n\n return { config, loading, error }\n}\n","\"use client\"\n\nimport React, { useMemo } from \"react\"\nimport { PayPalScriptProvider } from \"@paypal/react-paypal-js\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalProvider(props: {\n config: PayPalConfig\n intent?: \"capture\" | \"authorize\"\n children: React.ReactNode\n}) {\n const { config, intent = \"capture\", children } = props\n\n const options = useMemo(() => {\n return {\n \"client-id\": config.client_id,\n currency: config.currency,\n intent,\n components: config.client_token ? \"buttons,card-fields\" : \"buttons\",\n \"data-client-token\": config.client_token || undefined,\n } as any\n }, [config, intent])\n\n return <PayPalScriptProvider options={options}>{children}</PayPalScriptProvider>\n}\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\n if (config.currency_supported) return null\n\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {(config.currency_errors || []).map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport { PayPalButtons } from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalSmartButtons(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n\n if (!config.currency_supported) return null\n\n return (\n <div>\n <PayPalButtons\n style={{ layout: \"vertical\" }}\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n }}\n onError={(err: any) => {\n const msg = err?.message || \"PayPal error\"\n setError(msg)\n onError?.(msg)\n }}\n />\n {error ? <div style={{ marginTop: 10, color: \"crimson\" }}>{error}</div> : null}\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport {\n PayPalCardFieldsProvider,\n PayPalNameField,\n PayPalNumberField,\n PayPalExpiryField,\n PayPalCVVField,\n usePayPalCardFields,\n} from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nfunction SubmitButton({ disabled, label }: { disabled: boolean; label: string }) {\n const { cardFieldsForm } = usePayPalCardFields()\n\n return (\n <button\n type=\"button\"\n disabled={disabled || !cardFieldsForm}\n onClick={() => cardFieldsForm?.submit()}\n style={{ padding: \"10px 12px\", borderRadius: 10, border: \"1px solid #ddd\" }}\n >\n {label}\n </button>\n )\n}\n\nexport function PayPalAdvancedCard(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n const [submitting, setSubmitting] = useState(false)\n\n if (!config.currency_supported) return null\n\n if (!config.client_token) {\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n CardFields unavailable: missing client_token from backend.\n </div>\n )\n }\n\n return (\n <PayPalCardFieldsProvider\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n try {\n setSubmitting(true)\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n } catch (e: any) {\n const msg = e?.message || \"Card payment failed\"\n setError(msg)\n onError?.(msg)\n } finally {\n setSubmitting(false)\n }\n }}\n onError={(e: any) => {\n const msg = e?.message || \"CardFields error\"\n setError(msg)\n onError?.(msg)\n }}\n >\n <div style={{ display: \"grid\", gap: 10 }}>\n <PayPalNameField />\n <PayPalNumberField />\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 10 }}>\n <PayPalExpiryField />\n <PayPalCVVField />\n </div>\n\n <SubmitButton disabled={submitting} label={submitting ? \"Processing...\" : \"Pay by Card\"} />\n\n {error ? <div style={{ color: \"crimson\" }}>{error}</div> : null}\n </div>\n </PayPalCardFieldsProvider>\n )\n}\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\nimport { usePayPalConfig } from \"../hooks/usePayPalConfig\"\nimport { PayPalProvider } from \"../components/PayPalProvider\"\nimport { PayPalCurrencyNotice } from \"../components/PayPalCurrencyNotice\"\nimport { PayPalSmartButtons } from \"../components/PayPalSmartButtons\"\nimport { PayPalAdvancedCard } from \"../components/PayPalAdvancedCard\"\n\nexport type MedusaNextPayPalAdapterProps = {\n cartId: string\n selectedProviderId: string | null | undefined\n baseUrl: string\n publishableApiKey?: string\n providerIds?: {\n paypal?: string\n paypalCard?: string\n }\n onPaid?: (result: any) => void\n}\n\nexport function MedusaNextPayPalAdapter(props: MedusaNextPayPalAdapterProps) {\n const { cartId, selectedProviderId, baseUrl, publishableApiKey, providerIds, onPaid } = props\n\n const paypalProviderId = providerIds?.paypal || \"paypal\"\n const paypalCardProviderId = providerIds?.paypalCard || \"paypal_card\"\n\n const shouldRender =\n selectedProviderId === paypalProviderId || selectedProviderId === paypalCardProviderId\n\n const { config, loading, error } = usePayPalConfig({ baseUrl, publishableApiKey, cartId })\n\n if (!shouldRender) return null\n if (loading) return <div>Loading PayPal…</div>\n if (error) return <div style={{ color: \"crimson\" }}>{error}</div>\n if (!config) return null\n\n return (\n <div style={{ display: \"grid\", gap: 12 }}>\n <PayPalCurrencyNotice config={config as PayPalConfig} />\n\n <PayPalProvider config={config as PayPalConfig} intent=\"capture\">\n {selectedProviderId === paypalCardProviderId ? (\n <PayPalAdvancedCard\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n ) : (\n <PayPalSmartButtons\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n )}\n </PayPalProvider>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/client/http.ts","../src/client/paypal.ts","../src/hooks/usePayPalConfig.ts","../src/components/PayPalProvider.tsx","../src/components/PayPalCurrencyNotice.tsx","../src/components/PayPalSmartButtons.tsx","../src/components/PayPalAdvancedCard.tsx","../src/utils/normalize-provider-id.ts","../src/adapters/MedusaNextPayPalAdapter.tsx"],"names":["useMemo","useState","useEffect","jsx","PayPalScriptProvider","jsxs","PayPalButtons","usePayPalCardFields","PayPalCardFieldsProvider","PayPalNameField","PayPalNumberField","PayPalExpiryField","PayPalCVVField"],"mappings":"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","file":"index.cjs","sourcesContent":["export type HttpOptions = {\n baseUrl: string\n publishableApiKey?: string\n}\n\nexport function createHttpClient(opts: HttpOptions) {\n const base = opts.baseUrl.replace(/\\/+$/, \"\")\n\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${base}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...(init?.headers as any),\n }\n\n if (opts.publishableApiKey) {\n headers[\"x-publishable-api-key\"] = opts.publishableApiKey\n }\n\n const res = await fetch(url, { ...init, headers, credentials: \"include\" })\n const text = await res.text().catch(() => \"\")\n\n if (!res.ok) {\n throw new Error(text || `Request failed (${res.status})`)\n }\n\n return (text ? JSON.parse(text) : {}) as T\n }\n\n return { request }\n}\n","import type { PayPalConfig, PayPalSettingsResponse } from \"./types\"\nimport { createHttpClient, type HttpOptions } from \"./http\"\n\nexport function createPayPalStoreApi(opts: HttpOptions) {\n const http = createHttpClient(opts)\n\n return {\n getConfig(cartId?: string) {\n const q = cartId ? `?cart_id=${encodeURIComponent(cartId)}` : \"\"\n return http.request<PayPalConfig>(`/store/paypal/config${q}`)\n },\n\n getSettings() {\n return http.request<PayPalSettingsResponse>(`/store/paypal/settings`)\n },\n\n createOrder(cartId: string) {\n return http.request<{ id: string }>(`/store/paypal/create-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId }),\n })\n },\n\n captureOrder(cartId: string, orderId: string) {\n return http.request<any>(`/store/paypal/capture-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId, order_id: orderId }),\n })\n },\n }\n}\n","import { useEffect, useMemo, useState } from \"react\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\ntype Args = {\n baseUrl: string\n publishableApiKey?: string\n cartId?: string\n}\n\nexport function usePayPalConfig({ baseUrl, publishableApiKey, cartId }: Args) {\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [config, setConfig] = useState<PayPalConfig | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let mounted = true\n ;(async () => {\n try {\n setLoading(true)\n setError(null)\n const cfg = await api.getConfig(cartId)\n if (mounted) setConfig(cfg)\n } catch (e: any) {\n if (mounted) setError(e?.message || \"Failed to load PayPal config\")\n } finally {\n if (mounted) setLoading(false)\n }\n })()\n\n return () => {\n mounted = false\n }\n }, [api, cartId])\n\n return { config, loading, error }\n}\n","\"use client\"\n\nimport React, { useMemo } from \"react\"\nimport { PayPalScriptProvider } from \"@paypal/react-paypal-js\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalProvider(props: {\n config: PayPalConfig\n intent?: \"capture\" | \"authorize\"\n children: React.ReactNode\n}) {\n const { config, intent = \"capture\", children } = props\n\n const options = useMemo(() => {\n return {\n \"client-id\": config.client_id,\n currency: config.currency,\n intent,\n components: config.client_token ? \"buttons,card-fields\" : \"buttons\",\n \"data-client-token\": config.client_token || undefined,\n } as any\n }, [config, intent])\n\n return <PayPalScriptProvider options={options}>{children}</PayPalScriptProvider>\n}\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\n if (config.currency_supported) return null\n\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {(config.currency_errors || []).map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport { PayPalButtons } from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalSmartButtons(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n\n if (!config.currency_supported) return null\n\n return (\n <div>\n <PayPalButtons\n style={{ layout: \"vertical\" }}\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n }}\n onError={(err: any) => {\n const msg = err?.message || \"PayPal error\"\n setError(msg)\n onError?.(msg)\n }}\n />\n {error ? <div style={{ marginTop: 10, color: \"crimson\" }}>{error}</div> : null}\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport {\n PayPalCardFieldsProvider,\n PayPalNameField,\n PayPalNumberField,\n PayPalExpiryField,\n PayPalCVVField,\n usePayPalCardFields,\n} from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nfunction SubmitButton({ disabled, label }: { disabled: boolean; label: string }) {\n const { cardFieldsForm } = usePayPalCardFields()\n\n return (\n <button\n type=\"button\"\n disabled={disabled || !cardFieldsForm}\n onClick={() => cardFieldsForm?.submit()}\n style={{ padding: \"10px 12px\", borderRadius: 10, border: \"1px solid #ddd\" }}\n >\n {label}\n </button>\n )\n}\n\nexport function PayPalAdvancedCard(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n const [submitting, setSubmitting] = useState(false)\n\n if (!config.currency_supported) return null\n\n if (!config.client_token) {\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n CardFields unavailable: missing client_token from backend.\n </div>\n )\n }\n\n return (\n <PayPalCardFieldsProvider\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n try {\n setSubmitting(true)\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n } catch (e: any) {\n const msg = e?.message || \"Card payment failed\"\n setError(msg)\n onError?.(msg)\n } finally {\n setSubmitting(false)\n }\n }}\n onError={(e: any) => {\n const msg = e?.message || \"CardFields error\"\n setError(msg)\n onError?.(msg)\n }}\n >\n <div style={{ display: \"grid\", gap: 10 }}>\n <PayPalNameField />\n <PayPalNumberField />\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 10 }}>\n <PayPalExpiryField />\n <PayPalCVVField />\n </div>\n\n <SubmitButton disabled={submitting} label={submitting ? \"Processing...\" : \"Pay by Card\"} />\n\n {error ? <div style={{ color: \"crimson\" }}>{error}</div> : null}\n </div>\n </PayPalCardFieldsProvider>\n )\n}\n","export function normalizeProviderId(id?: string) {\n if (!id) return id\n\n if (!id.startsWith(\"pp_\")) return id\n\n if (id === \"pp_paypal_paypal\") return \"paypal\"\n if (id === \"pp_paypal_card_paypal_card\") return \"paypal_card\"\n\n const parts = id.split(\"_\")\n return parts.length >= 3 ? parts.slice(2).join(\"_\") : id\n}","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\nimport { usePayPalConfig } from \"../hooks/usePayPalConfig\"\nimport { PayPalProvider } from \"../components/PayPalProvider\"\nimport { PayPalCurrencyNotice } from \"../components/PayPalCurrencyNotice\"\nimport { PayPalSmartButtons } from \"../components/PayPalSmartButtons\"\nimport { PayPalAdvancedCard } from \"../components/PayPalAdvancedCard\"\nimport { normalizeProviderId } from \"../utils/normalize-provider-id\"\n\nexport type MedusaNextPayPalAdapterProps = {\n cartId: string\n selectedProviderId: string | null | undefined\n baseUrl: string\n publishableApiKey?: string\n providerIds?: {\n paypal?: string\n paypalCard?: string\n }\n onPaid?: (result: any) => void\n}\n\nexport function MedusaNextPayPalAdapter(props: MedusaNextPayPalAdapterProps) {\n const { cartId, selectedProviderId, baseUrl, publishableApiKey, providerIds, onPaid } = props\n\n const paypalProviderId = providerIds?.paypal || \"paypal\"\n const paypalCardProviderId = providerIds?.paypalCard || \"paypal_card\"\n\n const normalizedSelectedProviderId = normalizeProviderId(selectedProviderId ?? undefined)\n\n const shouldRender =\n normalizedSelectedProviderId === paypalProviderId ||\n normalizedSelectedProviderId === paypalCardProviderId\n\n const { config, loading, error } = usePayPalConfig({ baseUrl, publishableApiKey, cartId })\n\n if (!shouldRender) return null\n if (loading) return <div>Loading PayPal…</div>\n if (error) return <div style={{ color: \"crimson\" }}>{error}</div>\n if (!config) return null\n\n return (\n <div style={{ display: \"grid\", gap: 12 }}>\n <PayPalCurrencyNotice config={config as PayPalConfig} />\n\n <PayPalProvider config={config as PayPalConfig} intent=\"capture\">\n {normalizedSelectedProviderId === paypalCardProviderId ? (\n <PayPalAdvancedCard\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n ) : (\n <PayPalSmartButtons\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n )}\n </PayPalProvider>\n </div>\n )\n}\n"]}
package/dist/index.mjs CHANGED
@@ -199,11 +199,22 @@ function PayPalAdvancedCard(props) {
199
199
  }
200
200
  );
201
201
  }
202
+
203
+ // src/utils/normalize-provider-id.ts
204
+ function normalizeProviderId(id) {
205
+ if (!id) return id;
206
+ if (!id.startsWith("pp_")) return id;
207
+ if (id === "pp_paypal_paypal") return "paypal";
208
+ if (id === "pp_paypal_card_paypal_card") return "paypal_card";
209
+ const parts = id.split("_");
210
+ return parts.length >= 3 ? parts.slice(2).join("_") : id;
211
+ }
202
212
  function MedusaNextPayPalAdapter(props) {
203
213
  const { cartId, selectedProviderId, baseUrl, publishableApiKey, providerIds, onPaid } = props;
204
214
  const paypalProviderId = providerIds?.paypal || "paypal";
205
215
  const paypalCardProviderId = providerIds?.paypalCard || "paypal_card";
206
- const shouldRender = selectedProviderId === paypalProviderId || selectedProviderId === paypalCardProviderId;
216
+ const normalizedSelectedProviderId = normalizeProviderId(selectedProviderId ?? void 0);
217
+ const shouldRender = normalizedSelectedProviderId === paypalProviderId || normalizedSelectedProviderId === paypalCardProviderId;
207
218
  const { config, loading, error } = usePayPalConfig({ baseUrl, publishableApiKey, cartId });
208
219
  if (!shouldRender) return null;
209
220
  if (loading) return /* @__PURE__ */ jsx("div", { children: "Loading PayPal\u2026" });
@@ -211,7 +222,7 @@ function MedusaNextPayPalAdapter(props) {
211
222
  if (!config) return null;
212
223
  return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 12 }, children: [
213
224
  /* @__PURE__ */ jsx(PayPalCurrencyNotice, { config }),
214
- /* @__PURE__ */ jsx(PayPalProvider, { config, intent: "capture", children: selectedProviderId === paypalCardProviderId ? /* @__PURE__ */ jsx(
225
+ /* @__PURE__ */ jsx(PayPalProvider, { config, intent: "capture", children: normalizedSelectedProviderId === paypalCardProviderId ? /* @__PURE__ */ jsx(
215
226
  PayPalAdvancedCard,
216
227
  {
217
228
  baseUrl,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/http.ts","../src/client/paypal.ts","../src/hooks/usePayPalConfig.ts","../src/components/PayPalProvider.tsx","../src/components/PayPalCurrencyNotice.tsx","../src/components/PayPalSmartButtons.tsx","../src/components/PayPalAdvancedCard.tsx","../src/adapters/MedusaNextPayPalAdapter.tsx"],"names":["useMemo","jsx","useState","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["export type HttpOptions = {\n baseUrl: string\n publishableApiKey?: string\n}\n\nexport function createHttpClient(opts: HttpOptions) {\n const base = opts.baseUrl.replace(/\\/+$/, \"\")\n\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${base}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...(init?.headers as any),\n }\n\n if (opts.publishableApiKey) {\n headers[\"x-publishable-api-key\"] = opts.publishableApiKey\n }\n\n const res = await fetch(url, { ...init, headers, credentials: \"include\" })\n const text = await res.text().catch(() => \"\")\n\n if (!res.ok) {\n throw new Error(text || `Request failed (${res.status})`)\n }\n\n return (text ? JSON.parse(text) : {}) as T\n }\n\n return { request }\n}\n","import type { PayPalConfig, PayPalSettingsResponse } from \"./types\"\nimport { createHttpClient, type HttpOptions } from \"./http\"\n\nexport function createPayPalStoreApi(opts: HttpOptions) {\n const http = createHttpClient(opts)\n\n return {\n getConfig(cartId?: string) {\n const q = cartId ? `?cart_id=${encodeURIComponent(cartId)}` : \"\"\n return http.request<PayPalConfig>(`/store/paypal/config${q}`)\n },\n\n getSettings() {\n return http.request<PayPalSettingsResponse>(`/store/paypal/settings`)\n },\n\n createOrder(cartId: string) {\n return http.request<{ id: string }>(`/store/paypal/create-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId }),\n })\n },\n\n captureOrder(cartId: string, orderId: string) {\n return http.request<any>(`/store/paypal/capture-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId, order_id: orderId }),\n })\n },\n }\n}\n","import { useEffect, useMemo, useState } from \"react\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\ntype Args = {\n baseUrl: string\n publishableApiKey?: string\n cartId?: string\n}\n\nexport function usePayPalConfig({ baseUrl, publishableApiKey, cartId }: Args) {\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [config, setConfig] = useState<PayPalConfig | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let mounted = true\n ;(async () => {\n try {\n setLoading(true)\n setError(null)\n const cfg = await api.getConfig(cartId)\n if (mounted) setConfig(cfg)\n } catch (e: any) {\n if (mounted) setError(e?.message || \"Failed to load PayPal config\")\n } finally {\n if (mounted) setLoading(false)\n }\n })()\n\n return () => {\n mounted = false\n }\n }, [api, cartId])\n\n return { config, loading, error }\n}\n","\"use client\"\n\nimport React, { useMemo } from \"react\"\nimport { PayPalScriptProvider } from \"@paypal/react-paypal-js\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalProvider(props: {\n config: PayPalConfig\n intent?: \"capture\" | \"authorize\"\n children: React.ReactNode\n}) {\n const { config, intent = \"capture\", children } = props\n\n const options = useMemo(() => {\n return {\n \"client-id\": config.client_id,\n currency: config.currency,\n intent,\n components: config.client_token ? \"buttons,card-fields\" : \"buttons\",\n \"data-client-token\": config.client_token || undefined,\n } as any\n }, [config, intent])\n\n return <PayPalScriptProvider options={options}>{children}</PayPalScriptProvider>\n}\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\n if (config.currency_supported) return null\n\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {(config.currency_errors || []).map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport { PayPalButtons } from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalSmartButtons(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n\n if (!config.currency_supported) return null\n\n return (\n <div>\n <PayPalButtons\n style={{ layout: \"vertical\" }}\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n }}\n onError={(err: any) => {\n const msg = err?.message || \"PayPal error\"\n setError(msg)\n onError?.(msg)\n }}\n />\n {error ? <div style={{ marginTop: 10, color: \"crimson\" }}>{error}</div> : null}\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport {\n PayPalCardFieldsProvider,\n PayPalNameField,\n PayPalNumberField,\n PayPalExpiryField,\n PayPalCVVField,\n usePayPalCardFields,\n} from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nfunction SubmitButton({ disabled, label }: { disabled: boolean; label: string }) {\n const { cardFieldsForm } = usePayPalCardFields()\n\n return (\n <button\n type=\"button\"\n disabled={disabled || !cardFieldsForm}\n onClick={() => cardFieldsForm?.submit()}\n style={{ padding: \"10px 12px\", borderRadius: 10, border: \"1px solid #ddd\" }}\n >\n {label}\n </button>\n )\n}\n\nexport function PayPalAdvancedCard(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n const [submitting, setSubmitting] = useState(false)\n\n if (!config.currency_supported) return null\n\n if (!config.client_token) {\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n CardFields unavailable: missing client_token from backend.\n </div>\n )\n }\n\n return (\n <PayPalCardFieldsProvider\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n try {\n setSubmitting(true)\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n } catch (e: any) {\n const msg = e?.message || \"Card payment failed\"\n setError(msg)\n onError?.(msg)\n } finally {\n setSubmitting(false)\n }\n }}\n onError={(e: any) => {\n const msg = e?.message || \"CardFields error\"\n setError(msg)\n onError?.(msg)\n }}\n >\n <div style={{ display: \"grid\", gap: 10 }}>\n <PayPalNameField />\n <PayPalNumberField />\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 10 }}>\n <PayPalExpiryField />\n <PayPalCVVField />\n </div>\n\n <SubmitButton disabled={submitting} label={submitting ? \"Processing...\" : \"Pay by Card\"} />\n\n {error ? <div style={{ color: \"crimson\" }}>{error}</div> : null}\n </div>\n </PayPalCardFieldsProvider>\n )\n}\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\nimport { usePayPalConfig } from \"../hooks/usePayPalConfig\"\nimport { PayPalProvider } from \"../components/PayPalProvider\"\nimport { PayPalCurrencyNotice } from \"../components/PayPalCurrencyNotice\"\nimport { PayPalSmartButtons } from \"../components/PayPalSmartButtons\"\nimport { PayPalAdvancedCard } from \"../components/PayPalAdvancedCard\"\n\nexport type MedusaNextPayPalAdapterProps = {\n cartId: string\n selectedProviderId: string | null | undefined\n baseUrl: string\n publishableApiKey?: string\n providerIds?: {\n paypal?: string\n paypalCard?: string\n }\n onPaid?: (result: any) => void\n}\n\nexport function MedusaNextPayPalAdapter(props: MedusaNextPayPalAdapterProps) {\n const { cartId, selectedProviderId, baseUrl, publishableApiKey, providerIds, onPaid } = props\n\n const paypalProviderId = providerIds?.paypal || \"paypal\"\n const paypalCardProviderId = providerIds?.paypalCard || \"paypal_card\"\n\n const shouldRender =\n selectedProviderId === paypalProviderId || selectedProviderId === paypalCardProviderId\n\n const { config, loading, error } = usePayPalConfig({ baseUrl, publishableApiKey, cartId })\n\n if (!shouldRender) return null\n if (loading) return <div>Loading PayPal…</div>\n if (error) return <div style={{ color: \"crimson\" }}>{error}</div>\n if (!config) return null\n\n return (\n <div style={{ display: \"grid\", gap: 12 }}>\n <PayPalCurrencyNotice config={config as PayPalConfig} />\n\n <PayPalProvider config={config as PayPalConfig} intent=\"capture\">\n {selectedProviderId === paypalCardProviderId ? (\n <PayPalAdvancedCard\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n ) : (\n <PayPalSmartButtons\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n )}\n </PayPalProvider>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/client/http.ts","../src/client/paypal.ts","../src/hooks/usePayPalConfig.ts","../src/components/PayPalProvider.tsx","../src/components/PayPalCurrencyNotice.tsx","../src/components/PayPalSmartButtons.tsx","../src/components/PayPalAdvancedCard.tsx","../src/utils/normalize-provider-id.ts","../src/adapters/MedusaNextPayPalAdapter.tsx"],"names":["useMemo","jsx","useState","jsxs"],"mappings":"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","file":"index.mjs","sourcesContent":["export type HttpOptions = {\n baseUrl: string\n publishableApiKey?: string\n}\n\nexport function createHttpClient(opts: HttpOptions) {\n const base = opts.baseUrl.replace(/\\/+$/, \"\")\n\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${base}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...(init?.headers as any),\n }\n\n if (opts.publishableApiKey) {\n headers[\"x-publishable-api-key\"] = opts.publishableApiKey\n }\n\n const res = await fetch(url, { ...init, headers, credentials: \"include\" })\n const text = await res.text().catch(() => \"\")\n\n if (!res.ok) {\n throw new Error(text || `Request failed (${res.status})`)\n }\n\n return (text ? JSON.parse(text) : {}) as T\n }\n\n return { request }\n}\n","import type { PayPalConfig, PayPalSettingsResponse } from \"./types\"\nimport { createHttpClient, type HttpOptions } from \"./http\"\n\nexport function createPayPalStoreApi(opts: HttpOptions) {\n const http = createHttpClient(opts)\n\n return {\n getConfig(cartId?: string) {\n const q = cartId ? `?cart_id=${encodeURIComponent(cartId)}` : \"\"\n return http.request<PayPalConfig>(`/store/paypal/config${q}`)\n },\n\n getSettings() {\n return http.request<PayPalSettingsResponse>(`/store/paypal/settings`)\n },\n\n createOrder(cartId: string) {\n return http.request<{ id: string }>(`/store/paypal/create-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId }),\n })\n },\n\n captureOrder(cartId: string, orderId: string) {\n return http.request<any>(`/store/paypal/capture-order`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ cart_id: cartId, order_id: orderId }),\n })\n },\n }\n}\n","import { useEffect, useMemo, useState } from \"react\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\ntype Args = {\n baseUrl: string\n publishableApiKey?: string\n cartId?: string\n}\n\nexport function usePayPalConfig({ baseUrl, publishableApiKey, cartId }: Args) {\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [config, setConfig] = useState<PayPalConfig | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let mounted = true\n ;(async () => {\n try {\n setLoading(true)\n setError(null)\n const cfg = await api.getConfig(cartId)\n if (mounted) setConfig(cfg)\n } catch (e: any) {\n if (mounted) setError(e?.message || \"Failed to load PayPal config\")\n } finally {\n if (mounted) setLoading(false)\n }\n })()\n\n return () => {\n mounted = false\n }\n }, [api, cartId])\n\n return { config, loading, error }\n}\n","\"use client\"\n\nimport React, { useMemo } from \"react\"\nimport { PayPalScriptProvider } from \"@paypal/react-paypal-js\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalProvider(props: {\n config: PayPalConfig\n intent?: \"capture\" | \"authorize\"\n children: React.ReactNode\n}) {\n const { config, intent = \"capture\", children } = props\n\n const options = useMemo(() => {\n return {\n \"client-id\": config.client_id,\n currency: config.currency,\n intent,\n components: config.client_token ? \"buttons,card-fields\" : \"buttons\",\n \"data-client-token\": config.client_token || undefined,\n } as any\n }, [config, intent])\n\n return <PayPalScriptProvider options={options}>{children}</PayPalScriptProvider>\n}\n","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalCurrencyNotice({ config }: { config: PayPalConfig }) {\n if (config.currency_supported) return null\n\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n <div style={{ fontWeight: 600, marginBottom: 6 }}>PayPal currency issue</div>\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {(config.currency_errors || []).map((e, i) => (\n <li key={i}>{e}</li>\n ))}\n </ul>\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport { PayPalButtons } from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nexport function PayPalSmartButtons(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n\n if (!config.currency_supported) return null\n\n return (\n <div>\n <PayPalButtons\n style={{ layout: \"vertical\" }}\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n }}\n onError={(err: any) => {\n const msg = err?.message || \"PayPal error\"\n setError(msg)\n onError?.(msg)\n }}\n />\n {error ? <div style={{ marginTop: 10, color: \"crimson\" }}>{error}</div> : null}\n </div>\n )\n}\n","\"use client\"\n\nimport React, { useMemo, useState } from \"react\"\nimport {\n PayPalCardFieldsProvider,\n PayPalNameField,\n PayPalNumberField,\n PayPalExpiryField,\n PayPalCVVField,\n usePayPalCardFields,\n} from \"@paypal/react-paypal-js\"\nimport { createPayPalStoreApi } from \"../client/paypal\"\nimport type { PayPalConfig } from \"../client/types\"\n\nfunction SubmitButton({ disabled, label }: { disabled: boolean; label: string }) {\n const { cardFieldsForm } = usePayPalCardFields()\n\n return (\n <button\n type=\"button\"\n disabled={disabled || !cardFieldsForm}\n onClick={() => cardFieldsForm?.submit()}\n style={{ padding: \"10px 12px\", borderRadius: 10, border: \"1px solid #ddd\" }}\n >\n {label}\n </button>\n )\n}\n\nexport function PayPalAdvancedCard(props: {\n baseUrl: string\n publishableApiKey?: string\n cartId: string\n config: PayPalConfig\n onPaid?: (result: any) => void\n onError?: (message: string) => void\n}) {\n const { baseUrl, publishableApiKey, cartId, config, onPaid, onError } = props\n const api = useMemo(\n () => createPayPalStoreApi({ baseUrl, publishableApiKey }),\n [baseUrl, publishableApiKey]\n )\n\n const [error, setError] = useState<string | null>(null)\n const [submitting, setSubmitting] = useState(false)\n\n if (!config.currency_supported) return null\n\n if (!config.client_token) {\n return (\n <div style={{ padding: 12, border: \"1px solid #ddd\", borderRadius: 10 }}>\n CardFields unavailable: missing client_token from backend.\n </div>\n )\n }\n\n return (\n <PayPalCardFieldsProvider\n createOrder={async () => {\n setError(null)\n const r = await api.createOrder(cartId)\n return r.id\n }}\n onApprove={async (data: any) => {\n try {\n setSubmitting(true)\n setError(null)\n const orderId = String(data?.orderID || \"\")\n const result = await api.captureOrder(cartId, orderId)\n onPaid?.(result)\n } catch (e: any) {\n const msg = e?.message || \"Card payment failed\"\n setError(msg)\n onError?.(msg)\n } finally {\n setSubmitting(false)\n }\n }}\n onError={(e: any) => {\n const msg = e?.message || \"CardFields error\"\n setError(msg)\n onError?.(msg)\n }}\n >\n <div style={{ display: \"grid\", gap: 10 }}>\n <PayPalNameField />\n <PayPalNumberField />\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 10 }}>\n <PayPalExpiryField />\n <PayPalCVVField />\n </div>\n\n <SubmitButton disabled={submitting} label={submitting ? \"Processing...\" : \"Pay by Card\"} />\n\n {error ? <div style={{ color: \"crimson\" }}>{error}</div> : null}\n </div>\n </PayPalCardFieldsProvider>\n )\n}\n","export function normalizeProviderId(id?: string) {\n if (!id) return id\n\n if (!id.startsWith(\"pp_\")) return id\n\n if (id === \"pp_paypal_paypal\") return \"paypal\"\n if (id === \"pp_paypal_card_paypal_card\") return \"paypal_card\"\n\n const parts = id.split(\"_\")\n return parts.length >= 3 ? parts.slice(2).join(\"_\") : id\n}","\"use client\"\n\nimport React from \"react\"\nimport type { PayPalConfig } from \"../client/types\"\nimport { usePayPalConfig } from \"../hooks/usePayPalConfig\"\nimport { PayPalProvider } from \"../components/PayPalProvider\"\nimport { PayPalCurrencyNotice } from \"../components/PayPalCurrencyNotice\"\nimport { PayPalSmartButtons } from \"../components/PayPalSmartButtons\"\nimport { PayPalAdvancedCard } from \"../components/PayPalAdvancedCard\"\nimport { normalizeProviderId } from \"../utils/normalize-provider-id\"\n\nexport type MedusaNextPayPalAdapterProps = {\n cartId: string\n selectedProviderId: string | null | undefined\n baseUrl: string\n publishableApiKey?: string\n providerIds?: {\n paypal?: string\n paypalCard?: string\n }\n onPaid?: (result: any) => void\n}\n\nexport function MedusaNextPayPalAdapter(props: MedusaNextPayPalAdapterProps) {\n const { cartId, selectedProviderId, baseUrl, publishableApiKey, providerIds, onPaid } = props\n\n const paypalProviderId = providerIds?.paypal || \"paypal\"\n const paypalCardProviderId = providerIds?.paypalCard || \"paypal_card\"\n\n const normalizedSelectedProviderId = normalizeProviderId(selectedProviderId ?? undefined)\n\n const shouldRender =\n normalizedSelectedProviderId === paypalProviderId ||\n normalizedSelectedProviderId === paypalCardProviderId\n\n const { config, loading, error } = usePayPalConfig({ baseUrl, publishableApiKey, cartId })\n\n if (!shouldRender) return null\n if (loading) return <div>Loading PayPal…</div>\n if (error) return <div style={{ color: \"crimson\" }}>{error}</div>\n if (!config) return null\n\n return (\n <div style={{ display: \"grid\", gap: 12 }}>\n <PayPalCurrencyNotice config={config as PayPalConfig} />\n\n <PayPalProvider config={config as PayPalConfig} intent=\"capture\">\n {normalizedSelectedProviderId === paypalCardProviderId ? (\n <PayPalAdvancedCard\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n ) : (\n <PayPalSmartButtons\n baseUrl={baseUrl}\n publishableApiKey={publishableApiKey}\n cartId={cartId}\n config={config as PayPalConfig}\n onPaid={onPaid}\n />\n )}\n </PayPalProvider>\n </div>\n )\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easypayment/medusa-paypal-ui",
3
- "version": "0.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Enterprise Gold PayPal UI module for Medusa v2 storefront (Next.js)",
5
5
  "license": "MIT",
6
6
  "type": "module",