ajax.js 1.7 KB

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