ajax.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. (function (Misago) {
  2. 'use strict';
  3. var getCsrfToken = function(cookie_name) {
  4. if (document.cookie.indexOf(cookie_name) !== -1) {
  5. var cookieRegex = new RegExp(cookie_name + '\=([^;]*)');
  6. var cookie = Misago.get(document.cookie.match(cookieRegex), 0);
  7. return cookie.split('=')[1];
  8. } else {
  9. return null;
  10. }
  11. };
  12. var Ajax = function(_) {
  13. this.refreshCsrfToken = function() {
  14. this.csrfToken = getCsrfToken(_.context.CSRF_COOKIE_NAME);
  15. };
  16. this.refreshCsrfToken();
  17. /*
  18. List of GETs underway
  19. We are limiting number of GETs to API to 1 per url
  20. */
  21. var runningGets = {};
  22. this.ajax = function(method, url, data, progress) {
  23. var promise = m.deferred();
  24. var ajax_settings = {
  25. url: url,
  26. method: method,
  27. headers: {
  28. 'X-CSRFToken': this.csrfToken
  29. },
  30. data: data || {},
  31. dataType: 'json',
  32. success: function(data) {
  33. if (method === 'GET') {
  34. Misago.pop(runningGets, url);
  35. }
  36. promise.resolve(data);
  37. },
  38. error: function(jqXHR) {
  39. if (method === 'GET') {
  40. Misago.pop(runningGets, url);
  41. }
  42. var rejection = jqXHR.responseJSON || {};
  43. rejection.status = jqXHR.status;
  44. rejection.statusText = jqXHR.statusText;
  45. promise.reject(rejection);
  46. }
  47. };
  48. if (progress) {
  49. return; // not implemented... yet!
  50. }
  51. $.ajax(ajax_settings);
  52. return promise.promise;
  53. };
  54. this.get = function(url) {
  55. if (runningGets[url] !== undefined) {
  56. return runningGets[url];
  57. } else {
  58. runningGets[url] = this.ajax('GET', url);
  59. return runningGets[url];
  60. }
  61. };
  62. this.post = function(url, data) {
  63. return this.ajax('POST', url, data);
  64. };
  65. this.patch = function(url, data) {
  66. return this.ajax('PATCH', url, data);
  67. };
  68. this.put = function(url, data) {
  69. return this.ajax('PUT', url, data);
  70. };
  71. this.delete = function(url) {
  72. return this.ajax('DELETE', url);
  73. };
  74. // Shorthand for handling backend errors
  75. this.error = function(rejection) {
  76. if (rejection.ban) {
  77. _.showBannedPage(rejection.ban);
  78. _.modal();
  79. } else {
  80. this.alert(rejection);
  81. }
  82. };
  83. this.alert = function(rejection) {
  84. var message = gettext("Unknown error has occured.");
  85. if (rejection.status === 0) {
  86. message = gettext("Lost connection with application.");
  87. }
  88. if (rejection.status === 400 && rejection.detail) {
  89. message = rejection.detail;
  90. }
  91. if (rejection.status === 403) {
  92. message = rejection.detail;
  93. if (message === "Permission denied") {
  94. message = gettext(
  95. "You don't have permission to perform this action.");
  96. }
  97. }
  98. if (rejection.status === 404) {
  99. message = gettext("Action link is invalid.");
  100. }
  101. _.alert.error(message);
  102. };
  103. };
  104. Misago.addService('ajax', function(_) {
  105. return new Ajax(_);
  106. });
  107. }(Misago.prototype));