@ledvance/ui-biz-bundle 1.1.67 → 1.1.69

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.
Files changed (240) hide show
  1. package/.babelrc +31 -31
  2. package/.eslintignore +5 -5
  3. package/.eslintrc.js +27 -27
  4. package/.prettierrc.js +1 -1
  5. package/.versionrc +5 -5
  6. package/package.json +74 -74
  7. package/rn-cli.config.js +8 -8
  8. package/src/hooks/DeviceDpStateHooks.d.ts +14 -14
  9. package/src/hooks/DeviceDpStateHooks.ts +50 -50
  10. package/src/modules/biorhythm/BiorhythmActions.d.ts +8 -8
  11. package/src/modules/biorhythm/BiorhythmActions.ts +324 -324
  12. package/src/modules/biorhythm/BiorhythmBean.d.ts +58 -58
  13. package/src/modules/biorhythm/BiorhythmBean.ts +230 -230
  14. package/src/modules/biorhythm/BiorhythmEditPage.d.ts +14 -14
  15. package/src/modules/biorhythm/BiorhythmEditPage.tsx +324 -324
  16. package/src/modules/biorhythm/BiorhythmPage.d.ts +10 -10
  17. package/src/modules/biorhythm/BiorhythmPage.tsx +796 -796
  18. package/src/modules/biorhythm/IconSelect.d.ts +2 -2
  19. package/src/modules/biorhythm/IconSelect.tsx +81 -81
  20. package/src/modules/biorhythm/Router.ts +34 -34
  21. package/src/modules/biorhythm/circular/ItemIcon.d.ts +22 -22
  22. package/src/modules/biorhythm/circular/ItemIcon.tsx +172 -172
  23. package/src/modules/biorhythm/circular/Progress.d.ts +24 -24
  24. package/src/modules/biorhythm/circular/Progress.tsx +411 -411
  25. package/src/modules/biorhythm/circular/TimeCircular.d.ts +11 -11
  26. package/src/modules/biorhythm/circular/TimeCircular.tsx +70 -70
  27. package/src/modules/biorhythm/iconListData.d.ts +7 -7
  28. package/src/modules/biorhythm/iconListData.ts +29 -29
  29. package/src/modules/biorhythm/pIdList.d.ts +2 -2
  30. package/src/modules/biorhythm/pIdList.ts +35 -35
  31. package/src/modules/biorhythm/res/BiologicalRes.d.ts +43 -43
  32. package/src/modules/biorhythm/res/BiologicalRes.ts +41 -41
  33. package/src/modules/config/ldvConfig.d.ts +2 -2
  34. package/src/modules/config/ldvConfig.tsx +18 -18
  35. package/src/modules/fixedTime/FixedTimeActions.ts +173 -173
  36. package/src/modules/fixedTime/FixedTimeDetailPage.tsx +372 -372
  37. package/src/modules/fixedTime/FixedTimePage.tsx +213 -213
  38. package/src/modules/fixedTime/Router.ts +26 -26
  39. package/src/modules/flags/FlagActions.ts +267 -267
  40. package/src/modules/flags/FlagEditPage.tsx +441 -441
  41. package/src/modules/flags/FlagInfo.tsx +563 -563
  42. package/src/modules/flags/FlagItem.tsx +90 -90
  43. package/src/modules/flags/FlagPage.tsx +277 -277
  44. package/src/modules/flags/Router.ts +25 -25
  45. package/src/modules/history/HistoryPage.d.ts +2 -2
  46. package/src/modules/history/HistoryPage.tsx +261 -261
  47. package/src/modules/history/Router.ts +16 -16
  48. package/src/modules/history/SwitchHistoryPageActions.d.ts +14 -14
  49. package/src/modules/history/SwitchHistoryPageActions.ts +76 -76
  50. package/src/modules/mood/AddMoodPage.d.ts +10 -10
  51. package/src/modules/mood/AddMoodPage.tsx +792 -792
  52. package/src/modules/mood/DynamicMoodEditorPage.d.ts +6 -6
  53. package/src/modules/mood/DynamicMoodEditorPage.tsx +561 -561
  54. package/src/modules/mood/FantasyMood.tsx +176 -176
  55. package/src/modules/mood/FantasyMoodEditPage.tsx +582 -582
  56. package/src/modules/mood/FantasyMoodItem.tsx +104 -104
  57. package/src/modules/mood/FantasyRouter.ts +35 -35
  58. package/src/modules/mood/MixMood/AddMixMoodPage.tsx +247 -247
  59. package/src/modules/mood/MixMood/MixMoodActions.ts +128 -128
  60. package/src/modules/mood/MixMood/MixMoodEditPage.tsx +721 -721
  61. package/src/modules/mood/MixMood/MixMoodItem.tsx +134 -134
  62. package/src/modules/mood/MixMood/MixMoodPage.tsx +326 -326
  63. package/src/modules/mood/MixMood/MixSceneBeans.ts +364 -364
  64. package/src/modules/mood/MixMood/RecommendMixMoodItem.tsx +69 -69
  65. package/src/modules/mood/MixMood/Router.ts +44 -44
  66. package/src/modules/mood/MoodItem.d.ts +11 -11
  67. package/src/modules/mood/MoodItem.tsx +114 -114
  68. package/src/modules/mood/MoodPage.d.ts +16 -16
  69. package/src/modules/mood/MoodPage.tsx +296 -296
  70. package/src/modules/mood/RecommendMoodItem.d.ts +13 -13
  71. package/src/modules/mood/RecommendMoodItem.tsx +74 -74
  72. package/src/modules/mood/Router.ts +53 -53
  73. package/src/modules/mood/StaticMoodEditorPage.d.ts +16 -16
  74. package/src/modules/mood/StaticMoodEditorPage.tsx +320 -320
  75. package/src/modules/mood/tools.d.ts +3 -3
  76. package/src/modules/mood/tools.ts +11 -11
  77. package/src/modules/music/MusicDataBean.d.ts +47 -47
  78. package/src/modules/music/MusicDataBean.ts +167 -167
  79. package/src/modules/music/MusicManager.d.ts +27 -27
  80. package/src/modules/music/MusicManager.ts +207 -207
  81. package/src/modules/music/MusicPage.d.ts +10 -10
  82. package/src/modules/music/MusicPage.tsx +347 -347
  83. package/src/modules/music/MusicPageActions.d.ts +35 -35
  84. package/src/modules/music/MusicPageActions.ts +317 -317
  85. package/src/modules/music/Router.ts +16 -16
  86. package/src/modules/music/SelecetGenre.d.ts +7 -7
  87. package/src/modules/music/SelecetGenre.tsx +63 -63
  88. package/src/modules/music/color.d.ts +2 -2
  89. package/src/modules/music/color.ts +73 -73
  90. package/src/modules/music/res/index.d.ts +10 -10
  91. package/src/modules/music/res/index.ts +9 -9
  92. package/src/modules/powerOnBehavior/PowerOnBehaviorActions.ts +11 -11
  93. package/src/modules/powerOnBehavior/PowerOnBehaviorPage.tsx +173 -173
  94. package/src/modules/powerOnBehavior/Router.ts +16 -16
  95. package/src/modules/randomTime/RandomTimeActions.ts +160 -160
  96. package/src/modules/randomTime/RandomTimeDetailPage.tsx +337 -337
  97. package/src/modules/randomTime/RandomTimePage.tsx +214 -214
  98. package/src/modules/randomTime/Router.ts +25 -25
  99. package/src/modules/randomTime/Summary.tsx +122 -122
  100. package/src/modules/scene/SceneAction.d.ts +13 -13
  101. package/src/modules/scene/SceneAction.ts +473 -473
  102. package/src/modules/scene/SceneDetailPage.d.ts +1 -1
  103. package/src/modules/scene/SceneDetailPage.tsx +421 -421
  104. package/src/modules/scene/SceneInfo.d.ts +72 -72
  105. package/src/modules/scene/SceneInfo.ts +1059 -1059
  106. package/src/modules/scene/ScenePage.d.ts +7 -7
  107. package/src/modules/scene/ScenePage.tsx +147 -147
  108. package/src/modules/select/SelectPage.d.ts +12 -12
  109. package/src/modules/select/SelectPage.tsx +137 -137
  110. package/src/modules/sleepWakeup/DeviceState.d.ts +9 -9
  111. package/src/modules/sleepWakeup/DeviceState.tsx +99 -99
  112. package/src/modules/sleepWakeup/LdvScheduleItem.d.ts +15 -15
  113. package/src/modules/sleepWakeup/LdvScheduleItem.tsx +176 -176
  114. package/src/modules/sleepWakeup/Router.ts +25 -25
  115. package/src/modules/sleepWakeup/SleepWakeUpActions.d.ts +2 -2
  116. package/src/modules/sleepWakeup/SleepWakeUpActions.ts +180 -180
  117. package/src/modules/sleepWakeup/SleepWakeUpDetailPage.d.ts +2 -2
  118. package/src/modules/sleepWakeup/SleepWakeUpDetailPage.tsx +616 -616
  119. package/src/modules/sleepWakeup/SleepWakeUpPage.d.ts +13 -13
  120. package/src/modules/sleepWakeup/SleepWakeUpPage.tsx +424 -424
  121. package/src/modules/sleepWakeup/utils.d.ts +44 -44
  122. package/src/modules/sleepWakeup/utils.ts +253 -253
  123. package/src/modules/timeSchedule/DeviceState.d.ts +17 -17
  124. package/src/modules/timeSchedule/DeviceState.tsx +94 -94
  125. package/src/modules/timeSchedule/LdvScheduleItem.d.ts +15 -15
  126. package/src/modules/timeSchedule/LdvScheduleItem.tsx +130 -130
  127. package/src/modules/timeSchedule/ManualSetting.d.ts +14 -14
  128. package/src/modules/timeSchedule/ManualSetting.tsx +219 -219
  129. package/src/modules/timeSchedule/MoodSetting.d.ts +11 -11
  130. package/src/modules/timeSchedule/MoodSetting.tsx +228 -228
  131. package/src/modules/timeSchedule/Router.ts +25 -25
  132. package/src/modules/timeSchedule/ScheduleScene.d.ts +6 -6
  133. package/src/modules/timeSchedule/ScheduleScene.tsx +144 -144
  134. package/src/modules/timeSchedule/SingleLightView.d.ts +12 -12
  135. package/src/modules/timeSchedule/SingleLightView.tsx +175 -175
  136. package/src/modules/timeSchedule/TimeScheduleBean.d.ts +14 -14
  137. package/src/modules/timeSchedule/TimeScheduleBean.ts +18 -18
  138. package/src/modules/timeSchedule/TimeScheduleEditpage.d.ts +6 -6
  139. package/src/modules/timeSchedule/TimeScheduleEditpage.tsx +765 -765
  140. package/src/modules/timeSchedule/TimeSchedulePage.d.ts +13 -13
  141. package/src/modules/timeSchedule/TimeSchedulePage.tsx +358 -358
  142. package/src/modules/timeSchedule/components/ColorList.ts +23 -23
  143. package/src/modules/timeSchedule/components/LampSwitchCard.tsx +106 -106
  144. package/src/modules/timeSchedule/mix/MixLightActions.d.ts +3 -3
  145. package/src/modules/timeSchedule/mix/MixLightActions.ts +49 -49
  146. package/src/modules/timeSchedule/mix/MixLightBean.d.ts +10 -10
  147. package/src/modules/timeSchedule/mix/MixLightBean.ts +9 -9
  148. package/src/modules/timeSchedule/mix/MixLightView.d.ts +7 -7
  149. package/src/modules/timeSchedule/mix/MixLightView.tsx +197 -197
  150. package/src/modules/timeSchedule/utils.d.ts +1 -1
  151. package/src/modules/timeSchedule/utils.ts +6 -6
  152. package/src/modules/timer/Router.ts +16 -16
  153. package/src/modules/timer/TimerPage.d.ts +11 -11
  154. package/src/modules/timer/TimerPage.tsx +384 -384
  155. package/src/modules/timer/TimerPageAction.d.ts +22 -22
  156. package/src/modules/timer/TimerPageAction.ts +131 -131
  157. package/src/navigation/Routers.d.ts +15 -15
  158. package/src/navigation/Routers.ts +46 -44
  159. package/src/navigation/tools.d.ts +9 -9
  160. package/src/navigation/tools.ts +21 -21
  161. package/src/newModules/biorhythm/BiorhythmActions.ts +374 -374
  162. package/src/newModules/biorhythm/BiorhythmBean.ts +230 -230
  163. package/src/newModules/biorhythm/BiorhythmEditPage.tsx +267 -267
  164. package/src/newModules/biorhythm/BiorhythmPage.tsx +642 -642
  165. package/src/newModules/biorhythm/IconSelect.tsx +84 -84
  166. package/src/newModules/biorhythm/Router.ts +33 -33
  167. package/src/newModules/biorhythm/circular/ItemIcon.d.ts +22 -22
  168. package/src/newModules/biorhythm/circular/ItemIcon.tsx +172 -172
  169. package/src/newModules/biorhythm/circular/Progress.d.ts +24 -24
  170. package/src/newModules/biorhythm/circular/Progress.tsx +371 -371
  171. package/src/newModules/biorhythm/circular/TimeCircular.d.ts +11 -11
  172. package/src/newModules/biorhythm/circular/TimeCircular.tsx +64 -64
  173. package/src/newModules/biorhythm/iconListData.ts +29 -29
  174. package/src/newModules/biorhythm/pIdList.ts +35 -35
  175. package/src/newModules/biorhythm/res/BiologicalRes.d.ts +43 -43
  176. package/src/newModules/biorhythm/res/BiologicalRes.ts +41 -41
  177. package/src/newModules/childLock/ChildLockPage.tsx +97 -97
  178. package/src/newModules/childLock/Router.ts +16 -16
  179. package/src/newModules/energyConsumption/EnergyConsumptionActions.ts +23 -23
  180. package/src/newModules/energyConsumption/EnergyConsumptionChart.tsx +84 -84
  181. package/src/newModules/energyConsumption/EnergyConsumptionDetail.tsx +322 -322
  182. package/src/newModules/energyConsumption/EnergyConsumptionPage.tsx +393 -393
  183. package/src/newModules/energyConsumption/Router.ts +34 -34
  184. package/src/newModules/energyConsumption/co2Data.ts +23655 -23655
  185. package/src/newModules/energyConsumption/component/BarChart.tsx +93 -93
  186. package/src/newModules/energyConsumption/component/EnergyModal.tsx +284 -284
  187. package/src/newModules/energyConsumption/component/Overview.tsx +118 -118
  188. package/src/newModules/fixedTime/FixedTimeActions.ts +241 -241
  189. package/src/newModules/fixedTime/FixedTimeDetailPage.tsx +345 -345
  190. package/src/newModules/fixedTime/FixedTimePage.tsx +302 -302
  191. package/src/newModules/fixedTime/Router.ts +25 -25
  192. package/src/newModules/lightMode/LightModePage.tsx +204 -204
  193. package/src/newModules/lightMode/Router.ts +16 -16
  194. package/src/newModules/mood/AddMoodPage.tsx +194 -194
  195. package/src/newModules/mood/DynamicMoodEditorPage.tsx +650 -650
  196. package/src/newModules/mood/Interface.ts +220 -220
  197. package/src/newModules/mood/MixDynamicMoodEditor.tsx +786 -786
  198. package/src/newModules/mood/MoodActions.ts +232 -232
  199. package/src/newModules/mood/MoodInfo.ts +2151 -2151
  200. package/src/newModules/mood/MoodItem.tsx +160 -160
  201. package/src/newModules/mood/MoodPage.tsx +386 -386
  202. package/src/newModules/mood/MoodParse.ts +443 -443
  203. package/src/newModules/mood/RecommendMoodItem.tsx +81 -81
  204. package/src/newModules/mood/Router.ts +43 -43
  205. package/src/newModules/mood/StaticMoodEditorPage.tsx +290 -290
  206. package/src/newModules/overchargeSwitch/OverchargeSwitchPage.tsx +96 -96
  207. package/src/newModules/overchargeSwitch/Router.ts +16 -16
  208. package/src/newModules/powerOnBehavior/LightBehaviorPage.tsx +266 -266
  209. package/src/newModules/powerOnBehavior/PlugBehaviorPage.tsx +173 -173
  210. package/src/newModules/powerOnBehavior/PowerOnBehaviorActions.ts +106 -106
  211. package/src/newModules/powerOnBehavior/Router.ts +27 -27
  212. package/src/newModules/randomTime/RandomTimeActions.ts +238 -238
  213. package/src/newModules/randomTime/RandomTimeDetailPage.tsx +325 -325
  214. package/src/newModules/randomTime/RandomTimePage.tsx +299 -299
  215. package/src/newModules/randomTime/Router.ts +25 -25
  216. package/src/newModules/randomTime/Summary.tsx +116 -116
  217. package/src/newModules/remoteControl/RemoteControlActions.ts +5 -5
  218. package/src/newModules/remoteControl/RemoteControlPage.tsx +51 -51
  219. package/src/newModules/remoteControl/Router.ts +15 -15
  220. package/src/newModules/select/Route.ts +16 -16
  221. package/src/newModules/select/SelectPage.d.ts +12 -12
  222. package/src/newModules/select/SelectPage.tsx +137 -137
  223. package/src/newModules/sleepWakeUp/Interface.ts +69 -69
  224. package/src/newModules/sleepWakeUp/Router.ts +24 -24
  225. package/src/newModules/sleepWakeUp/SleepWakeUpActions.ts +317 -317
  226. package/src/newModules/sleepWakeUp/SleepWakeUpDetailPage.tsx +661 -661
  227. package/src/newModules/sleepWakeUp/SleepWakeUpPage.tsx +455 -455
  228. package/src/newModules/sleepWakeUp/utils.ts +253 -253
  229. package/src/newModules/swithInching/Router.ts +16 -16
  230. package/src/newModules/swithInching/SwithInching.tsx +231 -231
  231. package/src/newModules/swithInching/SwithInchingAction.ts +55 -55
  232. package/src/newModules/swithInching/pickerView.tsx +91 -91
  233. package/src/newModules/timeSchedule/Interface.ts +142 -142
  234. package/src/newModules/timeSchedule/Router.ts +25 -25
  235. package/src/newModules/timeSchedule/TimeScheduleActions.ts +53 -53
  236. package/src/newModules/timeSchedule/TimeScheduleDetailPage.tsx +648 -648
  237. package/src/newModules/timeSchedule/TimeSchedulePage.tsx +253 -253
  238. package/src/newModules/timeSchedule/components/ManuaSettings.tsx +460 -460
  239. package/src/newModules/timeSchedule/components/ScheduleCard.tsx +125 -125
  240. package/tsconfig.json +50 -50
