ajax.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. (function (Misago) {
  2. 'use strict';
  3. var Ajax = function(_) {
  4. var cookieRegex = new RegExp(_.context.CSRF_COOKIE_NAME + '\=([^;]*)');
  5. this.csrfToken = Misago.get(
  6. document.cookie.match(cookieRegex), 0).split('=')[1];
  7. /*
  8. List of GETs underway
  9. We are limiting number of GETs to API to 1 per url
  10. */
  11. var runningGets = {};
  12. this.ajax = function(method, url, data, progress) {
  13. var promise = m.deferred();
  14. var ajax_settings = {
  15. url: url,
  16. method: method,
  17. headers: {
  18. 'X-CSRFToken': this.csrfToken
  19. },
  20. data: data | {},
  21. dataType: 'json',
  22. success: function(data) {
  23. if (method === 'GET') {
  24. Misago.pop(runningGets, url);
  25. }
  26. promise.resolve(data);
  27. },
  28. error: function(jqXHR) {
  29. if (method === 'GET') {
  30. Misago.pop(runningGets, url);
  31. }
  32. var rejection = jqXHR.responseJSON || {};
  33. rejection.status = jqXHR.status;
  34. rejection.statusText = jqXHR.statusText;
  35. promise.reject(rejection);
  36. }
  37. };
  38. if (progress) {
  39. return; // not implemented... yet!
  40. }
  41. $.ajax(ajax_settings);
  42. return promise.promise;
  43. };
  44. this.get = function(url) {
  45. var preloaded = Misago.pop(_.context, url);
  46. if (preloaded) {
  47. var deferred = m.deferred();
  48. deferred.resolve(preloaded);
  49. return deferred.promise;
  50. } else if (runningGets[url] !== undefined) {
  51. return runningGets[url];
  52. } else {
  53. runningGets[url] = this.ajax('GET', url);
  54. return runningGets[url];
  55. }
  56. };
  57. this.post = function(url) {
  58. return this.ajax('POST', url);
  59. };
  60. };
  61. Misago.addService('ajax', function(_) {
  62. return new Ajax(_);
  63. });
  64. }(Misago.prototype));