diff --git a/src/pretix/static/pretixpresale/js/widget/widget.js b/src/pretix/static/pretixpresale/js/widget/widget.js index 34179e8772..3529acdd8f 100644 --- a/src/pretix/static/pretixpresale/js/widget/widget.js +++ b/src/pretix/static/pretixpresale/js/widget/widget.js @@ -2051,9 +2051,16 @@ var shared_root_methods = { this.$root.set_cart_id(data.cart_id); this.$root.overlay.frame_loading = false; callback() - }, () => { + }, (xhr, data) => { + if (xhr.status === 429 && typeof xhr.responseURL !== "undefined") { + this.$root.overlay.error_message = strings['cart_error_429']; + this.$root.overlay.frame_loading = false; + this.$root.overlay.error_url_after = this.$root.newTabTarget; + this.$root.overlay.error_url_after_new_tab = true; + } else { this.$root.overlay.error_message = strings['cart_error']; this.$root.overlay.frame_loading = false; + } }) }, get_cart_id: function() { @@ -2142,7 +2149,14 @@ var shared_root_computed = { if (this.subevent) { target = this.target_url + this.subevent + '/'; } - return target; + var parameters = this.$root.consent_parameter + if (this.$root.additionalURLParams) { + parameters += `&${this.$root.additionalURLParams}` + } + if (parameters) { + target += '?' + parameters.replace(/^&/, '') + } + return target }, useIframe: function () { if (window.crossOriginIsolated === true) { diff --git a/src/pretix/static/pretixpresale/widget/src/sharedStore.ts b/src/pretix/static/pretixpresale/widget/src/sharedStore.ts index 1c44a9eb40..f43398316b 100644 --- a/src/pretix/static/pretixpresale/widget/src/sharedStore.ts +++ b/src/pretix/static/pretixpresale/widget/src/sharedStore.ts @@ -162,7 +162,15 @@ export function createWidgetStore (config: { return params.toString() }, newTabTarget (): string { - return this.subevent ? `${this.targetUrl}${this.subevent}/` : this.targetUrl + let url = this.subevent ? `${this.targetUrl}${this.subevent}/` : this.targetUrl + let parameters = this.consentParameter + if (this.additionalURLParams) { + parameters += `&${this.additionalURLParams}` + } + if (parameters) { + url += '?' + parameters.replace(/^&/, '') + } + return url }, formTarget (): string { const isFirefox = navigator.userAgent.toLowerCase().includes('firefox') @@ -441,6 +449,7 @@ export function createWidgetStore (config: { this.overlay.frameLoading = false this.overlay.errorUrlAfter = this.newTabTarget this.overlay.errorUrlAfterNewTab = true + return } else if (e.status === 405) { // Likely a redirect! this.targetUrl = e.responseUrl.substring(0, e.responseUrl.indexOf('/cart/add') - 18) @@ -460,11 +469,18 @@ export function createWidgetStore (config: { this.overlay.frameLoading = true const data = await createCart(url) this.setCartId(data.cart_id) + return true } catch (e) { - if (e instanceof ApiError && (e.status === 200 || (e.status >= 400 && e.status < 500))) { + if (e instanceof ApiError && e.status === 429) { + this.overlay.errorMessage = STRINGS.cart_error_429 + this.overlay.frameLoading = false + this.overlay.errorUrlAfter = this.newTabTarget + this.overlay.errorUrlAfterNewTab = true + } else if (e instanceof ApiError && (e.status === 200 || (e.status >= 400 && e.status < 500))) { this.overlay.errorMessage = STRINGS.cart_error this.overlay.frameLoading = false } + return false } }, redeem (voucherCode: string, event?: Event) { @@ -484,7 +500,7 @@ export function createWidgetStore (config: { async resume () { if (!this.cartId && this.keepCart) { // create an empty cart whose id we can persist - await this.createCart() + if (!await this.createCart()) return } let redirectUrl = `${this.targetUrl}w/${globalWidgetId}/` if (this.subevent && this.isButton && this.items.length === 0) {