ha-frontend-cdce8p/src/panels/lovelace/common/create-hui-element.js
Ian Richardson 4959b861bd Convert hui-image-element to TypeScript/LitElement (#1890)
* Convert hui-image-element to TypeScript/LitElement

WIP
Some of the state portions passed down to ha-image are not updating the view.

* Fixed setting of properties

* Add tagnamemap interface

* Address review comments
2018-10-28 20:25:12 +01:00

80 lines
2.1 KiB
JavaScript

import "../elements/hui-icon-element";
import "../elements/hui-image-element";
import "../elements/hui-service-button-element";
import "../elements/hui-state-badge-element.js";
import "../elements/hui-state-icon-element.js";
import "../elements/hui-state-label-element";
import { fireEvent } from "../../../common/dom/fire_event.js";
import createErrorCardConfig from "./create-error-card-config.js";
const CUSTOM_TYPE_PREFIX = "custom:";
const ELEMENT_TYPES = new Set([
"icon",
"image",
"service-button",
"state-badge",
"state-icon",
"state-label",
]);
const TIMEOUT = 2000;
function _createElement(tag, config) {
const element = document.createElement(tag);
try {
element.setConfig(config);
} catch (err) {
// eslint-disable-next-line
console.error(tag, err);
// eslint-disable-next-line
return _createErrorElement(err.message, config);
}
return element;
}
function _createErrorElement(error, config) {
return _createElement("hui-error-card", createErrorCardConfig(error, config));
}
function _hideErrorElement(element) {
element.style.display = "None";
return window.setTimeout(() => {
element.style.display = "";
}, TIMEOUT);
}
export default function createHuiElement(config) {
if (!config || typeof config !== "object" || !config.type) {
return _createErrorElement("No element type configured.", config);
}
if (config.type.startsWith(CUSTOM_TYPE_PREFIX)) {
const tag = config.type.substr(CUSTOM_TYPE_PREFIX.length);
if (customElements.get(tag)) {
return _createElement(tag, config);
}
const element = _createErrorElement(
`Custom element doesn't exist: ${tag}.`,
config
);
const timer = _hideErrorElement(element);
customElements.whenDefined(tag).then(() => {
clearTimeout(timer);
fireEvent(element, "rebuild-view");
});
return element;
}
if (!ELEMENT_TYPES.has(config.type)) {
return _createErrorElement(
`Unknown element type encountered: ${config.type}.`,
config
);
}
return _createElement(`hui-${config.type}-element`, config);
}