@@ -1,386 +1,386 @@
1
- import React, { useCallback, useEffect, useMemo } from 'react';
2
- import Page from '@ledvance/base/src/components/Page';
3
- import { Utils } from 'tuya-panel-kit';
4
- import { saveMoodList, useWorkMode } from './MoodActions';
5
- import {
6
- useDeviceId,
7
- useDeviceInfo,
8
- useFlagMode,
9
- useMoods,
10
- } from '@ledvance/base/src/models/modules/NativePropsSlice';
11
- import { useReactive } from 'ahooks';
12
- import Strings from '@ledvance/base/src/i18n';
13
- import res from '@ledvance/base/src/res';
14
- import { FlatList, StyleSheet, View, Platform } from 'react-native';
15
- import Tag from '@ledvance/base/src/components/Tag';
16
- import Spacer from '@ledvance/base/src/components/Spacer';
17
- import InfoText from '@ledvance/base/src/components/InfoText';
18
- import CustomListDialog from '@ledvance/base/src/components/CustomListDialog';
19
- import MoodItem from './MoodItem';
20
- import { useNavigation } from '@react-navigation/core';
21
- import { MoodPageParams, MoodPageState, MoodUIInfo } from './Interface';
22
- import { getRemoteMoodList, useMoodScene } from './MoodActions';
23
- import { useParams } from '@ledvance/base/src/hooks/Hooks';
24
- import { ui_biz_routerKey } from '../../navigation/Routers'
25
- import { cloneDeep, filter, map } from 'lodash';
26
- import { saveFlagMode } from '@ledvance/ui-biz-bundle/src/modules/flags/FlagActions';
27
- import { WorkMode } from '@ledvance/base/src/utils/interface';
28
-
29
- const cx = Utils.RatioUtils.convertX;
30
-
31
- const MAX_MOOD_COUNT = 255;
32
-
33
- const MoodPage = () => {
34
- const params = useParams<MoodPageParams>();
35
- const deviceInfo = useDeviceInfo();
36
- const devId = useDeviceId();
37
- const navigation = useNavigation();
38
- const [moodInfo, setMoodInfo] = useMoodScene(params);
39
- const [moods, setMoods] = useMoods();
40
- const [mainWork, setMainWork] = useWorkMode(params.mainWorkMode);
41
- const [secondaryWork, setSecondaryWork] = useWorkMode(params.secondaryWorkMode!);
42
- const [flagMode, setFlagMode] = useFlagMode();
43
- const state = useReactive<MoodPageState>({
44
- currentMood: undefined,
45
- staticTagChecked: true,
46
- dynamicTagChecked: true,
47
- showAddMoodPopover: false,
48
- originMoods: cloneDeep(moods),
49
- filterMoods: [],
50
- loading: false,
51
- timerId: undefined as any,
52
- flag: Symbol(),
53
- });
54
-
55
- const moodIds = useMemo(() => {
56
- const mainIds = map(state.originMoods, 'id').filter(v => v !== undefined)
57
- const secondaryIds = map(state.originMoods.map(m => m.secondaryLamp) || [], 'id')
58
- return filter([...mainIds, ...secondaryIds], v => v !== undefined) as number[]
59
- }, [JSON.stringify(state.originMoods)])
60
-
61
- useEffect(() => {
62
- state.loading = true
63
- state.timerId = setTimeout(() => {
64
- getRemoteMoodList(
65
- devId,
66
- params,
67
- params.featureId
68
- ).then(res => {
69
- state.loading = false
70
- if (res.success && Array.isArray(res.data)) {
71
- console.log(res.data, '< --- res.data')
72
- state.originMoods = cloneDeep(res.data);
73
- }
74
- });
75
- }, 250);
76
-
77
- return () => {
78
- clearTimeout(state.timerId);
79
- };
80
- }, []);
81
-
82
- useEffect(() => {
83
- state.filterMoods = state.originMoods.filter(item => {
84
- return (
85
- (state.staticTagChecked && state.dynamicTagChecked) ||
86
- (!state.staticTagChecked && !state.dynamicTagChecked) ||
87
- (state.staticTagChecked && item.mainLamp.nodes.length < 2) ||
88
- (state.dynamicTagChecked &&
89
- (item.secondaryLamp.nodes.length > 1 || item.mainLamp.nodes.length > 1))
90
- );
91
- });
92
- }, [state.staticTagChecked, state.dynamicTagChecked, state.originMoods]);
93
-
94
- const navigationRoute = (isStatic: boolean, mode: 'add' | 'edit', currentMood?: MoodUIInfo) => {
95
- const path =
96
- mode === 'add'
97
- ? ui_biz_routerKey.ui_biz_mood_add
98
- : isStatic
99
- ? ui_biz_routerKey.ui_biz_static_mood_edit
100
- : !!(params.isMixLight || params.isCeilingLight)
101
- ? ui_biz_routerKey.ui_biz_dynamic_mix_mood_edit
102
- : ui_biz_routerKey.ui_biz_dynamic_mood_edit;
103
- navigation.navigate(path, {
104
- mode,
105
- isStatic,
106
- currentMood,
107
- moduleParams: params,
108
- moodIds,
109
- nameRepeat,
110
- modDeleteMood,
111
- });
112
- };
113
-
114
- const modDeleteMood = async (mode: 'add' | 'edit' | 'del' | 'set', currentMood: MoodUIInfo) => {
115
- const checkedMood: MoodUIInfo = {
116
- ...currentMood,
117
- mainLamp: {
118
- ...currentMood.mainLamp,
119
- nodes: currentMood.mainLamp.nodes.map(node => {
120
- if (mode !== 'del') {
121
- if (node.isColorNode) {
122
- node.brightness = 0;
123
- node.colorTemp = 0;
124
- } else {
125
- node.h = 0;
126
- node.s = 0;
127
- node.v = 0;
128
- if (!params.isSupportTemperature) {
129
- node.colorTemp = 100; // 适配dim灯
130
- }
131
- }
132
- return node;
133
- }
134
- return node;
135
- }),
136
- },
137
- secondaryLamp: {
138
- ...currentMood.secondaryLamp,
139
- nodes: currentMood.secondaryLamp && currentMood.secondaryLamp.nodes?.length
140
- ? currentMood.secondaryLamp.nodes.map(node => {
141
- if (mode !== 'del') {
142
- if (node.isColorNode) {
143
- node.brightness = 0;
144
- node.colorTemp = 0;
145
- } else {
146
- node.h = 0;
147
- node.s = 0;
148
- node.v = 0;
149
- if (!params.isSupportTemperature) {
150
- node.colorTemp = 100; // 适配dim灯
151
- }
152
- }
153
- return node;
154
- }
155
- return node;
156
- })
157
- : [],
158
- },
159
- };
160
- if (mode === 'set') {
161
- return setMoodInfo(checkedMood);
162
- }
163
- let newScene: MoodUIInfo[] = [];
164
- if (mode === 'add') {
165
- newScene = [checkedMood, ...state.originMoods];
166
- } else if (mode === 'del') {
167
- newScene = state.originMoods.filter(item => item.id !== checkedMood.id);
168
- } else {
169
- newScene = state.originMoods.map(item => {
170
- if (item.id === checkedMood.id) {
171
- return checkedMood;
172
- }
173
- return item;
174
- });
175
- }
176
- const mood = mode === 'del' ? (newScene.length === 0 ? undefined : newScene[0]) : checkedMood;
177
- const res = await saveMoodList(devId, newScene, params, params.featureId);
178
- if (res.success) {
179
- state.originMoods = cloneDeep(newScene);
180
- setMoods(cloneDeep(newScene));
181
- updateFlagMode();
182
- if (mood) {
183
- if (mode === 'del') {
184
- if (
185
- (mainWork !== WorkMode.Scene && secondaryWork !== WorkMode.Scene) ||
186
- (params.isCeilingLight
187
- ? currentMood.mainLamp.id !== moodInfo.mainLamp.id &&
188
- currentMood.secondaryLamp.id !== moodInfo.secondaryLamp.id
189
- : currentMood.id !== moodInfo.id)
190
- ) {
191
- return {
192
- success: true,
193
- };
194
- }
195
- }
196
- setMoodInfo(mood).then();
197
- } else {
198
- if (mainWork === WorkMode.Scene) {
199
- if (params.isCeilingLight) {
200
- setMainWork(WorkMode.White).then();
201
- } else {
202
- const work = getWorkMode(undefined, params);
203
- setMainWork(work).then();
204
- }
205
- }
206
- if (params.isCeilingLight && params.secondaryWorkMode && secondaryWork === WorkMode.Scene) {
207
- setSecondaryWork(WorkMode.Colour).then();
208
- }
209
- }
210
- return {
211
- success: true,
212
- };
213
- } else {
214
- return {
215
- success: false,
216
- };
217
- }
218
- };
219
-
220
- function getWorkMode(mood: MoodUIInfo | undefined, params: MoodPageParams): WorkMode {
221
- if (mood) return WorkMode.Scene;
222
- if (params.isFanLight || params.isUVCFan) return WorkMode.Control;
223
- if (params.isSupportColor) return WorkMode.Colour;
224
- return WorkMode.White;
225
- }
226
-
227
- const updateFlagMode = () => {
228
- if (flagMode?.flagMode) {
229
- saveFlagMode(
230
- devId,
231
- JSON.stringify({
232
- flagMode: false,
233
- flagId: undefined,
234
- })
235
- ).then();
236
- setFlagMode({
237
- flagMode: false,
238
- flagId: undefined,
239
- });
240
- }
241
- };
242
-
243
- const onAddMoodDialogItemClick = useCallback(
244
- (isStatic: boolean, _: number) => {
245
- if (!!state.originMoods) {
246
- navigationRoute(isStatic, 'add');
247
- }
248
- state.showAddMoodPopover = false;
249
- },
250
- [state.originMoods]
251
- );
252
-
253
- const getItemEnable = useCallback(
254
- (moodItem: MoodUIInfo) => {
255
- if (params.isCeilingLight) {
256
- return (
257
- moodInfo.mainLamp.id === moodItem.mainLamp.id &&
258
- moodInfo.secondaryLamp.id === moodItem.secondaryLamp.id &&
259
- (mainWork === WorkMode.Scene || secondaryWork === WorkMode.Scene)
260
- );
261
- } else {
262
- return moodInfo.id === moodItem.id && mainWork === WorkMode.Scene && !flagMode.flagMode;
263
- }
264
- },
265
- [moodInfo, mainWork]
266
- );
267
-
268
- const nameRepeat = useCallback((mood: MoodUIInfo) => {
269
- return !!state.originMoods.filter(m => !(params.isCeilingLight ? (m.mainLamp.id === mood.mainLamp.id && m.secondaryLamp.id === mood.secondaryLamp.id) : (m.id === mood.id))).find(m => m.name === mood.name)
270
- }, [state.originMoods, params.isCeilingLight])
271
-
272
- return (
273
- <>
274
- <Page
275
- backText={deviceInfo.name}
276
- headlineText={Strings.getLang('mood_overview_headline_text')}
277
- headlineIcon={state.originMoods.length < MAX_MOOD_COUNT ? res.add : undefined}
278
- onHeadlineIconClick={() => {
279
- if (params.isStringLight || params.isStripLight) {
280
- onAddMoodDialogItemClick(false, 1);
281
- } else {
282
- state.showAddMoodPopover = !state.showAddMoodPopover;
283
- }
284
- }}
285
- loading={state.loading}
286
- >
287
- <View style={styles.tagLine}>
288
- <Tag
289
- checked={state.staticTagChecked}
290
- text={Strings.getLang('mood_overview_filter_name_text1')}
291
- onCheckedChange={checked => {
292
- state.staticTagChecked = checked;
293
- }}
294
- />
295
- <Spacer width={cx(8)} height={0} />
296
- <Tag
297
- checked={state.dynamicTagChecked}
298
- text={Strings.getLang('mood_overview_filter_name_text2')}
299
- onCheckedChange={checked => {
300
- state.dynamicTagChecked = checked;
301
- }}
302
- />
303
- </View>
304
- <Spacer height={cx(10)} />
305
- {state.originMoods.length >= MAX_MOOD_COUNT && (
306
- <View style={styles.infoLine}>
307
- <Spacer height={cx(10)} />
308
- <InfoText
309
- icon={res.ic_warning_amber}
310
- text={Strings.getLang('mood_overview_warning_max_number_text')}
311
- contentColor={'#ff9500'}
312
- />
313
- <Spacer height={cx(6)} />
314
- </View>
315
- )}
316
- <FlatList
317
- data={state.filterMoods}
318
- renderItem={({ item }) => {
319
- return (
320
- <MoodItem
321
- enable={getItemEnable(item)}
322
- isMix={!!(params.isMixLight || params.isCeilingLight)}
323
- mood={item}
324
- onPress={() => {
325
- navigationRoute(item.mainLamp.nodes.length === 1, 'edit', item);
326
- }}
327
- onSwitch={async _ => {
328
- state.loading = true;
329
- await modDeleteMood('set', item);
330
- updateFlagMode();
331
- state.loading = false;
332
- }}
333
- />
334
- );
335
- }}
336
- ListHeaderComponent={() => <Spacer height={cx(10)} />}
337
- ItemSeparatorComponent={() => <Spacer />}
338
- ListFooterComponent={() => <Spacer />}
339
- keyExtractor={item => `${item.name}`}
340
- />
341
- </Page>
342
- <CustomListDialog
343
- show={state.showAddMoodPopover}
344
- style={styles.addMoodPopover}
345
- itemStyle={styles.popoverItem}
346
- onDismiss={() => {
347
- state.showAddMoodPopover = false;
348
- }}
349
- data={[
350
- {
351
- text: Strings.getLang('mood_overview_add_mood_text'),
352
- value: true,
353
- },
354
- {
355
- text: Strings.getLang('mood_overview_add_mood_text2'),
356
- value: false,
357
- },
358
- ]}
359
- onItemPress={onAddMoodDialogItemClick}
360
- />
361
- </>
362
- );
363
- };
364
-
365
- const styles = StyleSheet.create({
366
- tagLine: {
367
- flexDirection: 'row',
368
- marginHorizontal: cx(24),
369
- },
370
- infoLine: {
371
- marginHorizontal: cx(24),
372
- },
373
- addMoodPopover: {
374
- position: 'absolute',
375
- right: cx(60),
376
- top: Platform.OS === 'android' ? cx(90) : cx(130),
377
- maxWidth: cx(200),
378
- backgroundColor: '#fff',
379
- },
380
- popoverItem: {
381
- padding: cx(5),
382
- alignItems: 'flex-start',
383
- },
384
- });
385
-
386
- export default MoodPage;
1
+ import React, { useCallback, useEffect, useMemo } from 'react';
2
+ import Page from '@ledvance/base/src/components/Page';
3
+ import { Utils } from 'tuya-panel-kit';
4
+ import { saveMoodList, useWorkMode } from './MoodActions';
5
+ import {
6
+ useDeviceId,
7
+ useDeviceInfo,
8
+ useFlagMode,
9
+ useMoods,
10
+ } from '@ledvance/base/src/models/modules/NativePropsSlice';
11
+ import { useReactive } from 'ahooks';
12
+ import Strings from '@ledvance/base/src/i18n';
13
+ import res from '@ledvance/base/src/res';
14
+ import { FlatList, StyleSheet, View, Platform } from 'react-native';
15
+ import Tag from '@ledvance/base/src/components/Tag';
16
+ import Spacer from '@ledvance/base/src/components/Spacer';
17
+ import InfoText from '@ledvance/base/src/components/InfoText';
18
+ import CustomListDialog from '@ledvance/base/src/components/CustomListDialog';
19
+ import MoodItem from './MoodItem';
20
+ import { useNavigation } from '@react-navigation/core';
21
+ import { MoodPageParams, MoodPageState, MoodUIInfo } from './Interface';
22
+ import { getRemoteMoodList, useMoodScene } from './MoodActions';
23
+ import { useParams } from '@ledvance/base/src/hooks/Hooks';
24
+ import { ui_biz_routerKey } from '../../navigation/Routers'
25
+ import { cloneDeep, filter, map } from 'lodash';
26
+ import { saveFlagMode } from '@ledvance/ui-biz-bundle/src/modules/flags/FlagActions';
27
+ import { WorkMode } from '@ledvance/base/src/utils/interface';
28
+
29
+ const cx = Utils.RatioUtils.convertX;
30
+
31
+ const MAX_MOOD_COUNT = 255;
32
+
33
+ const MoodPage = () => {
34
+ const params = useParams<MoodPageParams>();
35
+ const deviceInfo = useDeviceInfo();
36
+ const devId = useDeviceId();
37
+ const navigation = useNavigation();
38
+ const [moodInfo, setMoodInfo] = useMoodScene(params);
39
+ const [moods, setMoods] = useMoods();
40
+ const [mainWork, setMainWork] = useWorkMode(params.mainWorkMode);
41
+ const [secondaryWork, setSecondaryWork] = useWorkMode(params.secondaryWorkMode!);
42
+ const [flagMode, setFlagMode] = useFlagMode();
43
+ const state = useReactive<MoodPageState>({
44
+ currentMood: undefined,
45
+ staticTagChecked: true,
46
+ dynamicTagChecked: true,
47
+ showAddMoodPopover: false,
48
+ originMoods: cloneDeep(moods),
49
+ filterMoods: [],
50
+ loading: false,
51
+ timerId: undefined as any,
52
+ flag: Symbol(),
53
+ });
54
+
55
+ const moodIds = useMemo(() => {
56
+ const mainIds = map(state.originMoods, 'id').filter(v => v !== undefined)
57
+ const secondaryIds = map(state.originMoods.map(m => m.secondaryLamp) || [], 'id')
58
+ return filter([...mainIds, ...secondaryIds], v => v !== undefined) as number[]
59
+ }, [JSON.stringify(state.originMoods)])
60
+
61
+ useEffect(() => {
62
+ state.loading = true
63
+ state.timerId = setTimeout(() => {
64
+ getRemoteMoodList(
65
+ devId,
66
+ params,
67
+ params.featureId
68
+ ).then(res => {
69
+ state.loading = false
70
+ if (res.success && Array.isArray(res.data)) {
71
+ console.log(res.data, '< --- res.data')
72
+ state.originMoods = cloneDeep(res.data);
73
+ }
74
+ });
75
+ }, 250);
76
+
77
+ return () => {
78
+ clearTimeout(state.timerId);
79
+ };
80
+ }, []);
81
+
82
+ useEffect(() => {
83
+ state.filterMoods = state.originMoods.filter(item => {
84
+ return (
85
+ (state.staticTagChecked && state.dynamicTagChecked) ||
86
+ (!state.staticTagChecked && !state.dynamicTagChecked) ||
87
+ (state.staticTagChecked && item.mainLamp.nodes.length < 2) ||
88
+ (state.dynamicTagChecked &&
89
+ (item.secondaryLamp.nodes.length > 1 || item.mainLamp.nodes.length > 1))
90
+ );
91
+ });
92
+ }, [state.staticTagChecked, state.dynamicTagChecked, state.originMoods]);
93
+
94
+ const navigationRoute = (isStatic: boolean, mode: 'add' | 'edit', currentMood?: MoodUIInfo) => {
95
+ const path =
96
+ mode === 'add'
97
+ ? ui_biz_routerKey.ui_biz_mood_add
98
+ : isStatic
99
+ ? ui_biz_routerKey.ui_biz_static_mood_edit
100
+ : !!(params.isMixLight || params.isCeilingLight)
101
+ ? ui_biz_routerKey.ui_biz_dynamic_mix_mood_edit
102
+ : ui_biz_routerKey.ui_biz_dynamic_mood_edit;
103
+ navigation.navigate(path, {
104
+ mode,
105
+ isStatic,
106
+ currentMood,
107
+ moduleParams: params,
108
+ moodIds,
109
+ nameRepeat,
110
+ modDeleteMood,
111
+ });
112
+ };
113
+
114
+ const modDeleteMood = async (mode: 'add' | 'edit' | 'del' | 'set', currentMood: MoodUIInfo) => {
115
+ const checkedMood: MoodUIInfo = {
116
+ ...currentMood,
117
+ mainLamp: {
118
+ ...currentMood.mainLamp,
119
+ nodes: currentMood.mainLamp.nodes.map(node => {
120
+ if (mode !== 'del') {
121
+ if (node.isColorNode) {
122
+ node.brightness = 0;
123
+ node.colorTemp = 0;
124
+ } else {
125
+ node.h = 0;
126
+ node.s = 0;
127
+ node.v = 0;
128
+ if (!params.isSupportTemperature) {
129
+ node.colorTemp = 100; // 适配dim灯
130
+ }
131
+ }
132
+ return node;
133
+ }
134
+ return node;
135
+ }),
136
+ },
137
+ secondaryLamp: {
138
+ ...currentMood.secondaryLamp,
139
+ nodes: currentMood.secondaryLamp && currentMood.secondaryLamp.nodes?.length
140
+ ? currentMood.secondaryLamp.nodes.map(node => {
141
+ if (mode !== 'del') {
142
+ if (node.isColorNode) {
143
+ node.brightness = 0;
144
+ node.colorTemp = 0;
145
+ } else {
146
+ node.h = 0;
147
+ node.s = 0;
148
+ node.v = 0;
149
+ if (!params.isSupportTemperature) {
150
+ node.colorTemp = 100; // 适配dim灯
151
+ }
152
+ }
153
+ return node;
154
+ }
155
+ return node;
156
+ })
157
+ : [],
158
+ },
159
+ };
160
+ if (mode === 'set') {
161
+ return setMoodInfo(checkedMood);
162
+ }
163
+ let newScene: MoodUIInfo[] = [];
164
+ if (mode === 'add') {
165
+ newScene = [checkedMood, ...state.originMoods];
166
+ } else if (mode === 'del') {
167
+ newScene = state.originMoods.filter(item => item.id !== checkedMood.id);
168
+ } else {
169
+ newScene = state.originMoods.map(item => {
170
+ if (item.id === checkedMood.id) {
171
+ return checkedMood;
172
+ }
173
+ return item;
174
+ });
175
+ }
176
+ const mood = mode === 'del' ? (newScene.length === 0 ? undefined : newScene[0]) : checkedMood;
177
+ const res = await saveMoodList(devId, newScene, params, params.featureId);
178
+ if (res.success) {
179
+ state.originMoods = cloneDeep(newScene);
180
+ setMoods(cloneDeep(newScene));
181
+ updateFlagMode();
182
+ if (mood) {
183
+ if (mode === 'del') {
184
+ if (
185
+ (mainWork !== WorkMode.Scene && secondaryWork !== WorkMode.Scene) ||
186
+ (params.isCeilingLight
187
+ ? currentMood.mainLamp.id !== moodInfo.mainLamp.id &&
188
+ currentMood.secondaryLamp.id !== moodInfo.secondaryLamp.id
189
+ : currentMood.id !== moodInfo.id)
190
+ ) {
191
+ return {
192
+ success: true,
193
+ };
194
+ }
195
+ }
196
+ setMoodInfo(mood).then();
197
+ } else {
198
+ if (mainWork === WorkMode.Scene) {
199
+ if (params.isCeilingLight) {
200
+ setMainWork(WorkMode.White).then();
201
+ } else {
202
+ const work = getWorkMode(undefined, params);
203
+ setMainWork(work).then();
204
+ }
205
+ }
206
+ if (params.isCeilingLight && params.secondaryWorkMode && secondaryWork === WorkMode.Scene) {
207
+ setSecondaryWork(WorkMode.Colour).then();
208
+ }
209
+ }
210
+ return {
211
+ success: true,
212
+ };
213
+ } else {
214
+ return {
215
+ success: false,
216
+ };
217
+ }
218
+ };
219
+
220
+ function getWorkMode(mood: MoodUIInfo | undefined, params: MoodPageParams): WorkMode {
221
+ if (mood) return WorkMode.Scene;
222
+ if (params.isFanLight || params.isUVCFan) return WorkMode.Control;
223
+ if (params.isSupportColor) return WorkMode.Colour;
224
+ return WorkMode.White;
225
+ }
226
+
227
+ const updateFlagMode = () => {
228
+ if (flagMode?.flagMode) {
229
+ saveFlagMode(
230
+ devId,
231
+ JSON.stringify({
232
+ flagMode: false,
233
+ flagId: undefined,
234
+ })
235
+ ).then();
236
+ setFlagMode({
237
+ flagMode: false,
238
+ flagId: undefined,
239
+ });
240
+ }
241
+ };
242
+
243
+ const onAddMoodDialogItemClick = useCallback(
244
+ (isStatic: boolean, _: number) => {
245
+ if (!!state.originMoods) {
246
+ navigationRoute(isStatic, 'add');
247
+ }
248
+ state.showAddMoodPopover = false;
249
+ },
250
+ [state.originMoods]
251
+ );
252
+
253
+ const getItemEnable = useCallback(
254
+ (moodItem: MoodUIInfo) => {
255
+ if (params.isCeilingLight) {
256
+ return (
257
+ moodInfo.mainLamp.id === moodItem.mainLamp.id &&
258
+ moodInfo.secondaryLamp.id === moodItem.secondaryLamp.id &&
259
+ (mainWork === WorkMode.Scene || secondaryWork === WorkMode.Scene)
260
+ );
261
+ } else {
262
+ return moodInfo.id === moodItem.id && mainWork === WorkMode.Scene && !flagMode.flagMode;
263
+ }
264
+ },
265
+ [moodInfo, mainWork]
266
+ );
267
+
268
+ const nameRepeat = useCallback((mood: MoodUIInfo) => {
269
+ return !!state.originMoods.filter(m => !(params.isCeilingLight ? (m.mainLamp.id === mood.mainLamp.id && m.secondaryLamp.id === mood.secondaryLamp.id) : (m.id === mood.id))).find(m => m.name === mood.name)
270
+ }, [state.originMoods, params.isCeilingLight])
271
+
272
+ return (
273
+ <>
274
+ <Page
275
+ backText={deviceInfo.name}
276
+ headlineText={Strings.getLang('mood_overview_headline_text')}
277
+ headlineIcon={state.originMoods.length < MAX_MOOD_COUNT ? res.add : undefined}
278
+ onHeadlineIconClick={() => {
279
+ if (params.isStringLight || params.isStripLight) {
280
+ onAddMoodDialogItemClick(false, 1);
281
+ } else {
282
+ state.showAddMoodPopover = !state.showAddMoodPopover;
283
+ }
284
+ }}
285
+ loading={state.loading}
286
+ >
287
+ <View style={styles.tagLine}>
288
+ <Tag
289
+ checked={state.staticTagChecked}
290
+ text={Strings.getLang('mood_overview_filter_name_text1')}
291
+ onCheckedChange={checked => {
292
+ state.staticTagChecked = checked;
293
+ }}
294
+ />
295
+ <Spacer width={cx(8)} height={0} />
296
+ <Tag
297
+ checked={state.dynamicTagChecked}
298
+ text={Strings.getLang('mood_overview_filter_name_text2')}
299
+ onCheckedChange={checked => {
300
+ state.dynamicTagChecked = checked;
301
+ }}
302
+ />
303
+ </View>
304
+ <Spacer height={cx(10)} />
305
+ {state.originMoods.length >= MAX_MOOD_COUNT && (
306
+ <View style={styles.infoLine}>
307
+ <Spacer height={cx(10)} />
308
+ <InfoText
309
+ icon={res.ic_warning_amber}
310
+ text={Strings.getLang('mood_overview_warning_max_number_text')}
311
+ contentColor={'#ff9500'}
312
+ />
313
+ <Spacer height={cx(6)} />
314
+ </View>
315
+ )}
316
+ <FlatList
317
+ data={state.filterMoods}
318
+ renderItem={({ item }) => {
319
+ return (
320
+ <MoodItem
321
+ enable={getItemEnable(item)}
322
+ isMix={!!(params.isMixLight || params.isCeilingLight)}
323
+ mood={item}
324
+ onPress={() => {
325
+ navigationRoute(item.mainLamp.nodes.length === 1, 'edit', item);
326
+ }}
327
+ onSwitch={async _ => {
328
+ state.loading = true;
329
+ await modDeleteMood('set', item);
330
+ updateFlagMode();
331
+ state.loading = false;
332
+ }}
333
+ />
334
+ );
335
+ }}
336
+ ListHeaderComponent={() => <Spacer height={cx(10)} />}
337
+ ItemSeparatorComponent={() => <Spacer />}
338
+ ListFooterComponent={() => <Spacer />}
339
+ keyExtractor={item => `${item.name}`}
340
+ />
341
+ </Page>
342
+ <CustomListDialog
343
+ show={state.showAddMoodPopover}
344
+ style={styles.addMoodPopover}
345
+ itemStyle={styles.popoverItem}
346
+ onDismiss={() => {
347
+ state.showAddMoodPopover = false;
348
+ }}
349
+ data={[
350
+ {
351
+ text: Strings.getLang('mood_overview_add_mood_text'),
352
+ value: true,
353
+ },
354
+ {
355
+ text: Strings.getLang('mood_overview_add_mood_text2'),
356
+ value: false,
357
+ },
358
+ ]}
359
+ onItemPress={onAddMoodDialogItemClick}
360
+ />
361
+ </>
362
+ );
363
+ };
364
+
365
+ const styles = StyleSheet.create({
366
+ tagLine: {
367
+ flexDirection: 'row',
368
+ marginHorizontal: cx(24),
369
+ },
370
+ infoLine: {
371
+ marginHorizontal: cx(24),
372
+ },
373
+ addMoodPopover: {
374
+ position: 'absolute',
375
+ right: cx(60),
376
+ top: Platform.OS === 'android' ? cx(90) : cx(130),
377
+ maxWidth: cx(200),
378
+ backgroundColor: '#fff',
379
+ },
380
+ popoverItem: {
381
+ padding: cx(5),
382
+ alignItems: 'flex-start',
383
+ },
384
+ });
385
+
386
+ export default MoodPage;