From 370e91c3e33a10a741219a8721fc7bb98b5b9e79 Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Thu, 30 Jul 2026 16:50:47 +0200 Subject: [PATCH] :bug: Fix bad error callback on nitrate checkout (#10886) --- frontend/src/app/main/data/nitrate.cljs | 22 +++++++------- .../src/app/main/ui/nitrate/nitrate_form.cljs | 1 + .../app/main/ui/settings/subscription.cljs | 1 + .../frontend_tests/data/nitrate_test.cljs | 30 ++++++++++++++----- frontend/translations/en.po | 4 +-- 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/frontend/src/app/main/data/nitrate.cljs b/frontend/src/app/main/data/nitrate.cljs index f4d9945454..10326ca290 100644 --- a/frontend/src/app/main/data/nitrate.cljs +++ b/frontend/src/app/main/data/nitrate.cljs @@ -112,20 +112,20 @@ (def nitrate-checkout-cancelled-token "nitrate-checkout-cancelled") (defn build-nitrate-callback-urls - "Build the success/error/cancel callback URLs from a base URL by appending - a `subscription` query param identifying the outcome." - [base-url] - (let [build (fn [token] - (dom/append-query-param base-url :subscription token))] - {:success-callback (build "subscribed-to-penpot-nitrate") - :error-callback (build nitrate-checkout-error-token) - :finish-error-callback (build nitrate-checkout-finish-error-token) - :cancel-callback (build nitrate-checkout-cancelled-token)})) + "Build checkout callback URLs from base URLs by appending a `subscription` + query param identifying the outcome." + [base-url base-error-url] + (let [build (fn [url token] + (dom/append-query-param url :subscription token))] + {:success-callback (build base-url "subscribed-to-penpot-nitrate") + :error-callback (build base-error-url nitrate-checkout-error-token) + :finish-error-callback (build base-error-url nitrate-checkout-finish-error-token) + :cancel-callback (build base-url nitrate-checkout-cancelled-token)})) (defn go-to-buy-nitrate-license - [subscription base-url event-origin subscription-mode subscription-start-origin] + [subscription base-url base-error-url event-origin subscription-mode subscription-start-origin] (let [{:keys [success-callback error-callback finish-error-callback cancel-callback]} - (build-nitrate-callback-urls base-url) + (build-nitrate-callback-urls base-url base-error-url) params {:subscription subscription :callback success-callback :error_callback error-callback diff --git a/frontend/src/app/main/ui/nitrate/nitrate_form.cljs b/frontend/src/app/main/ui/nitrate/nitrate_form.cljs index aa091d1fad..3ad31a1977 100644 --- a/frontend/src/app/main/ui/nitrate/nitrate_form.cljs +++ b/frontend/src/app/main/ui/nitrate/nitrate_form.cljs @@ -35,6 +35,7 @@ (dnt/go-to-buy-nitrate-license "monthly" dnt/go-to-ac-url + dnt/go-to-subscription-url "dashboard:plan-confirmation-modal" (if (:subscription profile) "paid" "trial") subscription-start-origin))) diff --git a/frontend/src/app/main/ui/settings/subscription.cljs b/frontend/src/app/main/ui/settings/subscription.cljs index 92fc7d9a59..e309bba797 100644 --- a/frontend/src/app/main/ui/settings/subscription.cljs +++ b/frontend/src/app/main/ui/settings/subscription.cljs @@ -807,6 +807,7 @@ (dnt/go-to-buy-nitrate-license "monthly" (rt/get-current-href) + dnt/go-to-subscription-url event-origin (if nitrate-license "paid" "trial") subscription-start-origin)))] diff --git a/frontend/test/frontend_tests/data/nitrate_test.cljs b/frontend/test/frontend_tests/data/nitrate_test.cljs index 7b371ae247..f42f95bd26 100644 --- a/frontend/test/frontend_tests/data/nitrate_test.cljs +++ b/frontend/test/frontend_tests/data/nitrate_test.cljs @@ -165,8 +165,8 @@ (t/deftest build-nitrate-callback-urls-preserves-hash-query (t/testing "appends subscription to an existing query inside the hash route" - (let [callbacks (dnt/build-nitrate-callback-urls - "https://localhost:3449/#/dashboard/recent?team-id=e6666530-0216-81c8-8007-f17d6087b74f")] + (let [base-url "https://localhost:3449/#/dashboard/recent?team-id=e6666530-0216-81c8-8007-f17d6087b74f" + callbacks (dnt/build-nitrate-callback-urls base-url base-url)] (t/is (= "https://localhost:3449/#/dashboard/recent?team-id=e6666530-0216-81c8-8007-f17d6087b74f&subscription=subscribed-to-penpot-nitrate" (:success-callback callbacks))) (t/is (= "https://localhost:3449/#/dashboard/recent?team-id=e6666530-0216-81c8-8007-f17d6087b74f&subscription=nitrate-checkout-error" @@ -178,25 +178,39 @@ (t/deftest build-nitrate-callback-urls-adds-hash-query-when-missing (t/testing "adds a hash query when the route has no query string yet" - (let [callbacks (dnt/build-nitrate-callback-urls - "https://localhost:3449/#/settings/subscriptions")] + (let [base-url "https://localhost:3449/#/settings/subscriptions" + callbacks (dnt/build-nitrate-callback-urls base-url base-url)] (t/is (= "https://localhost:3449/#/settings/subscriptions?subscription=subscribed-to-penpot-nitrate" (:success-callback callbacks)))))) (t/deftest build-nitrate-callback-urls-adds-regular-query-without-hash (t/testing "falls back to the regular URL query when there is no hash route" - (let [callbacks (dnt/build-nitrate-callback-urls - "https://localhost:3449/admin-console/licenses/billing?foo=bar")] + (let [base-url "https://localhost:3449/admin-console/licenses/billing?foo=bar" + callbacks (dnt/build-nitrate-callback-urls base-url base-url)] (t/is (= "https://localhost:3449/admin-console/licenses/billing?foo=bar&subscription=subscribed-to-penpot-nitrate" (:success-callback callbacks)))))) (t/deftest build-nitrate-callback-urls-accepts-uri-object (t/testing "accepts a URI object as base url (used by the nitrate-form modal)" - (let [callbacks (dnt/build-nitrate-callback-urls - (u/uri "https://localhost:3449/#/settings/subscriptions"))] + (let [base-url (u/uri "https://localhost:3449/#/settings/subscriptions") + callbacks (dnt/build-nitrate-callback-urls base-url base-url)] (t/is (= "https://localhost:3449/#/settings/subscriptions?subscription=nitrate-checkout-error" (:error-callback callbacks)))))) +(t/deftest build-nitrate-callback-urls-uses-separate-error-base + (t/testing "error callbacks use base-error-url while success/cancel use base-url" + (let [callbacks (dnt/build-nitrate-callback-urls + "https://localhost:3449/#/dashboard/recent" + "https://localhost:3449/#/settings/subscriptions")] + (t/is (= "https://localhost:3449/#/dashboard/recent?subscription=subscribed-to-penpot-nitrate" + (:success-callback callbacks))) + (t/is (= "https://localhost:3449/#/settings/subscriptions?subscription=nitrate-checkout-error" + (:error-callback callbacks))) + (t/is (= "https://localhost:3449/#/settings/subscriptions?subscription=nitrate-checkout-finish-error" + (:finish-error-callback callbacks))) + (t/is (= "https://localhost:3449/#/dashboard/recent?subscription=nitrate-checkout-cancelled" + (:cancel-callback callbacks)))))) + (t/deftest go-to-subscription-url-is-a-string (t/testing "must be a string so licenses/billing?callback=... survives query encoding" (t/is (string? dnt/go-to-subscription-url)) diff --git a/frontend/translations/en.po b/frontend/translations/en.po index 3799d37643..5b28fa12f6 100644 --- a/frontend/translations/en.po +++ b/frontend/translations/en.po @@ -6026,8 +6026,8 @@ msgstr "Payment was not completed. Try again whenever you're ready." #: src/app/main/ui/settings/subscription.cljs:427 msgid "subscription.error.nitrate.checkout-failed" msgstr "" -"We couldn't start the checkout. Please try again. If the problem persists, " -"contact us: support@penpot.app." +"The payment was not completed. Please try again. " +"If the problem persists, contact us: support@penpot.app." #: src/app/main/ui/settings/subscription.cljs:407 msgid "subscription.error.nitrate.checkout-finish-failed"