summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/components/Output/MessageIcon.js
blob: 6e3fb69aaaf4bfaf822862a71cbaf68aca590d65 (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
/* 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/. */

"use strict";

const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.js");
const dom = require("resource://devtools/client/shared/vendor/react-dom-factories.js");
const {
  l10n,
} = require("resource://devtools/client/webconsole/utils/messages.js");

const l10nLevels = {
  error: "level.error",
  warn: "level.warn",
  info: "level.info",
  log: "level.log",
  debug: "level.debug",
};

// Store common icons so they can be used without recreating the element
// during render.
const CONSTANT_ICONS = Object.entries(l10nLevels).reduce(
  (acc, [key, l10nLabel]) => {
    acc[key] = getIconElement(l10nLabel);
    return acc;
  },
  {}
);

function getIconElement(level, type, title) {
  title = title || l10n.getStr(l10nLevels[level] || level);
  const classnames = ["icon"];

  if (type === "logPoint") {
    title = l10n.getStr("logpoint.title");
    classnames.push("logpoint");
  } else if (type === "logTrace") {
    title = l10n.getStr("logtrace.title");
    classnames.push("logtrace");
  } else if (type === "blockedReason") {
    title = l10n.getStr("blockedrequest.label");
  }

  {
    return dom.span({
      className: classnames.join(" "),
      title,
      "aria-live": "off",
    });
  }
}

MessageIcon.displayName = "MessageIcon";
MessageIcon.propTypes = {
  level: PropTypes.string.isRequired,
  type: PropTypes.string,
  title: PropTypes.string,
};

function MessageIcon(props) {
  const { level, type, title } = props;

  if (type) {
    return getIconElement(level, type, title);
  }

  return CONSTANT_ICONS[level] || getIconElement(level);
}

module.exports = MessageIcon;