@iobroker/dm-gui-components 8.0.8 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/build/Communication.d.ts +12 -38
- package/build/Communication.js +91 -69
- package/build/Communication.js.map +1 -1
- package/build/DeviceActionButton.d.ts +3 -3
- package/build/DeviceActionButton.js +2 -2
- package/build/DeviceActionButton.js.map +1 -1
- package/build/DeviceCard.d.ts +28 -9
- package/build/DeviceCard.js +161 -63
- package/build/DeviceCard.js.map +1 -1
- package/build/DeviceControl.d.ts +5 -5
- package/build/DeviceControl.js.map +1 -1
- package/build/DeviceImageUpload.d.ts +2 -1
- package/build/DeviceImageUpload.js +1 -1
- package/build/DeviceImageUpload.js.map +1 -1
- package/build/DeviceList.d.ts +6 -7
- package/build/DeviceList.js +102 -91
- package/build/DeviceList.js.map +1 -1
- package/build/DeviceStatus.d.ts +7 -4
- package/build/DeviceStatus.js +37 -30
- package/build/DeviceStatus.js.map +1 -1
- package/build/InstanceActionButton.d.ts +1 -1
- package/build/InstanceActionButton.js.map +1 -1
- package/build/StateOrObjectHandler.d.ts +10 -0
- package/build/StateOrObjectHandler.js +141 -0
- package/build/StateOrObjectHandler.js.map +1 -0
- package/build/TooltipButton.d.ts +1 -0
- package/build/TooltipButton.js +4 -3
- package/build/TooltipButton.js.map +1 -1
- package/build/Utils.d.ts +1 -2
- package/build/Utils.js.map +1 -1
- package/build/hooks.d.ts +3 -0
- package/build/hooks.js +10 -0
- package/build/hooks.js.map +1 -0
- package/build/i18n/de.json +2 -0
- package/build/i18n/en.json +2 -0
- package/build/i18n/es.json +2 -0
- package/build/i18n/fr.json +2 -0
- package/build/i18n/it.json +2 -0
- package/build/i18n/nl.json +2 -0
- package/build/i18n/pl.json +2 -0
- package/build/i18n/pt.json +2 -0
- package/build/i18n/ru.json +2 -0
- package/build/i18n/uk.json +2 -0
- package/build/i18n/zh-cn.json +2 -0
- package/build/protocol/DmProtocolBase.d.ts +29 -0
- package/build/protocol/DmProtocolBase.js +12 -0
- package/build/protocol/DmProtocolBase.js.map +1 -0
- package/build/protocol/DmProtocolV1.d.ts +12 -0
- package/build/protocol/DmProtocolV1.js +22 -0
- package/build/protocol/DmProtocolV1.js.map +1 -0
- package/build/protocol/DmProtocolV2.d.ts +5 -0
- package/build/protocol/DmProtocolV2.js +11 -0
- package/build/protocol/DmProtocolV2.js.map +1 -0
- package/build/protocol/DmProtocolV3.d.ts +12 -0
- package/build/protocol/DmProtocolV3.js +28 -0
- package/build/protocol/DmProtocolV3.js.map +1 -0
- package/build/protocol/UnknownDmProtocol.d.ts +13 -0
- package/build/protocol/UnknownDmProtocol.js +20 -0
- package/build/protocol/UnknownDmProtocol.js.map +1 -0
- package/build/protocol/api.d.ts +2 -0
- package/build/protocol/api.js +2 -0
- package/build/protocol/api.js.map +1 -0
- package/package.json +8 -8
package/build/DeviceStatus.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Battery20 as Battery20Icon, Battery30 as Battery30Icon, Battery50 as Battery50Icon, Battery60 as Battery60Icon, Battery80 as Battery80Icon, Battery90 as Battery90Icon, BatteryAlert as BatteryAlertIcon, BatteryCharging50 as BatteryCharging50Icon, BatteryFull as BatteryFullIcon, Bluetooth as IconConnectionBluetooth, Cable as IconConnectionLan, BluetoothDisabled as IconConnectionNoBluetooth, WifiOff as IconConnectionNoWifi, Wifi as IconConnectionWifi, Link as LinkIcon, LinkOff as LinkOffIcon, NetworkCheck as NetworkCheckIcon, Warning as WarningIcon, } from '@mui/icons-material';
|
|
2
2
|
import { IconButton, Tooltip } from '@mui/material';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import { useStateOrObject } from './hooks';
|
|
5
5
|
import Switch from './Switch';
|
|
6
|
+
import { getTranslation } from './Utils';
|
|
6
7
|
export const ACTIONS = {
|
|
7
8
|
STATUS: 'status',
|
|
8
9
|
DISABLE: 'disable',
|
|
@@ -90,11 +91,11 @@ function getBatteryIcon(battery) {
|
|
|
90
91
|
* @param props.status - Status object, e.g. { connection: 'connected', battery: 100, rssi: -50 }
|
|
91
92
|
*/
|
|
92
93
|
export default function DeviceStatus(props) {
|
|
94
|
+
let status;
|
|
93
95
|
if (!props.status) {
|
|
94
|
-
|
|
96
|
+
status = {};
|
|
95
97
|
}
|
|
96
|
-
|
|
97
|
-
if (typeof props.status === 'string') {
|
|
98
|
+
else if (typeof props.status === 'string') {
|
|
98
99
|
status = {
|
|
99
100
|
connection: props.status,
|
|
100
101
|
};
|
|
@@ -102,10 +103,16 @@ export default function DeviceStatus(props) {
|
|
|
102
103
|
else {
|
|
103
104
|
status = props.status;
|
|
104
105
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
const connection = useStateOrObject(status.connection, props.stateOrObjectHandler);
|
|
107
|
+
const rssi = useStateOrObject(status.rssi, props.stateOrObjectHandler);
|
|
108
|
+
const battery = useStateOrObject(status.battery, props.stateOrObjectHandler);
|
|
109
|
+
const warning = useStateOrObject(status.warning, props.stateOrObjectHandler);
|
|
110
|
+
const batteryIconTooltip = useMemo(() => {
|
|
111
|
+
if (typeof battery === 'number') {
|
|
112
|
+
return getBatteryIcon(battery);
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}, [battery]);
|
|
109
116
|
const disability = typeof props.enabled === 'boolean' ? (React.createElement(React.Fragment, null,
|
|
110
117
|
React.createElement("div", { style: { flexGrow: 1 } }),
|
|
111
118
|
React.createElement(Tooltip, { title: props.enabled ? getTranslation('disableIconTooltip') : getTranslation('enableIconTooltip'), slotProps: { popper: { sx: styles.tooltip } } },
|
|
@@ -115,33 +122,33 @@ export default function DeviceStatus(props) {
|
|
|
115
122
|
let connectionSymbol;
|
|
116
123
|
if (props.connectionType === 'wifi') {
|
|
117
124
|
connectionSymbol =
|
|
118
|
-
|
|
125
|
+
connection === 'connected' ? (React.createElement(IconConnectionWifi, { style: iconStyleOK })) : connection === 'disconnected' ? (React.createElement(IconConnectionNoWifi, { style: iconStyleNotOK })) : (React.createElement(IconConnectionWifi, { style: iconStyleUnknown }));
|
|
119
126
|
}
|
|
120
127
|
else if (props.connectionType === 'bluetooth') {
|
|
121
128
|
connectionSymbol =
|
|
122
|
-
|
|
129
|
+
connection === 'connected' ? (React.createElement(IconConnectionBluetooth, { style: iconStyleOK })) : connection === 'disconnected' ? (React.createElement(IconConnectionNoBluetooth, { style: iconStyleNotOK })) : (React.createElement(IconConnectionBluetooth, { style: iconStyleUnknown }));
|
|
123
130
|
}
|
|
124
131
|
else if (props.connectionType === 'lan') {
|
|
125
132
|
connectionSymbol =
|
|
126
|
-
|
|
133
|
+
connection === 'connected' ? (React.createElement(IconConnectionLan, { style: iconStyleOK })) : connection === 'disconnected' ? (React.createElement(IconConnectionLan, { style: iconStyleNotOK })) : (React.createElement(IconConnectionLan, { style: iconStyleUnknown }));
|
|
127
134
|
}
|
|
128
135
|
else if (props.connectionType === 'thread') {
|
|
129
136
|
connectionSymbol =
|
|
130
|
-
|
|
137
|
+
connection === 'connected' ? (React.createElement(ThreadIcon, { style: iconStyleOK })) : connection === 'disconnected' ? (React.createElement(ThreadIcon, { style: iconStyleNotOK })) : (React.createElement(ThreadIcon, { style: iconStyleUnknown }));
|
|
131
138
|
}
|
|
132
139
|
else if (props.connectionType === 'z-wave') {
|
|
133
140
|
connectionSymbol =
|
|
134
|
-
|
|
141
|
+
connection === 'connected' ? (React.createElement(ZWaveIcon, { style: iconStyleOK })) : connection === 'disconnected' ? (React.createElement(ZWaveIcon, { style: iconStyleNotOK })) : (React.createElement(ZWaveIcon, { style: iconStyleUnknown }));
|
|
135
142
|
}
|
|
136
143
|
else if (props.connectionType === 'zigbee') {
|
|
137
144
|
connectionSymbol =
|
|
138
|
-
|
|
145
|
+
connection === 'connected' ? (React.createElement(ZigBeeIcon, { style: iconStyleOK })) : connection === 'disconnected' ? (React.createElement(ZigBeeIcon, { style: iconStyleNotOK })) : (React.createElement(ZigBeeIcon, { style: iconStyleUnknown }));
|
|
139
146
|
}
|
|
140
147
|
else {
|
|
141
148
|
connectionSymbol =
|
|
142
|
-
|
|
149
|
+
connection === 'connected' ? (React.createElement(LinkIcon, { style: iconStyleOK })) : connection === 'disconnected' ? (React.createElement(LinkOffIcon, { style: iconStyleNotOK })) : null;
|
|
143
150
|
}
|
|
144
|
-
const connectionIcon =
|
|
151
|
+
const connectionIcon = connection === 'connected' || connection === 'disconnected' ? (React.createElement(Tooltip, { title: (connection === 'connected'
|
|
145
152
|
? getTranslation('connectedIconTooltip')
|
|
146
153
|
: getTranslation('disconnectedIconTooltip')) +
|
|
147
154
|
(props.statusAction
|
|
@@ -162,25 +169,25 @@ export default function DeviceStatus(props) {
|
|
|
162
169
|
gap: 8,
|
|
163
170
|
} },
|
|
164
171
|
connectionIcon,
|
|
165
|
-
|
|
172
|
+
rssi && (React.createElement(Tooltip, { title: "RSSI", slotProps: { popper: { sx: styles.tooltip } } },
|
|
166
173
|
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
167
|
-
React.createElement(NetworkCheckIcon, { style: { color: rssiColor(
|
|
168
|
-
React.createElement("p", { style: { fontSize: 'small', margin: 0 } },
|
|
169
|
-
typeof
|
|
174
|
+
React.createElement(NetworkCheckIcon, { style: { color: rssiColor(rssi, props.theme.palette.mode) } }),
|
|
175
|
+
React.createElement("p", { style: { fontSize: 'small', margin: 0 } }, rssi)))),
|
|
176
|
+
typeof battery === 'number' && (React.createElement(Tooltip, { title: getTranslation('batteryTooltip'), slotProps: { popper: { sx: styles.tooltip } } },
|
|
170
177
|
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
171
178
|
batteryIconTooltip,
|
|
172
179
|
React.createElement("p", { style: { fontSize: 'small', margin: 0 } },
|
|
173
|
-
|
|
180
|
+
battery,
|
|
174
181
|
"%")))),
|
|
175
|
-
typeof
|
|
182
|
+
typeof battery === 'string' && (React.createElement(Tooltip, { title: getTranslation('batteryTooltip'), slotProps: { popper: { sx: styles.tooltip } } },
|
|
176
183
|
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
React.createElement("span", { style: { marginRight: 4 } },
|
|
184
|
+
battery === 'charging' ? React.createElement(BatteryCharging50Icon, null) : React.createElement(BatteryFullIcon, null),
|
|
185
|
+
battery !== 'charging' ? (battery.includes('V') || battery.includes('mV') ? (React.createElement("p", { style: { fontSize: 'small', margin: 0 } }, battery)) : (React.createElement("p", { style: { fontSize: 'small', margin: 0 } },
|
|
186
|
+
React.createElement("span", { style: { marginRight: 4 } }, battery),
|
|
180
187
|
"mV"))) : null))),
|
|
181
|
-
typeof
|
|
182
|
-
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
183
|
-
|
|
188
|
+
typeof battery === 'boolean' && (React.createElement(Tooltip, { title: getTranslation('batteryTooltip'), slotProps: { popper: { sx: styles.tooltip } } },
|
|
189
|
+
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } }, battery ? (React.createElement(BatteryFullIcon, { style: iconStyleOK })) : (React.createElement(BatteryAlertIcon, { style: iconStyleNotOK }))))),
|
|
190
|
+
warning ? (typeof warning === 'string' || typeof warning === 'object' ? (React.createElement(Tooltip, { title: getTranslation(warning), slotProps: { popper: { sx: styles.tooltip } } },
|
|
184
191
|
React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
185
192
|
React.createElement(WarningIcon, { style: iconStyleWarning })))) : (React.createElement("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center' } },
|
|
186
193
|
React.createElement(WarningIcon, { style: iconStyleWarning })))) : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceStatus.js","sourceRoot":"./src/","sources":["DeviceStatus.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { type CSSProperties, type MouseEvent } from 'react';\nimport { IconButton, Tooltip } from '@mui/material';\n\nimport {\n Link as LinkIcon,\n LinkOff as LinkOffIcon,\n NetworkCheck as NetworkCheckIcon,\n Battery20 as Battery20Icon,\n Battery30 as Battery30Icon,\n Battery50 as Battery50Icon,\n Battery60 as Battery60Icon,\n Battery80 as Battery80Icon,\n Battery90 as Battery90Icon,\n BatteryFull as BatteryFullIcon,\n BatteryAlert as BatteryAlertIcon,\n Warning as WarningIcon,\n BatteryCharging50 as BatteryCharging50Icon,\n Cable as IconConnectionLan,\n Wifi as IconConnectionWifi,\n WifiOff as IconConnectionNoWifi,\n Bluetooth as IconConnectionBluetooth,\n BluetoothDisabled as IconConnectionNoBluetooth,\n} from '@mui/icons-material';\n\nimport type { DeviceStatus, DeviceAction, ActionBase, ConfigConnectionType } from '@iobroker/dm-utils';\nimport type { IobTheme, ThemeType } from '@iobroker/adapter-react-v5';\n\nimport { getTranslation } from './Utils';\nimport Switch from './Switch';\n\nexport const ACTIONS = {\n STATUS: 'status',\n DISABLE: 'disable',\n ENABLE: 'enable',\n};\n\nconst styles: Record<string, React.CSSProperties> = {\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nexport interface IconProps {\n /** The width in pixels or percentage of the icon. */\n width?: number | string;\n /** The height in pixels or percentage of the icon. */\n height?: number | string;\n /** Click handler. */\n onClick?: (e: MouseEvent) => void;\n /** The class name for the SVG element. */\n className?: string;\n /** Styles for the SVG element. */\n style?: CSSProperties;\n /** The font size of the icon. */\n fontSize?: 'small';\n}\n\nfunction ThreadIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 165 165\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M82.498,0C37.008,0,0,37.008,0,82.496c0,45.181,36.51,81.977,81.573,82.476V82.569l-27.002-0.002 c-8.023,0-14.554,6.53-14.554,14.561c0,8.023,6.531,14.551,14.554,14.551v17.98c-17.939,0-32.534-14.595-32.534-32.531 c0-17.944,14.595-32.543,32.534-32.543l27.002,0.004v-9.096c0-14.932,12.146-27.08,27.075-27.08 c14.932,0,27.082,12.148,27.082,27.08c0,14.931-12.15,27.08-27.082,27.08l-9.097-0.001v80.641 C136.889,155.333,165,122.14,165,82.496C165,37.008,127.99,0,82.498,0z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M117.748,55.493c0-5.016-4.082-9.098-9.1-9.098c-5.015,0-9.097,4.082-9.097,9.098v9.097l9.097,0.001 C113.666,64.591,117.748,60.51,117.748,55.493z\"\n />\n </svg>\n );\n}\n\nfunction ZWaveIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 1073 1068\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M716 1.1C632.9 5.3 549.8 23.7 472 55c-66.4 26.7-132.6 65.5-188.5 110.4-43.8 35.1-85.2 76.7-120.1 120.6C72.4 400.4 16.7 539.8 3.5 686 1.8 705.1-.1 754.7.7 758c.5 2 1 2 49.7 1.8l49.1-.3.7-20c2.4-64.6 13.4-126 33.2-186 80.8-243.9 297-419.9 552.1-449.4 20.2-2.4 44.2-4.1 56.6-4.1h8.9V50 0l-9.7.1c-5.4.1-16.8.6-25.3 1zm-.8 208c-78.5 4.7-158 27.4-226.5 64.5-68.7 37.3-126.4 86.3-175.2 148.9-11 14-33.2 47.3-42.3 63.5-44 77.8-68.6 164.9-70.9 251.2l-.6 22.8h49.5 49.4l1.2-19c6.3-98.7 40-185.8 102.2-263.3 12.7-15.9 41.2-45.2 57-58.7 66.1-56.3 142.1-91.8 226-105.5 18.9-3 44.1-5.5 56.7-5.5h9.3v-50-50l-11.2.1c-6.2.1-17.3.6-24.6 1zm17.8 251c-104.5 9.2-195.2 69.7-243.6 162.4-43.9 84-45.5 184.2-4.5 270 60.3 125.9 198.1 194.2 334.9 166 46.6-9.7 89.5-29.7 127.2-59.6 13.5-10.7 37.3-34.5 48-47.9 34.2-43.1 55.2-92 63.7-148.6 2.2-15.1 2.5-62.7.5-77.4-3.6-25.2-10.1-51.4-17.8-71.2-10.1-26.2-29.4-59.7-47-81.8-9.7-12.1-35-37.2-47.4-47-47.8-37.9-104.5-60.1-165.4-65-14.7-1.1-34.7-1.1-48.6.1zm174.7 138.6c-.3.5-30.9 49.2-68.1 108.3L772 814.5l67.9.5 68 .5-30.1 48.8-30 48.7h-131c-104.4 0-130.9-.3-130.5-1.3.2-.6 32.7-51.1 72.1-112.1L730 687.9c0-.5-29.5-1-66.5-1.1l-66.6-.3 27.7-44.3 27.6-44.2h128l127.5.7z\"\n />\n </svg>\n );\n}\n\nfunction ZigBeeIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 48 48\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M32.042,9.792c4.595,1.238,4.88,3.165,5.524,5.048C34.841,17.664,17.35,35.7,17.35,35.7 s10.901,1.177,23.487-1.003c-0.001,0.029-0.002,0.048-0.003,0.076C42.829,31.661,44,27.97,44,24c0-11.046-8.954-20-20-20 c-5.634,0-10.715,2.338-14.35,6.087C15.489,9.124,26.89,8.403,32.042,9.792z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M14.724,37.285c-1.982-0.347-4.212-2.131-4.707-5.302c1.437-1.239,19.994-20.507,19.994-20.507 c-7.008-0.424-14.569-0.465-22.237,0.864C5.408,15.625,4,19.644,4,24c0,11.046,8.954,20,20,20c6.173,0,11.689-2.8,15.358-7.195 C35.486,37.33,23.257,38.769,14.724,37.285z\"\n />\n </svg>\n );\n}\n\ninterface DeviceStatusProps {\n status: DeviceStatus | null;\n deviceId: string;\n connectionType?: ConfigConnectionType;\n statusAction?: DeviceAction;\n enabled?: boolean;\n disableEnableAction?: DeviceAction;\n deviceHandler: (deviceId: string, action: ActionBase, refresh: () => void) => () => void;\n refresh: () => void;\n theme: IobTheme;\n}\n\nfunction rssiColor(signal: number, themeType: ThemeType): string {\n if (signal < -80) {\n return themeType === 'dark' ? '#ff5c5c' : '#aa0000';\n }\n if (signal < -60) {\n return themeType === 'dark' ? '#fa8547' : '#ae5c00';\n }\n if (signal < -50) {\n return themeType === 'dark' ? '#cdff4f' : '#7b9500';\n }\n\n return themeType === 'dark' ? '#5cff5c' : '#008500';\n}\n\nconst iconStyleOK = {\n fill: '#00ac00',\n color: '#00ac00',\n};\nconst iconStyleNotOK = {\n fill: '#ff0000',\n color: '#ff0000',\n};\nconst iconStyleWarning = {\n fill: '#da8200',\n color: '#da8200',\n};\nconst iconStyleUnknown = {\n fill: '#8a8a8a',\n color: '#8a8a8a',\n};\nconst iconStylePreWarning = {\n fill: '#ffcc00',\n color: '#ffcc00',\n};\n\nfunction getBatteryIcon(battery: number): React.ReactNode {\n if (battery > 95) {\n return <BatteryFullIcon style={iconStyleOK} />;\n }\n if (battery > 85 && battery <= 95) {\n return <Battery90Icon style={iconStyleOK} />;\n }\n if (battery > 70 && battery <= 85) {\n return <Battery80Icon style={iconStyleOK} />;\n }\n if (battery > 55 && battery <= 70) {\n return <Battery60Icon style={iconStyleOK} />;\n }\n if (battery > 40 && battery <= 55) {\n return <Battery50Icon style={iconStylePreWarning} />;\n }\n if (battery > 25 && battery <= 40) {\n return <Battery30Icon style={iconStylePreWarning} />;\n }\n if (battery > 10 && battery <= 25) {\n return <Battery20Icon style={iconStyleWarning} />;\n }\n\n return <BatteryAlertIcon style={iconStyleNotOK} />;\n}\n\n/**\n * Device Status component\n *\n * @param props - Parameters\n * @param props.status - Status object, e.g. { connection: 'connected', battery: 100, rssi: -50 }\n */\nexport default function DeviceStatus(props: DeviceStatusProps): React.JSX.Element | null {\n if (!props.status) {\n return null;\n }\n\n let status: DeviceStatus;\n\n if (typeof props.status === 'string') {\n status = {\n connection: props.status,\n };\n } else {\n status = props.status;\n }\n\n let batteryIconTooltip: React.ReactNode = null;\n if (typeof status.battery === 'number') {\n batteryIconTooltip = getBatteryIcon(status.battery);\n }\n\n const disability =\n typeof props.enabled === 'boolean' ? (\n <>\n <div style={{ flexGrow: 1 }} />\n {\n <Tooltip\n title={\n props.enabled ? getTranslation('disableIconTooltip') : getTranslation('enableIconTooltip')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <Switch\n size=\"small\"\n checked={props.enabled}\n disabled={!props.disableEnableAction}\n onChange={() =>\n props.disableEnableAction &&\n props.deviceHandler(props.deviceId, props.disableEnableAction, props.refresh)()\n }\n theme={props.theme}\n />\n </div>\n </Tooltip>\n }\n </>\n ) : null;\n let connectionSymbol: React.JSX.Element | null;\n if (props.connectionType === 'wifi') {\n connectionSymbol =\n status.connection === 'connected' ? (\n <IconConnectionWifi style={iconStyleOK} />\n ) : status.connection === 'disconnected' ? (\n <IconConnectionNoWifi style={iconStyleNotOK} />\n ) : (\n <IconConnectionWifi style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'bluetooth') {\n connectionSymbol =\n status.connection === 'connected' ? (\n <IconConnectionBluetooth style={iconStyleOK} />\n ) : status.connection === 'disconnected' ? (\n <IconConnectionNoBluetooth style={iconStyleNotOK} />\n ) : (\n <IconConnectionBluetooth style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'lan') {\n connectionSymbol =\n status.connection === 'connected' ? (\n <IconConnectionLan style={iconStyleOK} />\n ) : status.connection === 'disconnected' ? (\n <IconConnectionLan style={iconStyleNotOK} />\n ) : (\n <IconConnectionLan style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'thread') {\n connectionSymbol =\n status.connection === 'connected' ? (\n <ThreadIcon style={iconStyleOK} />\n ) : status.connection === 'disconnected' ? (\n <ThreadIcon style={iconStyleNotOK} />\n ) : (\n <ThreadIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'z-wave') {\n connectionSymbol =\n status.connection === 'connected' ? (\n <ZWaveIcon style={iconStyleOK} />\n ) : status.connection === 'disconnected' ? (\n <ZWaveIcon style={iconStyleNotOK} />\n ) : (\n <ZWaveIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'zigbee') {\n connectionSymbol =\n status.connection === 'connected' ? (\n <ZigBeeIcon style={iconStyleOK} />\n ) : status.connection === 'disconnected' ? (\n <ZigBeeIcon style={iconStyleNotOK} />\n ) : (\n <ZigBeeIcon style={iconStyleUnknown} />\n );\n } else {\n connectionSymbol =\n status.connection === 'connected' ? (\n <LinkIcon style={iconStyleOK} />\n ) : status.connection === 'disconnected' ? (\n <LinkOffIcon style={iconStyleNotOK} />\n ) : null;\n }\n\n const connectionIcon =\n status.connection === 'connected' || status.connection === 'disconnected' ? (\n <Tooltip\n title={\n (status.connection === 'connected'\n ? getTranslation('connectedIconTooltip')\n : getTranslation('disconnectedIconTooltip')) +\n (props.statusAction\n ? `. ${getTranslation(props.statusAction.description || 'moreInformation')}`\n : '')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n {props.statusAction ? (\n <IconButton\n onClick={e => {\n if (props.statusAction) {\n e.stopPropagation();\n props.deviceHandler(props.deviceId, props.statusAction, props.refresh)();\n }\n }}\n >\n {connectionSymbol}\n <div style={{ position: 'absolute', top: 0, left: 0, color: 'grey' }}>*</div>\n </IconButton>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {connectionSymbol}\n </div>\n )}\n </Tooltip>\n ) : (\n connectionSymbol\n );\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n cursor: props.statusAction ? 'pointer' : undefined,\n width: props.disableEnableAction ? '100%' : undefined,\n gap: 8,\n }}\n >\n {connectionIcon}\n\n {status.rssi && (\n <Tooltip\n title=\"RSSI\"\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <NetworkCheckIcon style={{ color: rssiColor(status.rssi, props.theme.palette.mode) }} />\n <p style={{ fontSize: 'small', margin: 0 }}>{status.rssi}</p>\n </div>\n </Tooltip>\n )}\n\n {typeof status.battery === 'number' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {batteryIconTooltip}\n <p style={{ fontSize: 'small', margin: 0 }}>{status.battery}%</p>\n </div>\n </Tooltip>\n )}\n\n {typeof status.battery === 'string' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {status.battery === 'charging' ? <BatteryCharging50Icon /> : <BatteryFullIcon />}\n {status.battery !== 'charging' ? (\n status.battery.includes('V') || status.battery.includes('mV') ? (\n <p style={{ fontSize: 'small', margin: 0 }}>{status.battery}</p>\n ) : (\n <p style={{ fontSize: 'small', margin: 0 }}>\n <span style={{ marginRight: 4 }}>{status.battery}</span>\n mV\n </p>\n )\n ) : null}\n </div>\n </Tooltip>\n )}\n\n {typeof status.battery === 'boolean' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {status.battery ? (\n <BatteryFullIcon style={iconStyleOK} />\n ) : (\n <BatteryAlertIcon style={iconStyleNotOK} />\n )}\n </div>\n </Tooltip>\n )}\n\n {status.warning ? (\n typeof status.warning === 'string' || typeof status.warning === 'object' ? (\n <Tooltip\n title={getTranslation(status.warning)}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n </Tooltip>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n )\n ) : null}\n\n {disability}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DeviceStatus.js","sourceRoot":"./src/","sources":["DeviceStatus.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Connection, IobTheme, ThemeType } from '@iobroker/adapter-react-v5';\nimport {\n Battery20 as Battery20Icon,\n Battery30 as Battery30Icon,\n Battery50 as Battery50Icon,\n Battery60 as Battery60Icon,\n Battery80 as Battery80Icon,\n Battery90 as Battery90Icon,\n BatteryAlert as BatteryAlertIcon,\n BatteryCharging50 as BatteryCharging50Icon,\n BatteryFull as BatteryFullIcon,\n Bluetooth as IconConnectionBluetooth,\n Cable as IconConnectionLan,\n BluetoothDisabled as IconConnectionNoBluetooth,\n WifiOff as IconConnectionNoWifi,\n Wifi as IconConnectionWifi,\n Link as LinkIcon,\n LinkOff as LinkOffIcon,\n NetworkCheck as NetworkCheckIcon,\n Warning as WarningIcon,\n} from '@mui/icons-material';\nimport { IconButton, Tooltip } from '@mui/material';\nimport React, { useMemo, type CSSProperties, type MouseEvent } from 'react';\nimport { useStateOrObject } from './hooks';\nimport type { ActionBase, ConfigConnectionType, DeviceAction, DeviceId, DeviceStatus } from './protocol/api';\nimport Switch from './Switch';\nimport { getTranslation } from './Utils';\nimport type { StateOrObjectHandler } from './StateOrObjectHandler';\n\nexport const ACTIONS = {\n STATUS: 'status',\n DISABLE: 'disable',\n ENABLE: 'enable',\n};\n\nconst styles: Record<string, React.CSSProperties> = {\n tooltip: {\n pointerEvents: 'none',\n },\n};\n\nexport interface IconProps {\n /** The width in pixels or percentage of the icon. */\n width?: number | string;\n /** The height in pixels or percentage of the icon. */\n height?: number | string;\n /** Click handler. */\n onClick?: (e: MouseEvent) => void;\n /** The class name for the SVG element. */\n className?: string;\n /** Styles for the SVG element. */\n style?: CSSProperties;\n /** The font size of the icon. */\n fontSize?: 'small';\n}\n\nfunction ThreadIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 165 165\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M82.498,0C37.008,0,0,37.008,0,82.496c0,45.181,36.51,81.977,81.573,82.476V82.569l-27.002-0.002 c-8.023,0-14.554,6.53-14.554,14.561c0,8.023,6.531,14.551,14.554,14.551v17.98c-17.939,0-32.534-14.595-32.534-32.531 c0-17.944,14.595-32.543,32.534-32.543l27.002,0.004v-9.096c0-14.932,12.146-27.08,27.075-27.08 c14.932,0,27.082,12.148,27.082,27.08c0,14.931-12.15,27.08-27.082,27.08l-9.097-0.001v80.641 C136.889,155.333,165,122.14,165,82.496C165,37.008,127.99,0,82.498,0z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M117.748,55.493c0-5.016-4.082-9.098-9.1-9.098c-5.015,0-9.097,4.082-9.097,9.098v9.097l9.097,0.001 C113.666,64.591,117.748,60.51,117.748,55.493z\"\n />\n </svg>\n );\n}\n\nfunction ZWaveIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 1073 1068\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M716 1.1C632.9 5.3 549.8 23.7 472 55c-66.4 26.7-132.6 65.5-188.5 110.4-43.8 35.1-85.2 76.7-120.1 120.6C72.4 400.4 16.7 539.8 3.5 686 1.8 705.1-.1 754.7.7 758c.5 2 1 2 49.7 1.8l49.1-.3.7-20c2.4-64.6 13.4-126 33.2-186 80.8-243.9 297-419.9 552.1-449.4 20.2-2.4 44.2-4.1 56.6-4.1h8.9V50 0l-9.7.1c-5.4.1-16.8.6-25.3 1zm-.8 208c-78.5 4.7-158 27.4-226.5 64.5-68.7 37.3-126.4 86.3-175.2 148.9-11 14-33.2 47.3-42.3 63.5-44 77.8-68.6 164.9-70.9 251.2l-.6 22.8h49.5 49.4l1.2-19c6.3-98.7 40-185.8 102.2-263.3 12.7-15.9 41.2-45.2 57-58.7 66.1-56.3 142.1-91.8 226-105.5 18.9-3 44.1-5.5 56.7-5.5h9.3v-50-50l-11.2.1c-6.2.1-17.3.6-24.6 1zm17.8 251c-104.5 9.2-195.2 69.7-243.6 162.4-43.9 84-45.5 184.2-4.5 270 60.3 125.9 198.1 194.2 334.9 166 46.6-9.7 89.5-29.7 127.2-59.6 13.5-10.7 37.3-34.5 48-47.9 34.2-43.1 55.2-92 63.7-148.6 2.2-15.1 2.5-62.7.5-77.4-3.6-25.2-10.1-51.4-17.8-71.2-10.1-26.2-29.4-59.7-47-81.8-9.7-12.1-35-37.2-47.4-47-47.8-37.9-104.5-60.1-165.4-65-14.7-1.1-34.7-1.1-48.6.1zm174.7 138.6c-.3.5-30.9 49.2-68.1 108.3L772 814.5l67.9.5 68 .5-30.1 48.8-30 48.7h-131c-104.4 0-130.9-.3-130.5-1.3.2-.6 32.7-51.1 72.1-112.1L730 687.9c0-.5-29.5-1-66.5-1.1l-66.6-.3 27.7-44.3 27.6-44.2h128l127.5.7z\"\n />\n </svg>\n );\n}\n\nfunction ZigBeeIcon(props: IconProps): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n onClick={e => props.onClick && props.onClick(e)}\n viewBox=\"0 0 48 48\"\n width={props.width || (props.fontSize === 'small' ? 16 : 20)}\n height={props.height || props.width || (props.fontSize === 'small' ? 16 : 20)}\n className={props.className}\n style={props.style}\n >\n <path\n fill=\"currentColor\"\n d=\"M32.042,9.792c4.595,1.238,4.88,3.165,5.524,5.048C34.841,17.664,17.35,35.7,17.35,35.7 s10.901,1.177,23.487-1.003c-0.001,0.029-0.002,0.048-0.003,0.076C42.829,31.661,44,27.97,44,24c0-11.046-8.954-20-20-20 c-5.634,0-10.715,2.338-14.35,6.087C15.489,9.124,26.89,8.403,32.042,9.792z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M14.724,37.285c-1.982-0.347-4.212-2.131-4.707-5.302c1.437-1.239,19.994-20.507,19.994-20.507 c-7.008-0.424-14.569-0.465-22.237,0.864C5.408,15.625,4,19.644,4,24c0,11.046,8.954,20,20,20c6.173,0,11.689-2.8,15.358-7.195 C35.486,37.33,23.257,38.769,14.724,37.285z\"\n />\n </svg>\n );\n}\n\ninterface DeviceStatusProps {\n socket: Connection;\n status: DeviceStatus | null;\n deviceId: DeviceId;\n connectionType?: ConfigConnectionType;\n statusAction?: DeviceAction;\n enabled?: boolean;\n disableEnableAction?: DeviceAction;\n deviceHandler: (deviceId: DeviceId, action: ActionBase, refresh: () => void) => () => void;\n refresh: () => void;\n theme: IobTheme;\n stateOrObjectHandler: StateOrObjectHandler;\n}\n\nfunction rssiColor(signal: number, themeType: ThemeType): string {\n if (signal < -80) {\n return themeType === 'dark' ? '#ff5c5c' : '#aa0000';\n }\n if (signal < -60) {\n return themeType === 'dark' ? '#fa8547' : '#ae5c00';\n }\n if (signal < -50) {\n return themeType === 'dark' ? '#cdff4f' : '#7b9500';\n }\n\n return themeType === 'dark' ? '#5cff5c' : '#008500';\n}\n\nconst iconStyleOK = {\n fill: '#00ac00',\n color: '#00ac00',\n};\nconst iconStyleNotOK = {\n fill: '#ff0000',\n color: '#ff0000',\n};\nconst iconStyleWarning = {\n fill: '#da8200',\n color: '#da8200',\n};\nconst iconStyleUnknown = {\n fill: '#8a8a8a',\n color: '#8a8a8a',\n};\nconst iconStylePreWarning = {\n fill: '#ffcc00',\n color: '#ffcc00',\n};\n\nfunction getBatteryIcon(battery: number): React.ReactNode {\n if (battery > 95) {\n return <BatteryFullIcon style={iconStyleOK} />;\n }\n if (battery > 85 && battery <= 95) {\n return <Battery90Icon style={iconStyleOK} />;\n }\n if (battery > 70 && battery <= 85) {\n return <Battery80Icon style={iconStyleOK} />;\n }\n if (battery > 55 && battery <= 70) {\n return <Battery60Icon style={iconStyleOK} />;\n }\n if (battery > 40 && battery <= 55) {\n return <Battery50Icon style={iconStylePreWarning} />;\n }\n if (battery > 25 && battery <= 40) {\n return <Battery30Icon style={iconStylePreWarning} />;\n }\n if (battery > 10 && battery <= 25) {\n return <Battery20Icon style={iconStyleWarning} />;\n }\n\n return <BatteryAlertIcon style={iconStyleNotOK} />;\n}\n\n/**\n * Device Status component\n *\n * @param props - Parameters\n * @param props.status - Status object, e.g. { connection: 'connected', battery: 100, rssi: -50 }\n */\nexport default function DeviceStatus(props: DeviceStatusProps): React.JSX.Element | null {\n let status: DeviceStatus;\n if (!props.status) {\n status = {};\n } else if (typeof props.status === 'string') {\n status = {\n connection: props.status,\n };\n } else {\n status = props.status;\n }\n\n const connection = useStateOrObject(status.connection, props.stateOrObjectHandler);\n const rssi = useStateOrObject(status.rssi, props.stateOrObjectHandler);\n const battery = useStateOrObject(status.battery, props.stateOrObjectHandler);\n const warning = useStateOrObject(status.warning, props.stateOrObjectHandler);\n\n const batteryIconTooltip = useMemo<React.ReactNode>(() => {\n if (typeof battery === 'number') {\n return getBatteryIcon(battery);\n }\n return null;\n }, [battery]);\n\n const disability =\n typeof props.enabled === 'boolean' ? (\n <>\n <div style={{ flexGrow: 1 }} />\n {\n <Tooltip\n title={\n props.enabled ? getTranslation('disableIconTooltip') : getTranslation('enableIconTooltip')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <Switch\n size=\"small\"\n checked={props.enabled}\n disabled={!props.disableEnableAction}\n onChange={() =>\n props.disableEnableAction &&\n props.deviceHandler(props.deviceId, props.disableEnableAction, props.refresh)()\n }\n theme={props.theme}\n />\n </div>\n </Tooltip>\n }\n </>\n ) : null;\n let connectionSymbol: React.JSX.Element | null;\n if (props.connectionType === 'wifi') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionWifi style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionNoWifi style={iconStyleNotOK} />\n ) : (\n <IconConnectionWifi style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'bluetooth') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionBluetooth style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionNoBluetooth style={iconStyleNotOK} />\n ) : (\n <IconConnectionBluetooth style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'lan') {\n connectionSymbol =\n connection === 'connected' ? (\n <IconConnectionLan style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <IconConnectionLan style={iconStyleNotOK} />\n ) : (\n <IconConnectionLan style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'thread') {\n connectionSymbol =\n connection === 'connected' ? (\n <ThreadIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ThreadIcon style={iconStyleNotOK} />\n ) : (\n <ThreadIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'z-wave') {\n connectionSymbol =\n connection === 'connected' ? (\n <ZWaveIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ZWaveIcon style={iconStyleNotOK} />\n ) : (\n <ZWaveIcon style={iconStyleUnknown} />\n );\n } else if (props.connectionType === 'zigbee') {\n connectionSymbol =\n connection === 'connected' ? (\n <ZigBeeIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <ZigBeeIcon style={iconStyleNotOK} />\n ) : (\n <ZigBeeIcon style={iconStyleUnknown} />\n );\n } else {\n connectionSymbol =\n connection === 'connected' ? (\n <LinkIcon style={iconStyleOK} />\n ) : connection === 'disconnected' ? (\n <LinkOffIcon style={iconStyleNotOK} />\n ) : null;\n }\n\n const connectionIcon =\n connection === 'connected' || connection === 'disconnected' ? (\n <Tooltip\n title={\n (connection === 'connected'\n ? getTranslation('connectedIconTooltip')\n : getTranslation('disconnectedIconTooltip')) +\n (props.statusAction\n ? `. ${getTranslation(props.statusAction.description || 'moreInformation')}`\n : '')\n }\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n {props.statusAction ? (\n <IconButton\n onClick={e => {\n if (props.statusAction) {\n e.stopPropagation();\n props.deviceHandler(props.deviceId, props.statusAction, props.refresh)();\n }\n }}\n >\n {connectionSymbol}\n <div style={{ position: 'absolute', top: 0, left: 0, color: 'grey' }}>*</div>\n </IconButton>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {connectionSymbol}\n </div>\n )}\n </Tooltip>\n ) : (\n connectionSymbol\n );\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n cursor: props.statusAction ? 'pointer' : undefined,\n width: props.disableEnableAction ? '100%' : undefined,\n gap: 8,\n }}\n >\n {connectionIcon}\n\n {rssi && (\n <Tooltip\n title=\"RSSI\"\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <NetworkCheckIcon style={{ color: rssiColor(rssi, props.theme.palette.mode) }} />\n <p style={{ fontSize: 'small', margin: 0 }}>{rssi}</p>\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'number' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {batteryIconTooltip}\n <p style={{ fontSize: 'small', margin: 0 }}>{battery}%</p>\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'string' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {battery === 'charging' ? <BatteryCharging50Icon /> : <BatteryFullIcon />}\n {battery !== 'charging' ? (\n battery.includes('V') || battery.includes('mV') ? (\n <p style={{ fontSize: 'small', margin: 0 }}>{battery}</p>\n ) : (\n <p style={{ fontSize: 'small', margin: 0 }}>\n <span style={{ marginRight: 4 }}>{battery}</span>\n mV\n </p>\n )\n ) : null}\n </div>\n </Tooltip>\n )}\n\n {typeof battery === 'boolean' && (\n <Tooltip\n title={getTranslation('batteryTooltip')}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {battery ? (\n <BatteryFullIcon style={iconStyleOK} />\n ) : (\n <BatteryAlertIcon style={iconStyleNotOK} />\n )}\n </div>\n </Tooltip>\n )}\n\n {warning ? (\n typeof warning === 'string' || typeof warning === 'object' ? (\n <Tooltip\n title={getTranslation(warning)}\n slotProps={{ popper: { sx: styles.tooltip } }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n </Tooltip>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <WarningIcon style={iconStyleWarning} />\n </div>\n )\n ) : null}\n\n {disability}\n </div>\n );\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { ActionBase, InstanceAction } from '
|
|
2
|
+
import type { ActionBase, InstanceAction } from './protocol/api';
|
|
3
3
|
interface InstanceActionButtonProps {
|
|
4
4
|
action: InstanceAction;
|
|
5
5
|
instanceHandler: (action: ActionBase) => () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstanceActionButton.js","sourceRoot":"./src/","sources":["InstanceActionButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO3D,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAiC;IAC1E,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAE3C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEtC,OAAO,CACH,oBAAC,aAAa,IACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAClC,CACL,CAAC;AACN,CAAC","sourcesContent":["import React from 'react';\n\nimport type { ActionBase, InstanceAction } from '
|
|
1
|
+
{"version":3,"file":"InstanceActionButton.js","sourceRoot":"./src/","sources":["InstanceActionButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAO3D,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAiC;IAC1E,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAE3C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEhE,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEtC,OAAO,CACH,oBAAC,aAAa,IACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,GAClC,CACL,CAAC;AACN,CAAC","sourcesContent":["import React from 'react';\n\nimport type { ActionBase, InstanceAction } from './protocol/api';\n\nimport TooltipButton from './TooltipButton';\nimport { getTranslation, renderActionIcon } from './Utils';\n\ninterface InstanceActionButtonProps {\n action: InstanceAction;\n instanceHandler: (action: ActionBase) => () => void;\n}\n\nexport default function InstanceActionButton(params: InstanceActionButtonProps): React.JSX.Element | null {\n const { action, instanceHandler } = params;\n\n const tooltip = getTranslation(action?.description ? action.description : '');\n const title = getTranslation(action?.title ? action.title : '');\n\n const icon = renderActionIcon(action);\n\n return (\n <TooltipButton\n tooltip={tooltip}\n label={title}\n disabled={action.disabled}\n Icon={icon}\n onClick={instanceHandler(action)}\n />\n );\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Connection } from '@iobroker/adapter-react-v5';
|
|
2
|
+
import type { ValueOrStateOrObject } from '@iobroker/dm-utils';
|
|
3
|
+
export declare class StateOrObjectHandler {
|
|
4
|
+
private readonly socket;
|
|
5
|
+
private readonly objectSubs;
|
|
6
|
+
private readonly stateSubs;
|
|
7
|
+
constructor(socket: Connection);
|
|
8
|
+
addListener<T extends ioBroker.StringOrTranslated | number | boolean>(item: ValueOrStateOrObject<T> | undefined, callback: (value: T | undefined) => void): Promise<void>;
|
|
9
|
+
unsubscribe(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export class StateOrObjectHandler {
|
|
2
|
+
socket;
|
|
3
|
+
objectSubs = new Map();
|
|
4
|
+
stateSubs = new Map();
|
|
5
|
+
constructor(socket) {
|
|
6
|
+
this.socket = socket;
|
|
7
|
+
}
|
|
8
|
+
async addListener(item, callback) {
|
|
9
|
+
if (item === undefined) {
|
|
10
|
+
callback(undefined);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (typeof item !== 'object') {
|
|
14
|
+
callback(item);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if ('en' in item) {
|
|
18
|
+
callback(item);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
if ('objectId' in item) {
|
|
23
|
+
const notifyValue = (obj) => {
|
|
24
|
+
if (!obj) {
|
|
25
|
+
callback(undefined);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const parts = item.property.split('.');
|
|
29
|
+
let current = obj;
|
|
30
|
+
for (const part of parts) {
|
|
31
|
+
if (current[part] === undefined) {
|
|
32
|
+
callback(undefined);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
current = current[part];
|
|
36
|
+
}
|
|
37
|
+
callback(current);
|
|
38
|
+
};
|
|
39
|
+
const existing = this.objectSubs.get(item.objectId);
|
|
40
|
+
if (existing) {
|
|
41
|
+
existing.notifiers.push(notifyValue);
|
|
42
|
+
if (existing.loaded) {
|
|
43
|
+
// Already have the value — notify immediately without re-fetching
|
|
44
|
+
notifyValue(existing.cached);
|
|
45
|
+
}
|
|
46
|
+
// If still loading, notifyValue will be called once the load completes
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const sub = {
|
|
50
|
+
notifiers: [notifyValue],
|
|
51
|
+
handler: null,
|
|
52
|
+
loaded: false,
|
|
53
|
+
cached: undefined,
|
|
54
|
+
};
|
|
55
|
+
this.objectSubs.set(item.objectId, sub);
|
|
56
|
+
const handler = (_id, obj) => {
|
|
57
|
+
sub.cached = obj;
|
|
58
|
+
for (const n of sub.notifiers) {
|
|
59
|
+
n(obj);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
sub.handler = handler;
|
|
63
|
+
const obj = await this.socket.getObject(item.objectId);
|
|
64
|
+
sub.cached = obj;
|
|
65
|
+
sub.loaded = true;
|
|
66
|
+
// Notify all notifiers (including any added while the fetch was in progress)
|
|
67
|
+
for (const n of sub.notifiers) {
|
|
68
|
+
n(obj);
|
|
69
|
+
}
|
|
70
|
+
await this.socket.subscribeObject(item.objectId, handler);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if ('stateId' in item) {
|
|
74
|
+
const notifyValue = (state) => {
|
|
75
|
+
let val = state?.val;
|
|
76
|
+
if (val === undefined || val === null) {
|
|
77
|
+
callback(undefined);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (item.mapping) {
|
|
81
|
+
if (typeof val === 'boolean') {
|
|
82
|
+
val = val.toString();
|
|
83
|
+
}
|
|
84
|
+
callback(item.mapping[val]);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
callback(val);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const existing = this.stateSubs.get(item.stateId);
|
|
91
|
+
if (existing) {
|
|
92
|
+
existing.notifiers.push(notifyValue);
|
|
93
|
+
if (existing.loaded) {
|
|
94
|
+
// Already have the value — notify immediately without re-fetching
|
|
95
|
+
notifyValue(existing.cached);
|
|
96
|
+
}
|
|
97
|
+
// If still loading, notifyValue will be called once the load completes
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const sub = {
|
|
101
|
+
notifiers: [notifyValue],
|
|
102
|
+
handler: null,
|
|
103
|
+
loaded: false,
|
|
104
|
+
cached: undefined,
|
|
105
|
+
};
|
|
106
|
+
this.stateSubs.set(item.stateId, sub);
|
|
107
|
+
const handler = (_id, state) => {
|
|
108
|
+
sub.cached = state;
|
|
109
|
+
for (const n of sub.notifiers) {
|
|
110
|
+
n(state);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
sub.handler = handler;
|
|
114
|
+
const state = await this.socket.getState(item.stateId);
|
|
115
|
+
sub.cached = state;
|
|
116
|
+
sub.loaded = true;
|
|
117
|
+
// Notify all notifiers (including any added while the fetch was in progress)
|
|
118
|
+
for (const n of sub.notifiers) {
|
|
119
|
+
n(state);
|
|
120
|
+
}
|
|
121
|
+
await this.socket.subscribeState(item.stateId, handler);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('Error in StateOrObjectHandler:', item, error);
|
|
127
|
+
}
|
|
128
|
+
callback(undefined);
|
|
129
|
+
}
|
|
130
|
+
async unsubscribe() {
|
|
131
|
+
for (const [id, sub] of this.objectSubs) {
|
|
132
|
+
await this.socket.unsubscribeObject(id, sub.handler);
|
|
133
|
+
}
|
|
134
|
+
this.objectSubs.clear();
|
|
135
|
+
for (const [id, sub] of this.stateSubs) {
|
|
136
|
+
this.socket.unsubscribeState(id, sub.handler);
|
|
137
|
+
}
|
|
138
|
+
this.stateSubs.clear();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=StateOrObjectHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateOrObjectHandler.js","sourceRoot":"./src/","sources":["StateOrObjectHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Connection, ObjectChangeHandler } from '@iobroker/adapter-react-v5';\nimport type { ValueOrStateOrObject } from '@iobroker/dm-utils';\n\ninterface ObjectSubscription {\n notifiers: ((obj?: ioBroker.Object | null) => void)[];\n handler: ObjectChangeHandler;\n loaded: boolean;\n cached: ioBroker.Object | null | undefined;\n}\n\ninterface StateSubscription {\n notifiers: ((state?: ioBroker.State | null) => void)[];\n handler: ioBroker.StateChangeHandler;\n loaded: boolean;\n cached: ioBroker.State | null | undefined;\n}\n\nexport class StateOrObjectHandler {\n private readonly objectSubs = new Map<string, ObjectSubscription>();\n private readonly stateSubs = new Map<string, StateSubscription>();\n\n constructor(private readonly socket: Connection) {}\n\n public async addListener<T extends ioBroker.StringOrTranslated | number | boolean>(\n item: ValueOrStateOrObject<T> | undefined,\n callback: (value: T | undefined) => void,\n ): Promise<void> {\n if (item === undefined) {\n callback(undefined);\n return;\n }\n\n if (typeof item !== 'object') {\n callback(item);\n return;\n }\n\n if ('en' in item) {\n callback(item as T);\n return;\n }\n\n try {\n if ('objectId' in item) {\n const notifyValue = (obj?: ioBroker.Object | null): void => {\n if (!obj) {\n callback(undefined);\n return;\n }\n\n const parts = item.property.split('.');\n let current: any = obj;\n for (const part of parts) {\n if (current[part] === undefined) {\n callback(undefined);\n return;\n }\n current = current[part];\n }\n\n callback(current as T);\n };\n\n const existing = this.objectSubs.get(item.objectId);\n if (existing) {\n existing.notifiers.push(notifyValue);\n if (existing.loaded) {\n // Already have the value — notify immediately without re-fetching\n notifyValue(existing.cached);\n }\n // If still loading, notifyValue will be called once the load completes\n return;\n }\n\n const sub: ObjectSubscription = {\n notifiers: [notifyValue],\n handler: null!,\n loaded: false,\n cached: undefined,\n };\n this.objectSubs.set(item.objectId, sub);\n\n const handler: ObjectChangeHandler = (_id, obj) => {\n sub.cached = obj;\n for (const n of sub.notifiers) {\n n(obj);\n }\n };\n sub.handler = handler;\n\n const obj = await this.socket.getObject(item.objectId);\n sub.cached = obj;\n sub.loaded = true;\n // Notify all notifiers (including any added while the fetch was in progress)\n for (const n of sub.notifiers) {\n n(obj);\n }\n await this.socket.subscribeObject(item.objectId, handler);\n return;\n }\n\n if ('stateId' in item) {\n const notifyValue = (state?: ioBroker.State | null): void => {\n let val = state?.val;\n if (val === undefined || val === null) {\n callback(undefined);\n return;\n }\n\n if (item.mapping) {\n if (typeof val === 'boolean') {\n val = val.toString();\n }\n\n callback(item.mapping[val]);\n } else {\n callback(val as T);\n }\n };\n\n const existing = this.stateSubs.get(item.stateId);\n if (existing) {\n existing.notifiers.push(notifyValue);\n if (existing.loaded) {\n // Already have the value — notify immediately without re-fetching\n notifyValue(existing.cached);\n }\n // If still loading, notifyValue will be called once the load completes\n return;\n }\n\n const sub: StateSubscription = {\n notifiers: [notifyValue],\n handler: null!,\n loaded: false,\n cached: undefined,\n };\n this.stateSubs.set(item.stateId, sub);\n\n const handler: ioBroker.StateChangeHandler = (_id, state) => {\n sub.cached = state;\n for (const n of sub.notifiers) {\n n(state);\n }\n };\n sub.handler = handler;\n\n const state = await this.socket.getState(item.stateId);\n sub.cached = state;\n sub.loaded = true;\n // Notify all notifiers (including any added while the fetch was in progress)\n for (const n of sub.notifiers) {\n n(state);\n }\n await this.socket.subscribeState(item.stateId, handler);\n return;\n }\n } catch (error) {\n console.error('Error in StateOrObjectHandler:', item, error);\n }\n\n callback(undefined);\n }\n\n public async unsubscribe(): Promise<void> {\n for (const [id, sub] of this.objectSubs) {\n await this.socket.unsubscribeObject(id, sub.handler);\n }\n this.objectSubs.clear();\n\n for (const [id, sub] of this.stateSubs) {\n this.socket.unsubscribeState(id, sub.handler);\n }\n this.stateSubs.clear();\n }\n}\n"]}
|
package/build/TooltipButton.d.ts
CHANGED
package/build/TooltipButton.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { IconButton, Tooltip, Typography } from '@mui/material';
|
|
3
3
|
export default function TooltipButton(props) {
|
|
4
|
-
const { tooltip, label, disabled, Icon, onClick } = props;
|
|
4
|
+
const { tooltip, label, disabled, Icon, onClick, url } = props;
|
|
5
5
|
const text = !!label && (React.createElement(Typography, { variant: "button", style: { marginLeft: 4 } }, label));
|
|
6
|
+
const btnProps = url ? { href: url, disabled, target: '_blank' } : { onClick, disabled };
|
|
6
7
|
if (tooltip) {
|
|
7
8
|
return (React.createElement(Tooltip, { title: tooltip, slotProps: { popper: { sx: { pointerEvents: 'none' } } } },
|
|
8
9
|
React.createElement("span", null,
|
|
9
|
-
React.createElement(IconButton, {
|
|
10
|
+
React.createElement(IconButton, { ...btnProps, size: "small" },
|
|
10
11
|
Icon,
|
|
11
12
|
text))));
|
|
12
13
|
}
|
|
13
|
-
return (React.createElement(IconButton, {
|
|
14
|
+
return (React.createElement(IconButton, { ...btnProps, size: "small" },
|
|
14
15
|
Icon,
|
|
15
16
|
text));
|
|
16
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TooltipButton.js","sourceRoot":"./src/","sources":["TooltipButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"TooltipButton.js","sourceRoot":"./src/","sources":["TooltipButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAWhE,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAyB;IAC3D,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAE/D,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CACpB,oBAAC,UAAU,IACP,OAAO,EAAC,QAAQ,EAChB,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAEvB,KAAK,CACG,CAChB,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAEzF,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,CACH,oBAAC,OAAO,IACJ,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE;YAExD;gBACI,oBAAC,UAAU,OACH,QAAQ,EACZ,IAAI,EAAC,OAAO;oBAEX,IAAI;oBACJ,IAAI,CACI,CACV,CACD,CACb,CAAC;IACN,CAAC;IAED,OAAO,CACH,oBAAC,UAAU,OACH,QAAQ,EACZ,IAAI,EAAC,OAAO;QAEX,IAAI;QACJ,IAAI,CACI,CAChB,CAAC;AACN,CAAC","sourcesContent":["import React from 'react';\nimport { IconButton, Tooltip, Typography } from '@mui/material';\n\ninterface TooltipButtonProps {\n tooltip?: string;\n label?: string;\n disabled?: boolean;\n Icon: React.JSX.Element | null;\n onClick?: () => void;\n url?: string;\n}\n\nexport default function TooltipButton(props: TooltipButtonProps): React.JSX.Element {\n const { tooltip, label, disabled, Icon, onClick, url } = props;\n\n const text = !!label && (\n <Typography\n variant=\"button\"\n style={{ marginLeft: 4 }}\n >\n {label}\n </Typography>\n );\n\n const btnProps = url ? { href: url, disabled, target: '_blank' } : { onClick, disabled };\n\n if (tooltip) {\n return (\n <Tooltip\n title={tooltip}\n slotProps={{ popper: { sx: { pointerEvents: 'none' } } }}\n >\n <span>\n <IconButton\n {...btnProps}\n size=\"small\"\n >\n {Icon}\n {text}\n </IconButton>\n </span>\n </Tooltip>\n );\n }\n\n return (\n <IconButton\n {...btnProps}\n size=\"small\"\n >\n {Icon}\n {text}\n </IconButton>\n );\n}\n"]}
|
package/build/Utils.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { ControlBase } from '
|
|
3
|
-
import type { ActionBase } from '@iobroker/dm-utils/build/types/api';
|
|
2
|
+
import type { ActionBase, ControlBase } from './protocol/api';
|
|
4
3
|
export declare function renderControlIcon(action: ControlBase, colors?: {
|
|
5
4
|
primary: string;
|
|
6
5
|
secondary: string;
|