import React, { useCallback, useEffect, useRef, useState } from "react" import PayPalTabs from "../_components/Tabs" import SectionCard from "../_components/SectionCard" import FieldRow from "../_components/FieldRow" import Toast, { ToastState } from "../_components/Toast" import { adminFetch } from "../_utils/adminFetch" type PaymentAction = "capture" | "authorize" type LandingPage = "no_preference" | "login" | "billing" type AdditionalSettingsForm = { paymentAction: PaymentAction brandName: string landingPage: LandingPage requireInstantPayment: boolean sendItemDetails: boolean invoicePrefix: string creditCardStatementName: string } const DEFAULT_FORM: AdditionalSettingsForm = { paymentAction: "capture", brandName: "PayPal", landingPage: "no_preference", requireInstantPayment: false, sendItemDetails: true, invoicePrefix: "PP-", creditCardStatementName: "PayPal", } /** Overlay saved values on the defaults, ignoring `undefined` entries. */ function mergeWithDefaults(saved?: Partial | null) { if (!saved) return { ...DEFAULT_FORM } const entries = Object.entries(saved).filter( ([, value]) => value !== undefined ) return { ...DEFAULT_FORM, ...(Object.fromEntries(entries) as Partial), } } /** Settings → PayPal → Additional Settings (checkout behaviour + invoice options). */ export default function AdditionalSettingsTab() { const [form, setForm] = useState(() => ({ ...DEFAULT_FORM, })) const [loading, setLoading] = useState(false) const [saving, setSaving] = useState(false) const [toast, setToast] = useState(null) const didInit = useRef(false) const dismissToast = useCallback(() => setToast(null), []) useEffect(() => { if (didInit.current) return didInit.current = true ;(async () => { try { setLoading(true) const json = await adminFetch("/admin/paypal/settings") const payload = json?.data ?? json const saved = payload?.additional_settings if (saved && typeof saved === "object") setForm(mergeWithDefaults(saved)) } catch { // Keep the defaults if settings can't be loaded; saving still works. } finally { setLoading(false) } })() }, []) async function onSave() { try { setSaving(true) setToast(null) const json = await adminFetch("/admin/paypal/settings", { method: "POST", body: { additional_settings: form as unknown as Record, }, }) const payload = json?.data ?? json const saved = payload?.additional_settings if (saved && typeof saved === "object") setForm(mergeWithDefaults(saved)) setToast({ kind: "success", message: "Settings saved" }) } catch (e: unknown) { setToast({ kind: "error", message: e instanceof Error ? e.message : "Failed to save settings", }) } finally { setSaving(false) } } return (

PayPal Gateway By Easy Payment

{loading ? ( Loading… ) : null}
} >
setForm((p) => ({ ...p, brandName: e.target.value })) } className="w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive" placeholder="PayPal" /> setForm((p) => ({ ...p, invoicePrefix: e.target.value })) } className="w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive" placeholder="PP-" /> setForm((p) => ({ ...p, creditCardStatementName: e.target.value, })) } className="w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive" placeholder="PayPal" />
) }