From 5187f3b84fba1df76663eb3605682e409c379347 Mon Sep 17 00:00:00 2001 From: Jerad Meisner Date: Mon, 17 Sep 2018 00:53:14 -0700 Subject: [PATCH] Get persistent_notifications for lovelace from websocket. (#1649) * Get persistent_notifications for lovelace from websocket. * Only fetch notifications on event. * Use collection for notifications. --- src/cards/ha-persistent_notification-card.js | 5 ++- src/data/ws-notifications.js | 20 +++++++++++ .../lovelace/common/compute-notifications.js | 7 +--- .../hui-configurator-notification-item.js | 12 +++---- .../notifications/hui-notification-drawer.js | 26 ++++++-------- .../notifications/hui-notification-item.js | 12 ++++--- .../notifications/hui-notifications-button.js | 13 +++---- .../hui-persistent-notification-item.js | 22 ++++++------ src/panels/lovelace/hui-root.js | 35 +++++++++++++++++++ 9 files changed, 101 insertions(+), 51 deletions(-) create mode 100644 src/data/ws-notifications.js diff --git a/src/cards/ha-persistent_notification-card.js b/src/cards/ha-persistent_notification-card.js index d80195ba08..f6960927b7 100644 --- a/src/cards/ha-persistent_notification-card.js +++ b/src/cards/ha-persistent_notification-card.js @@ -8,6 +8,7 @@ import '../components/ha-markdown.js'; import computeStateName from '../common/entity/compute_state_name.js'; import LocalizeMixin from '../mixins/localize-mixin.js'; +import computeObjectId from '../common/entity/compute_object_id'; /* * @appliesMixin LocalizeMixin @@ -65,7 +66,9 @@ class HaPersistentNotificationCard extends LocalizeMixin(PolymerElement) { dismissTap(ev) { ev.preventDefault(); - this.hass.callApi('DELETE', 'states/' + this.stateObj.entity_id); + this.hass.callService('persistent_notification', 'dismiss', { + notification_id: computeObjectId(this.stateObj.entity_id) + }); } } customElements.define('ha-persistent_notification-card', HaPersistentNotificationCard); diff --git a/src/data/ws-notifications.js b/src/data/ws-notifications.js new file mode 100644 index 0000000000..bbe42fef72 --- /dev/null +++ b/src/data/ws-notifications.js @@ -0,0 +1,20 @@ +import { createCollection } from 'home-assistant-js-websocket'; + +const fetchNotifications = conn => conn.sendMessagePromise({ + type: 'persistent_notification/get' +}); + +const subscribeUpdates = (conn, store) => + conn.subscribeEvents( + () => fetchNotifications(conn).then(ntf => store.setState(ntf, true)), + 'persistent_notifications_updated' + ); + +export const subscribeNotifications = (conn, onChange) => + createCollection( + '_ntf', + fetchNotifications, + subscribeUpdates, + conn, + onChange + ); diff --git a/src/panels/lovelace/common/compute-notifications.js b/src/panels/lovelace/common/compute-notifications.js index 802805cebb..84a5eab5b4 100644 --- a/src/panels/lovelace/common/compute-notifications.js +++ b/src/panels/lovelace/common/compute-notifications.js @@ -1,12 +1,7 @@ import computeDomain from '../../../common/entity/compute_domain.js'; -const NOTIFICATION_DOMAINS = [ - 'configurator', - 'persistent_notification' -]; - export default function computeNotifications(states) { return Object.keys(states) - .filter(entityId => NOTIFICATION_DOMAINS.includes(computeDomain(entityId))) + .filter(entityId => computeDomain(entityId) === 'configurator') .map(entityId => states[entityId]); } diff --git a/src/panels/lovelace/components/notifications/hui-configurator-notification-item.js b/src/panels/lovelace/components/notifications/hui-configurator-notification-item.js index 25c2612bf5..593b706449 100644 --- a/src/panels/lovelace/components/notifications/hui-configurator-notification-item.js +++ b/src/panels/lovelace/components/notifications/hui-configurator-notification-item.js @@ -19,13 +19,13 @@ export class HuiConfiguratorNotificationItem extends EventsMixin(LocalizeMixin(P [[localize('domain.configurator')]] -
[[_getMessage(stateObj)]]
+
[[_getMessage(notification)]]
[[_localizeState(stateObj.state)]] + >[[_localizeState(notification.state)]]
`; } @@ -33,20 +33,20 @@ export class HuiConfiguratorNotificationItem extends EventsMixin(LocalizeMixin(P static get properties() { return { hass: Object, - stateObj: Object + notification: Object }; } _handleClick() { - this.fire('hass-more-info', { entityId: this.stateObj.entity_id }); + this.fire('hass-more-info', { entityId: this.notification.entity_id }); } _localizeState(state) { return this.localize(`state.configurator.${state}`); } - _getMessage(stateObj) { - const friendlyName = stateObj.attributes.friendly_name; + _getMessage(notification) { + const friendlyName = notification.attributes.friendly_name; return this.localize('ui.notification_drawer.click_to_configure', 'entity', friendlyName); } } diff --git a/src/panels/lovelace/components/notifications/hui-notification-drawer.js b/src/panels/lovelace/components/notifications/hui-notification-drawer.js index d641b280ba..3b4cff993f 100644 --- a/src/panels/lovelace/components/notifications/hui-notification-drawer.js +++ b/src/panels/lovelace/components/notifications/hui-notification-drawer.js @@ -7,8 +7,6 @@ import { PolymerElement } from '@polymer/polymer/polymer-element.js'; import './hui-notification-item.js'; -import computeNotifications from '../../common/compute-notifications.js'; - import EventsMixin from '../../../../mixins/events-mixin.js'; import LocalizeMixin from '../../../../mixins/localize-mixin.js'; @@ -105,16 +103,16 @@ export class HuiNotificationDrawer extends EventsMixin(LocalizeMixin(PolymerElem
-