From a251740aff708f0446c916e58cc9d376a7540efb Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Mon, 12 Jan 2026 11:49:10 +0100 Subject: [PATCH] Redirect checkout to billing with status --- .../js/admin/i18n/locales/de/management.json | 2 ++ .../js/admin/i18n/locales/en/management.json | 2 ++ resources/js/admin/mobile/BillingPage.tsx | 30 ++++++++++++++++++- resources/js/admin/mobile/PackageShopPage.tsx | 14 +++++++-- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/resources/js/admin/i18n/locales/de/management.json b/resources/js/admin/i18n/locales/de/management.json index 4fa1e770..0d88185d 100644 --- a/resources/js/admin/i18n/locales/de/management.json +++ b/resources/js/admin/i18n/locales/de/management.json @@ -34,6 +34,8 @@ "more": "Weitere Einträge konnten nicht geladen werden.", "portal": "Paddle-Portal konnte nicht geöffnet werden." }, + "checkoutSuccess": "Checkout abgeschlossen. Dein Paket wird in Kürze aktiviert.", + "checkoutCancelled": "Checkout wurde abgebrochen.", "sections": { "invoices": { "title": "Rechnungen & Zahlungen", diff --git a/resources/js/admin/i18n/locales/en/management.json b/resources/js/admin/i18n/locales/en/management.json index 79d53fee..85533de0 100644 --- a/resources/js/admin/i18n/locales/en/management.json +++ b/resources/js/admin/i18n/locales/en/management.json @@ -34,6 +34,8 @@ "more": "Unable to load more entries.", "portal": "Unable to open the Paddle portal." }, + "checkoutSuccess": "Checkout completed. Your package will activate shortly.", + "checkoutCancelled": "Checkout was cancelled.", "sections": { "invoices": { "title": "Invoices & payments", diff --git a/resources/js/admin/mobile/BillingPage.tsx b/resources/js/admin/mobile/BillingPage.tsx index 425dd9d5..798773e2 100644 --- a/resources/js/admin/mobile/BillingPage.tsx +++ b/resources/js/admin/mobile/BillingPage.tsx @@ -108,6 +108,34 @@ export default function MobileBillingPage() { } }, [location.hash, loading]); + React.useEffect(() => { + if (!location.search) { + return; + } + + const params = new URLSearchParams(location.search); + const checkout = params.get('checkout'); + if (!checkout) { + return; + } + + if (checkout === 'success') { + toast.success(t('billing.checkoutSuccess', 'Checkout completed. Your package will activate shortly.')); + } else if (checkout === 'cancel') { + toast(t('billing.checkoutCancelled', 'Checkout was cancelled.')); + } + + params.delete('checkout'); + navigate( + { + pathname: location.pathname, + search: params.toString(), + hash: location.hash, + }, + { replace: true }, + ); + }, [location.hash, location.pathname, location.search, navigate, t]); + return ( if (!canProceed || busy) return; setBusy(true); try { + if (typeof window === 'undefined') { + throw new Error('Checkout is only available in the browser.'); + } + + const billingUrl = new URL(adminPath('/mobile/billing'), window.location.origin); + const successUrl = new URL(billingUrl); + successUrl.searchParams.set('checkout', 'success'); + const cancelUrl = new URL(billingUrl); + cancelUrl.searchParams.set('checkout', 'cancel'); + const { checkout_url } = await createTenantPaddleCheckout(pkg.id, { - success_url: window.location.href, - return_url: window.location.href, + success_url: successUrl.toString(), + return_url: cancelUrl.toString(), }); window.location.href = checkout_url; } catch (err) {