summaryrefslogtreecommitdiff
path: root/web-ui/app/js/mail_view/data/mail_sender.js
blob: 7440f5a73b36409e74f15c3589b5de87ae2808d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
define(
  [
    'flight/lib/component',
    'mail_view/data/mail_builder',
    'page/events'
  ],
  function (defineComponent, mailBuilder, events) {
    'use strict';

    return defineComponent(mailSender);

    function mailSender() {
      function successSendMail(on){
        return function(result) {
          on.trigger(document, events.mail.sent, result);
        };
      }

      function successSaveDraft(on){
        return function(result){
          on.trigger(document, events.mail.draftSaved, result);
        };
      }

      function failure(on) {
        return function(xhr, status, error) {
          on.trigger(events.ui.userAlerts.displayMessage, {message: 'Ops! something went wrong, try again later.'});
        };
      }

      this.defaultAttrs({
        mailsResource: '/mails'
      });

      this.sendMail = function(event, data) {
        $.ajax(this.attr.mailsResource, {
          type: 'POST',
          dataType: 'json',
          contentType: 'application/json; charset=utf-8',
          data: JSON.stringify(data)
        }).done(successSendMail(this))
          .fail(failure(this));
      };

      this.saveMail = function(mail) {
        var method = (mail.ident === '') ? 'POST' : 'PUT';

        return $.ajax(this.attr.mailsResource, {
          type: method,
          dataType: 'json',
          contentType: 'application/json; charset=utf-8',
          data: JSON.stringify(mail)
        });
      };

      this.saveDraft = function(event, data) {
        this.saveMail(data)
          .done(successSaveDraft(this))
          .fail(failure(this));
      };

      this.saveMailWithCallback = function(event, data) {
        this.saveMail(data.mail)
          .done(function(result) { return data.callback(result); })
          .fail(function(result) { return data.callback(result); });
      };

      this.after('initialize', function () {
        this.on(events.mail.send, this.sendMail);
        this.on(events.mail.saveDraft, this.saveDraft);
        this.on(document, events.mail.save, this.saveMailWithCallback);
      });
    }
  });