summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/content/newmailalert.js
blob: 898c8d67249b62a7e3716a27466bf5103f138c98 (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

var { PluralForm } = ChromeUtils.importESModule(
  "resource://gre/modules/PluralForm.sys.mjs"
);

var gAlertListener = null;

// NOTE: We must wait until "load" instead of "DOMContentLoaded" because
// otherwise the window height and width is not set in time for
// window.moveTo.
window.addEventListener("load", onAlertLoad);

function prefillAlertInfo() {
  // unwrap all the args....
  // arguments[0] --> The real nsIMsgFolder with new mail.
  // arguments[1] --> The keys of new messages.
  // arguments[2] --> The nsIObserver to receive window closed event.
  let [folder, newMsgKeys, listener] = window.arguments;
  newMsgKeys = newMsgKeys.wrappedJSObject;
  gAlertListener = listener.QueryInterface(Ci.nsIObserver);

  // Generate an account label string based on the root folder.
  var label = document.getElementById("alertTitle");
  var totalNumNewMessages = newMsgKeys.length;
  let message = document
    .getElementById("bundle_messenger")
    .getString("newMailAlert_message");
  label.value = PluralForm.get(totalNumNewMessages, message)
    .replace("#1", folder.server.rootFolder.prettyName)
    .replace("#2", totalNumNewMessages);

  // <folder-summary> handles rendering of new messages.
  var folderSummaryInfoEl = document.getElementById("folderSummaryInfo");
  folderSummaryInfoEl.maxMsgHdrsInPopup = 6;
  folderSummaryInfoEl.render(folder, newMsgKeys);
}

function onAlertLoad() {
  let dragSession = Cc["@mozilla.org/widget/dragservice;1"]
    .getService(Ci.nsIDragService)
    .getCurrentSession();
  if (dragSession && dragSession.sourceNode) {
    // If a drag session is active, adjusting this window's dimensions causes
    // the drag session to be abruptly terminated. To avoid interrupting the
    // user, wait until the drag is finished and then set up and show the alert.
    dragSession.sourceNode.addEventListener("dragend", () => doOnAlertLoad());
  } else {
    doOnAlertLoad();
  }
}

function doOnAlertLoad() {
  prefillAlertInfo();

  if (!document.getElementById("folderSummaryInfo").hasMessages()) {
    closeAlert(); // no mail, so don't bother showing the alert...
    return;
  }

  // resize the alert based on our current content
  let alertTextBox = document.getElementById("alertTextBox");
  let alertImageBox = document.getElementById("alertImageBox");
  alertImageBox.style.minHeight = alertTextBox.scrollHeight + "px";

  // Show in bottom right, offset by 10px.
  // We wait one cycle until the window has resized.
  setTimeout(() => {
    let x = screen.availLeft + screen.availWidth - window.outerWidth - 10;
    let y = screen.availTop + screen.availHeight - window.outerHeight - 10;
    window.moveTo(x, y);
  });

  let openTime = Services.prefs.getIntPref("alerts.totalOpenTime");
  var alertContainer = document.getElementById("alertContainer");
  // Don't fade in if the prefers-reduced-motion is true.
  if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
    alertContainer.setAttribute("noanimation", true);
    setTimeout(closeAlert, openTime);
    return;
  }

  alertContainer.addEventListener("animationend", function hideAlert(event) {
    if (event.animationName == "fade-in") {
      alertContainer.removeEventListener("animationend", hideAlert);
      setTimeout(fadeOutAlert, openTime);
    }
  });

  alertContainer.setAttribute("fade-in", true);
}

function fadeOutAlert() {
  var alertContainer = document.getElementById("alertContainer");
  alertContainer.addEventListener("animationend", function fadeOut(event) {
    if (event.animationName == "fade-out") {
      alertContainer.removeEventListener("animationend", fadeOut);
      closeAlert();
    }
  });
  alertContainer.setAttribute("fade-out", true);
}

function closeAlert() {
  window.close();
  gAlertListener.observe(null, "newmailalert-closed", "");
}