@eohjsc/react-native-smart-city 0.3.14 → 0.3.15

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eohjsc/react-native-smart-city",
3
3
  "title": "React Native Smart Home",
4
- "version": "0.3.14",
4
+ "version": "0.3.15",
5
5
  "description": "TODO",
6
6
  "main": "index.js",
7
7
  "files": [
@@ -6,6 +6,8 @@ import { useConfigGlobalState } from '../../../iot/states';
6
6
  import OnOffButtonTemplate from './OnOffButtonTemplate';
7
7
  import OnOffSimpleTemplate from './OnOffSimpleTemplate';
8
8
 
9
+ let temp;
10
+
9
11
  const getComponent = (template) => {
10
12
  switch (template) {
11
13
  case 'on_off_button_action_template': // todo refactor later with backend
@@ -20,11 +22,28 @@ const getComponent = (template) => {
20
22
  const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
21
23
  const { configuration } = actionGroup;
22
24
  const { action_data, action_on_data, action_off_data } = configuration;
23
- const [isOn, setIsOn] = useState(null);
24
25
 
25
26
  // eslint-disable-next-line no-unused-vars
26
27
  const [configValues, _] = useConfigGlobalState('configValues');
27
28
 
29
+ const getIsOnValue = useCallback(() => {
30
+ const { is_on_value, config } = configuration;
31
+ const configValue = configValues[config];
32
+ if (is_on_value && is_on_value.length > 0) {
33
+ return is_on_value.includes(configValue);
34
+ }
35
+ return !!configValue;
36
+ }, [configValues, configuration]);
37
+
38
+ const [isOn, setIsOn] = useState(false);
39
+ const [tempIsOn, setTempIsOn] = useState(getIsOnValue());
40
+
41
+ const updateStatusFromPusher = () => {
42
+ setTimeout(() => {
43
+ setTempIsOn(temp);
44
+ }, 2500);
45
+ };
46
+
28
47
  const actionName = useCallback(
29
48
  (text) => {
30
49
  const actionNameType = `${
@@ -34,7 +53,9 @@ const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
34
53
  },
35
54
  [actionGroup?.title, sensor?.name]
36
55
  );
56
+
37
57
  const triggerAction = useCallback(async () => {
58
+ setTempIsOn((prev) => !prev);
38
59
  switch (sensor?.device_type) {
39
60
  case DEVICE_TYPE.ZIGBEE:
40
61
  if (action_on_data && action_off_data) {
@@ -53,6 +74,13 @@ const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
53
74
  }
54
75
  }
55
76
  break;
77
+ case DEVICE_TYPE.LG_THINQ:
78
+ if (action_data) {
79
+ await doAction(action_data, JSON.stringify({ value: !isOn }));
80
+ }
81
+
82
+ updateStatusFromPusher();
83
+ break;
56
84
  default:
57
85
  if (action_data) {
58
86
  if (isOn) {
@@ -88,19 +116,12 @@ const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
88
116
  ]);
89
117
 
90
118
  useEffect(() => {
91
- const { is_on_value, config } = configuration;
92
- const configValue = configValues[config];
93
- if (is_on_value && is_on_value.length > 0) {
94
- setIsOn(is_on_value.includes(configValue));
95
- return;
96
- }
97
- setIsOn(configValue);
98
- }, [
99
- configuration.config,
100
- configValues,
101
- configuration.is_on_value,
102
- configuration,
103
- ]);
119
+ setIsOn(getIsOnValue());
120
+ }, [getIsOnValue]);
121
+
122
+ useEffect(() => {
123
+ temp = isOn;
124
+ }, [isOn]);
104
125
 
105
126
  useEffect(() => {
106
127
  if (sensor?.device_type === DEVICE_TYPE.LG_THINQ) {
@@ -118,7 +139,7 @@ const OnOffTemplate = memo(({ actionGroup, doAction, sensor }) => {
118
139
  return (
119
140
  <>
120
141
  <Component
121
- isOn={isOn}
142
+ isOn={tempIsOn}
122
143
  triggerAction={triggerAction}
123
144
  actionGroup={actionGroup}
124
145
  disabled={!action_data && !action_on_data && !action_off_data}
@@ -90,7 +90,7 @@ const TimerActionTemplate = ({ actionGroup = {}, doAction, sensor = {} }) => {
90
90
 
91
91
  const doActionTime = useCallback(
92
92
  (hour, minute) => {
93
- doAction(configuration.action_data, [hour, minute]);
93
+ doAction(configuration.action_data, JSON.stringify({ hour, minute }));
94
94
  if (sensor.is_managed_by_backend) {
95
95
  hour !== undefined &&
96
96
  minute !== undefined &&
@@ -113,7 +113,7 @@ const TimerActionTemplate = ({ actionGroup = {}, doAction, sensor = {} }) => {
113
113
 
114
114
  const doActionHour = useCallback(
115
115
  (hour) => {
116
- doAction(configuration.action_data, hour);
116
+ doAction(configuration.action_data, JSON.stringify({ hour }));
117
117
  if (
118
118
  sensor.is_managed_by_backend &&
119
119
  sensor.device_type !== 'GOOGLE_HOME'
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable promise/prefer-await-to-callbacks */
2
- import { TESTID } from '../../../configs/Constants';
2
+ import { DEVICE_TYPE, TESTID } from '../../../configs/Constants';
3
3
  import { watchMultiConfigs } from '../../../iot/Monitor';
4
4
  import React from 'react';
5
5
  import { View } from 'react-native';
@@ -149,6 +149,7 @@ describe('Test OnOffTemplate', () => {
149
149
  await act(async () => {
150
150
  tree = await create(wrapComponent(actionGroup, mockDoAction, sensor));
151
151
  });
152
+
152
153
  const instance = tree.root;
153
154
  const template = instance.findByType(OnOffSimpleTemplate);
154
155
  expect(template.props.isOn).toEqual(true);
@@ -230,6 +231,39 @@ describe('Test OnOffTemplate', () => {
230
231
  expect(mockDoAction).toHaveBeenCalledWith(action_data, false);
231
232
  });
232
233
 
234
+ test('render with template OnOffSimpleActionTemplate with just action_data lg_thinq', async () => {
235
+ actionGroup = {
236
+ template: 'OnOffSimpleActionTemplate',
237
+ configuration: {
238
+ config: 5,
239
+ action_data: action_data,
240
+ icon: 'up',
241
+ is_on_value: [2],
242
+ },
243
+ title: 'Turn on / off',
244
+ };
245
+ const mockDoAction = jest.fn();
246
+ await act(async () => {
247
+ tree = await create(
248
+ wrapComponent(actionGroup, mockDoAction, {
249
+ device_type: DEVICE_TYPE.LG_THINQ,
250
+ })
251
+ );
252
+ });
253
+ const instance = tree.root;
254
+ const template = instance.findAllByType(OnOffSimpleTemplate);
255
+ expect(template).toHaveLength(1);
256
+ expect(template[0].props.disabled).toBeFalsy();
257
+
258
+ await act(async () => {
259
+ await template[0].props.triggerAction();
260
+ });
261
+ expect(mockDoAction).toHaveBeenCalledWith(
262
+ action_data,
263
+ JSON.stringify({ value: false })
264
+ );
265
+ });
266
+
233
267
  test('render with template OnOffSimpleActionTemplate disabled', async () => {
234
268
  actionGroup = {
235
269
  template: 'OnOffSimpleActionTemplate',
@@ -89,6 +89,9 @@ describe('Test TimerActionTemplate without config value', () => {
89
89
  await dateTimePicker.props.onConfirm();
90
90
  });
91
91
  expect(dateTimePicker.props.isVisible).toBeFalsy();
92
- expect(mockDoAction).toHaveBeenCalledWith(action_data, [11, 0]);
92
+ expect(mockDoAction).toHaveBeenCalledWith(
93
+ action_data,
94
+ JSON.stringify({ hour: 11, minute: 0 })
95
+ );
93
96
  });
94
97
  });
@@ -190,7 +190,6 @@ describe('Test useRemoteControl', () => {
190
190
  act(() => {
191
191
  sendRemoteCommand.current(sensor, action, data, userId, actionName);
192
192
  });
193
- expect(sendCommandOverLGThinq).toBeCalledWith(sensor, action, data);
194
193
  expect(sendCommandOverBluetooth).not.toBeCalled();
195
194
  expect(sendCommandOverGoogleHome).not.toBeCalled();
196
195
  expect(sendCommandOverInternet).not.toBeCalled();
@@ -2,7 +2,6 @@ import { useCallback } from 'react';
2
2
  import { useSCContextSelector } from '../../context';
3
3
  import { sendCommandOverGoogleHome } from '../../iot/RemoteControl/GoogleHome';
4
4
  import { sendCommandOverInternet } from '../../iot/RemoteControl/Internet';
5
- import { sendCommandOverLGThinq } from '../../iot/RemoteControl/LG';
6
5
  import {
7
6
  sendCommandOverBluetooth,
8
7
  SEND_COMMAND_OVER_BLUETOOTH_FAIL,
@@ -64,10 +63,6 @@ const useRemoteControl = () => {
64
63
  data
65
64
  );
66
65
  }
67
-
68
- if (action.command_prefer_over_lg) {
69
- result = await sendCommandOverLGThinq(sensor, action, data);
70
- }
71
66
  return result;
72
67
  },
73
68
  [ggHomeConnections]
@@ -94,17 +94,17 @@ export async function updateStateByLgThinq(device_id, data) {
94
94
  setConfigGlobalState('configValues', { ...configValues });
95
95
  }
96
96
 
97
- export async function fetchDeviceStatusLG(sensor) {
97
+ export async function fetchDeviceStatusLG(endDevice) {
98
98
  // still need some delay
99
99
  setTimeout(async () => {
100
100
  const { success, data: dataStatus } = await axiosGet(
101
- API.IOT.LG.DEVICE_STATUS(sensor.id),
101
+ API.IOT.LG.DEVICE_STATUS(endDevice.id),
102
102
  {},
103
103
  true
104
104
  );
105
105
 
106
106
  if (success) {
107
- updateStateByLgThinq(sensor.lg_device_id, dataStatus);
107
+ updateStateByLgThinq(endDevice.lg_device_id, dataStatus);
108
108
  }
109
109
  }, 1000);
110
110
  }
@@ -128,11 +128,11 @@ export const lgThinqConnect = async (options) => {
128
128
  const option = options[i];
129
129
  for (let j = 0; j < option.lg_devices.length; j++) {
130
130
  const lgDevice = option.lg_devices[j];
131
- const sensor = {
132
- id: lgDevice.sensor_id,
131
+ const endDevice = {
132
+ id: lgDevice.end_device_id,
133
133
  lg_device_id: lgDevice.device_id,
134
134
  };
135
- await fetchDeviceStatusLG(sensor);
135
+ await fetchDeviceStatusLG(endDevice);
136
136
  }
137
137
  }
138
138
  };
@@ -107,7 +107,7 @@ describe('Remote Control LG Thinq', () => {
107
107
  lg_devices: [
108
108
  {
109
109
  id: 1,
110
- sensor_id: 2,
110
+ end_device_id: 2,
111
111
  device_id: 'DEVICE_ID',
112
112
  configs: [
113
113
  {
@@ -188,7 +188,7 @@ describe('Remote Control LG Thinq', () => {
188
188
  lg_devices: [
189
189
  {
190
190
  id: 1,
191
- sensor_id: 2,
191
+ end_device_id: 2,
192
192
  device_id: 'DEVICE_ID',
193
193
  configs: [
194
194
  {
@@ -49,6 +49,7 @@ export const SensorDisplayItem = ({
49
49
  },
50
50
  [sensor, userId, sendRemoteCommand]
51
51
  );
52
+
52
53
  if (item.configuration.type === 'compass') {
53
54
  setShowWindDirection(true);
54
55
  }