mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-27 03:06:41 +00:00
Initial haptics support (#3099)
* Initial haptics support * Move window stuff into types.ts * Fire haptic events instead of expecting a messageHandler * Style fixes, linting fixes * Only allow whitelisted haptics * Make requested changes
This commit is contained in:
parent
b3c1bead39
commit
f4cfbc6678
@ -14,6 +14,7 @@ import {
|
|||||||
} from "lit-element";
|
} from "lit-element";
|
||||||
import { HomeAssistant } from "../../types";
|
import { HomeAssistant } from "../../types";
|
||||||
import { HassEntity } from "home-assistant-js-websocket";
|
import { HassEntity } from "home-assistant-js-websocket";
|
||||||
|
import { forwardHaptic } from "../../util/haptics";
|
||||||
|
|
||||||
const isOn = (stateObj?: HassEntity) =>
|
const isOn = (stateObj?: HassEntity) =>
|
||||||
stateObj !== undefined && !STATES_OFF.includes(stateObj.state);
|
stateObj !== undefined && !STATES_OFF.includes(stateObj.state);
|
||||||
@ -89,6 +90,7 @@ class HaEntityToggle extends LitElement {
|
|||||||
if (!this.hass || !this.stateObj) {
|
if (!this.hass || !this.stateObj) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
forwardHaptic(this, "light");
|
||||||
const stateDomain = computeStateDomain(this.stateObj);
|
const stateDomain = computeStateDomain(this.stateObj);
|
||||||
let serviceDomain;
|
let serviceDomain;
|
||||||
let service;
|
let service;
|
||||||
|
@ -16,6 +16,7 @@ import { getLocalLanguage } from "../../util/hass-translation";
|
|||||||
import { fetchWithAuth } from "../../util/fetch-with-auth";
|
import { fetchWithAuth } from "../../util/fetch-with-auth";
|
||||||
import hassCallApi from "../../util/hass-call-api";
|
import hassCallApi from "../../util/hass-call-api";
|
||||||
import { subscribePanels } from "../../data/ws-panels";
|
import { subscribePanels } from "../../data/ws-panels";
|
||||||
|
import { forwardHaptic } from "../../util/haptics";
|
||||||
|
|
||||||
export default (superClass) =>
|
export default (superClass) =>
|
||||||
class extends EventsMixin(LocalizeMixin(superClass)) {
|
class extends EventsMixin(LocalizeMixin(superClass)) {
|
||||||
@ -75,6 +76,7 @@ export default (superClass) =>
|
|||||||
err
|
err
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
forwardHaptic(this, "error");
|
||||||
const message =
|
const message =
|
||||||
this.hass.localize(
|
this.hass.localize(
|
||||||
"ui.notification_toast.service_call_failed",
|
"ui.notification_toast.service_call_failed",
|
||||||
|
@ -13,6 +13,7 @@ import { PaperToggleButtonElement } from "@polymer/paper-toggle-button/paper-tog
|
|||||||
import { DOMAINS_TOGGLE } from "../../../common/const";
|
import { DOMAINS_TOGGLE } from "../../../common/const";
|
||||||
import { turnOnOffEntities } from "../common/entity/turn-on-off-entities";
|
import { turnOnOffEntities } from "../common/entity/turn-on-off-entities";
|
||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
|
import { forwardHaptic } from "../../../util/haptics";
|
||||||
|
|
||||||
@customElement("hui-entities-toggle")
|
@customElement("hui-entities-toggle")
|
||||||
class HuiEntitiesToggle extends LitElement {
|
class HuiEntitiesToggle extends LitElement {
|
||||||
@ -65,6 +66,7 @@ class HuiEntitiesToggle extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _callService(ev: MouseEvent): void {
|
private _callService(ev: MouseEvent): void {
|
||||||
|
forwardHaptic(this, "light");
|
||||||
const turnOn = (ev.target as PaperToggleButtonElement).checked;
|
const turnOn = (ev.target as PaperToggleButtonElement).checked;
|
||||||
turnOnOffEntities(this.hass!, this._toggleEntities!, turnOn!);
|
turnOnOffEntities(this.hass!, this._toggleEntities!, turnOn!);
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import { HomeAssistant } from "../../../types";
|
|||||||
import { EntityRow, EntityConfig } from "./types";
|
import { EntityRow, EntityConfig } from "./types";
|
||||||
import { setOption } from "../../../data/input-select";
|
import { setOption } from "../../../data/input-select";
|
||||||
import { hasConfigOrEntityChanged } from "../common/has-changed";
|
import { hasConfigOrEntityChanged } from "../common/has-changed";
|
||||||
|
import { forwardHaptic } from "../../../util/haptics";
|
||||||
|
|
||||||
@customElement("hui-input-select-entity-row")
|
@customElement("hui-input-select-entity-row")
|
||||||
class HuiInputSelectEntityRow extends LitElement implements EntityRow {
|
class HuiInputSelectEntityRow extends LitElement implements EntityRow {
|
||||||
@ -97,6 +98,7 @@ class HuiInputSelectEntityRow extends LitElement implements EntityRow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _selectedChanged(ev): void {
|
private _selectedChanged(ev): void {
|
||||||
|
forwardHaptic(this, "light");
|
||||||
// Selected Option will transition to '' before transitioning to new value
|
// Selected Option will transition to '' before transitioning to new value
|
||||||
const stateObj = this.hass!.states[this._config!.entity];
|
const stateObj = this.hass!.states[this._config!.entity];
|
||||||
if (
|
if (
|
||||||
|
28
src/util/haptics.ts
Normal file
28
src/util/haptics.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* Utility function that enables haptic feedback
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { fireEvent } from "../common/dom/fire_event";
|
||||||
|
|
||||||
|
// Allowed types are from iOS HIG.
|
||||||
|
// https://developer.apple.com/design/human-interface-guidelines/ios/user-interaction/feedback/#haptics
|
||||||
|
// Implementors on platforms other than iOS should attempt to match the patterns (shown in HIG) as closely as possible.
|
||||||
|
export type HapticType =
|
||||||
|
| "success"
|
||||||
|
| "warning"
|
||||||
|
| "failure"
|
||||||
|
| "light"
|
||||||
|
| "medium"
|
||||||
|
| "heavy"
|
||||||
|
| "selection";
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
// for fire event
|
||||||
|
interface HASSDomEvents {
|
||||||
|
haptic: HapticType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const forwardHaptic = (el: HTMLElement, hapticType: HapticType) => {
|
||||||
|
fireEvent(el, "haptic", hapticType);
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user