odoo18/addons/payment/static/src/js/post_processing.js

65 lines
2.0 KiB
JavaScript

/** @odoo-module **/
import publicWidget from '@web/legacy/js/public/public_widget';
import { ConnectionLostError, rpc, RPCError } from '@web/core/network/rpc';
publicWidget.registry.PaymentPostProcessing = publicWidget.Widget.extend({
selector: 'div[name="o_payment_status"]',
timeout: 0,
pollCount: 0,
async start() {
this._poll();
return this._super.apply(this, arguments);
},
_poll() {
this._updateTimeout();
setTimeout(() => {
// Fetch the post-processing values from the server.
const self = this;
rpc('/payment/status/poll', {
'csrf_token': odoo.csrf_token,
}).then(postProcessingValues => {
let {provider_code, state, landing_route} = postProcessingValues;
// Redirect the user to the landing route if the transaction reached a final state.
if (self._getFinalStates(provider_code).has(state)) {
window.location = landing_route;
} else {
self._poll();
}
}).catch(error => {
const isRetryError = error instanceof RPCError && error.data.message === 'retry';
const isConnectionLostError = error instanceof ConnectionLostError;
if (isRetryError || isConnectionLostError) {
self._poll();
}
if (!isRetryError) {
throw error;
}
});
}, this.timeout);
},
_getFinalStates(providerCode) {
return new Set(['authorized', 'done', 'cancel', 'error']);
},
_updateTimeout() {
if (this.pollCount >= 1 && this.pollCount < 10) {
this.timeout = 3000;
}
if (this.pollCount >= 10 && this.pollCount < 20) {
this.timeout = 10000;
}
else if (this.pollCount >= 20) {
this.timeout = 30000;
}
this.pollCount++;
},
});
export default publicWidget.registry.PaymentPostProcessing;