@ledvance/ui-biz-bundle 1.1.68 → 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 -46
  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,422 +1,422 @@
1
- import React, { useCallback } from 'react'
2
- import { FlatList, Image, SafeAreaView, ScrollView, Text, TouchableOpacity, View } from 'react-native'
3
- import LDVTopBar from '@ledvance/base/src/components/ldvTopBar'
4
- import { useNavigation, useRoute } from '@react-navigation/native'
5
- import { Dialog, Slider, SwitchButton, Tab, TabBar, TYSdk, Utils } from 'tuya-panel-kit'
6
- import { useReactive, useUpdate, useUpdateEffect } from 'ahooks'
7
- import ColorExtractor, { colorTemperatureToColor } from '@ledvance/base/src/components/ColorExtractor'
8
- import { SceneNodeTransitionMode, SceneUIState } from './SceneInfo'
9
- import ColorUtils from '@ledvance/base/src/utils/ColorUtils'
10
- import { saveScene, useScene } from './SceneAction'
11
- import { useDeviceId } from '@ledvance/base/src/models/modules/NativePropsSlice'
12
- import Cell from '@ledvance/base/src/components/Cell'
13
- import Strings from '@ledvance/base/src/i18n'
14
- import res from '@ledvance/base/src/res'
15
- import LdvItemView from '@ledvance/base/src/components/ldvItemView'
16
- import LdvSlider from '@ledvance/base/src/components/ldvSlider'
17
- import dpCodes from 'config/dpCodes'
18
-
19
- const cx = Utils.RatioUtils.convertX
20
-
21
- interface SceneDetailPageParams {
22
- scene: SceneUIState
23
- sceneList: SceneUIState[],
24
- onSave: () => void
25
- }
26
-
27
- export default function SceneDetailPage() {
28
- const deviceId = useDeviceId()
29
- const navigation = useNavigation()
30
- const params = useRoute().params as SceneDetailPageParams
31
- const scene: SceneUIState = JSON.parse(JSON.stringify(params.scene))
32
- const update = useUpdate()
33
- const sceneList = params.sceneList
34
- const [, setScene] = useScene(dpCodes)
35
- const state = useReactive({
36
- name: scene.name,
37
- fanEnable: scene.fanEnable,
38
- fanSpeed: scene.fanSpeed,
39
- nodes: scene.nodes,
40
- transitionMode: scene.nodes[0].transitionMode,
41
- transitionTime: scene.nodes[0].transitionTime,
42
- currentNode: scene.nodes[scene.nodes.length - 1],
43
- transitionModeSelections: [
44
- {
45
- key: SceneNodeTransitionMode.Static,
46
- title: Strings.getLang('Static'),
47
- },
48
- {
49
- key: SceneNodeTransitionMode.Jump,
50
- title: Strings.getLang('Jump'),
51
- },
52
- {
53
- key: SceneNodeTransitionMode.Gradient,
54
- title: Strings.getLang('Gradient'),
55
- },
56
- ],
57
- tabs: [
58
- {
59
- key: '0',
60
- title: Strings.getLang('Colour'),
61
- },
62
- {
63
- key: '1',
64
- title: Strings.getLang('White'),
65
- },
66
- ],
67
- })
68
-
69
- useUpdateEffect(() => {
70
- if (state.currentNode.isColorNode) {
71
- TYSdk.event.emit('onColorChange', ColorUtils.hsv2Hex(state.currentNode.h, state.currentNode.s, state.currentNode.v))
72
- } else {
73
- TYSdk.event.emit('onColorTempChange', ColorUtils.hsv2Hex(0, state.currentNode.colorTemp, 100))
74
- }
75
- }, [state.currentNode, state.currentNode.isColorNode])
76
-
77
- const getNodeListData = useCallback(() => {
78
- if (state.transitionMode === SceneNodeTransitionMode.Static) {
79
- if (state.currentNode !== state.nodes[0]) {
80
- state.currentNode = state.nodes[0]
81
- }
82
- return [state.nodes[0]]
83
- } else if (state.nodes.length >= 8) {
84
- return [...state.nodes, 'remove']
85
- } else if (state.nodes.length <= 1) {
86
- return [...state.nodes, 'add']
87
- } else {
88
- return [...state.nodes, 'add', 'remove']
89
- }
90
- }, [])
91
-
92
- const onTopBarRightBtnClick = useCallback(async () => {
93
- const sceneObj = {
94
- id: scene.id,
95
- fanEnable: state.fanEnable,
96
- fanSpeed: state.fanSpeed,
97
- name: state.name,
98
- image: scene.image,
99
- nodes: scene.nodes,
100
- }
101
- const saveRes = await saveScene(deviceId, sceneObj, state.transitionMode, state.transitionTime, sceneList)
102
- console.log('保存场景列表结果', saveRes)
103
- if (saveRes.success) {
104
- const setSceneRes = await setScene(deviceId, sceneObj,dpCodes)
105
- console.log('设置修改后的场景结果', setSceneRes)
106
- params.onSave()
107
- navigation.goBack()
108
- }
109
- }, [])
110
-
111
- return (
112
- <View style={{ flex: 1 }}>
113
- <LDVTopBar
114
- title={Strings.getLang('Scene Edit')}
115
- onBackPress={() => {
116
- navigation.goBack()
117
- }}
118
- rightButtonIcon={res.ic_check}
119
- onRightButtonPress={onTopBarRightBtnClick} />
120
- <ScrollView style={{ flex: 1 }} nestedScrollEnabled={true}>
121
- <View style={{ flexDirection: 'column', flex: 1 }}>
122
- <Cell
123
- title={Strings.getLang('Scene name')}
124
- value={state.name}
125
- onPress={() => {
126
- Dialog.prompt({
127
- title: Strings.getLang('Modify the scene name'),
128
- cancelText: Strings.getLang('Cancel'),
129
- confirmText: Strings.getLang('Confirm'),
130
- defaultValue: state.name,
131
- placeholder: Strings.getLang('Scene name'),
132
- onConfirm: (text, { close }) => {
133
- state.name = text
134
- close()
135
- },
136
- })
137
- }} />
138
- <TabBar
139
- type="radio"
140
- activeKey={state.transitionMode}
141
- tabs={state.transitionModeSelections}
142
- onChange={value => {
143
- state.transitionMode = parseInt(value)
144
- }}
145
- style={{
146
- marginHorizontal: cx(24),
147
- height: cx(40),
148
- borderRadius: cx(20),
149
- backgroundColor: '#eee',
150
- }}
151
- tabTextStyle={{ fontSize: cx(11), color: '#666' }}
152
- tabActiveTextStyle={{
153
- fontSize: cx(11),
154
- color: '#f60',
155
- }} />
156
- {state.transitionMode !== SceneNodeTransitionMode.Static && <>
157
- <View style={{ height: cx(20) }} />
158
- <Text style={{
159
- marginStart: cx(24),
160
- fontSize: cx(14),
161
- color: '#000',
162
- fontFamily: 'helvetica_neue_lt_std_roman',
163
- }}>{Strings.getLang('Transform time')}</Text>
164
- <Slider.Horizontal
165
- value={state.transitionTime}
166
- minimumValue={0}
167
- maximumValue={100}
168
- theme={{
169
- trackRadius: cx(3),
170
- trackHeight: cx(6),
171
- thumbSize: cx(26),
172
- thumbRadius: cx(26),
173
- thumbTintColor: '#FFF',
174
- minimumTrackTintColor: '#f60',
175
- maximumTrackTintColor: '#eee',
176
- }}
177
- style={{ marginHorizontal: cx(24) }}
178
- onSlidingComplete={v => {
179
- state.transitionTime = Math.round(v)
180
- }} />
181
- <SafeAreaView>
182
- <FlatList
183
- style={{ marginStart: cx(6) }}
184
- numColumns={5}
185
- data={getNodeListData()}
186
- renderItem={({ item: node }) => {
187
- if (typeof node === 'string') {
188
- return (
189
- <TouchableOpacity
190
- style={{
191
- width: cx(50),
192
- height: cx(50),
193
- marginStart: cx(18),
194
- marginTop: cx(10),
195
- backgroundColor: '#ff660080',
196
- borderColor: '#ffffffff',
197
- borderWidth: cx(2),
198
- borderRadius: cx(25),
199
- justifyContent: 'center',
200
- alignItems: 'center',
201
- }}
202
- onPress={() => {
203
- if (node === 'add') {
204
- const newNode = {
205
- switchingInterval: state.transitionTime,
206
- transitionTime: state.transitionTime,
207
- transitionMode: state.transitionMode,
208
- h: 0,
209
- s: 100,
210
- v: 100,
211
- brightness: 0,
212
- colorTemp: 0,
213
- isColorNode: true,
214
- }
215
- state.nodes.push(newNode)
216
- state.currentNode = newNode
217
- } else {
218
- const index = state.nodes.findIndex(item => item === state.currentNode)
219
- state.nodes.splice(index, 1)
220
- state.currentNode = state.nodes[index <= state.nodes.length - 1 ? index : index - 1]
221
- }
222
- }}>
223
- <Image
224
- style={{ width: 24, height: 24 }}
225
- source={{ uri: node === 'add' ? res.add : res.delete }} />
226
- </TouchableOpacity>
227
- )
228
- }
229
- const ct = (node.colorTemp / 100) * (6500 - 2700) + 2700
230
- const color = colorTemperatureToColor(ct)
231
- return (
232
- <TouchableOpacity
233
- style={{
234
- width: cx(50),
235
- height: cx(50),
236
- marginStart: cx(18),
237
- marginTop: cx(10),
238
- borderColor: state.currentNode === node ? '#f60' : '#ffffffff',
239
- borderWidth: cx(2),
240
- borderRadius: cx(25),
241
- justifyContent: 'center',
242
- alignItems: 'center',
243
- }}
244
- onPress={() => {
245
- state.currentNode = node
246
- }}>
247
- <View style={{
248
- width: cx(40),
249
- height: cx(40),
250
- borderRadius: cx(20),
251
- backgroundColor: node.isColorNode ? ColorUtils.hsv2Hex(node.h, node.s, 100) : color,
252
- }} />
253
- </TouchableOpacity>
254
- )
255
- }}
256
- keyExtractor={(_item, index) => `${index}`} />
257
- </SafeAreaView>
258
- </>}
259
- <View style={{ height: cx(380) }}>
260
- <Tab
261
- activeKey={state.currentNode.isColorNode ? '0' : '1'}
262
- tabTextStyle={{
263
- fontSize: cx(14),
264
- color: '#666',
265
- fontFamily: 'helvetica_neue_lt_std_roman',
266
- }}
267
- tabActiveTextStyle={{ color: '#f60' }}
268
- tabBarUnderlineStyle={{ backgroundColor: '#f60' }}
269
- tabDefaultColor={'#666'}
270
- onChange={(value: string) => {
271
- state.currentNode.isColorNode = value === '0'
272
- update()
273
- }}>
274
- <Tab.TabPane style={{ flex: 1 }} key={state.tabs[0].key} tab={state.tabs[0].title}>
275
- <View style={{ flex: 1 }}>
276
- <View style={{ height: cx(30) }} />
277
- <ColorExtractor
278
- radius={100}
279
- color={ColorUtils.hsv2Hex(state.currentNode.h, state.currentNode.s, state.currentNode.v)}
280
- onColorChange={(color, isFirst) => {
281
- if (!isFirst) {
282
- state.currentNode.h = Math.round(color.h)
283
- state.currentNode.s = Math.round(color.s)
284
- update()
285
- }
286
- }} />
287
- <View style={{ height: cx(30) }} />
288
- <View
289
- style={{
290
- flexDirection: 'row',
291
- justifyContent: 'space-between',
292
- marginHorizontal: cx(24),
293
- }}>
294
- <Text style={{
295
- fontSize: cx(14),
296
- color: '#000',
297
- fontFamily: 'helvetica_neue_lt_std_roman',
298
- }}>{'亮度'}</Text>
299
- <Text style={{
300
- fontSize: cx(14),
301
- color: '#000',
302
- fontFamily: 'helvetica_neue_lt_std_roman',
303
- }}>{state.currentNode.v}%</Text>
304
- </View>
305
- <Slider.Horizontal
306
- value={state.currentNode.v}
307
- minimumValue={0}
308
- maximumValue={100}
309
- theme={{
310
- trackRadius: cx(3),
311
- trackHeight: cx(6),
312
- thumbSize: cx(26),
313
- thumbRadius: cx(26),
314
- thumbTintColor: '#FFF',
315
- minimumTrackTintColor: '#f60',
316
- maximumTrackTintColor: '#eee',
317
- }}
318
- style={{ marginHorizontal: cx(24) }}
319
- onValueChange={v => {
320
- state.currentNode.v = Math.round(v)
321
- update()
322
- }}
323
- onSlidingComplete={v => {
324
- state.currentNode.v = Math.round(v)
325
- update()
326
- }} />
327
- </View>
328
- </Tab.TabPane>
329
- <Tab.TabPane style={{ flex: 1 }} key={state.tabs[1].key} tab={state.tabs[1].title}>
330
- <View style={{ flex: 1 }}>
331
- <View style={{ height: cx(30) }} />
332
- <ColorExtractor
333
- radius={100}
334
- color={ColorUtils.hsv2Hex(0, state.currentNode.colorTemp, 100)}
335
- showColorTemperature={true}
336
- colorTemperatureInterval={6500 - 2700}
337
- miniColorTemperature={2700}
338
- onColorChange={(color, isFirst) => {
339
- if (!isFirst) {
340
- state.currentNode.colorTemp = Math.round(color.s)
341
- update()
342
- }
343
- }} />
344
- <View style={{ height: cx(30) }} />
345
- <View
346
- style={{
347
- flexDirection: 'row',
348
- justifyContent: 'space-between',
349
- marginHorizontal: cx(24),
350
- }}>
351
- <Text style={{
352
- fontSize: cx(14),
353
- color: '#000',
354
- fontFamily: 'helvetica_neue_lt_std_roman',
355
- }}>{Strings.getLang('add_new_trigger_time_field_brightness_text')}</Text>
356
- <Text style={{
357
- fontSize: cx(14),
358
- color: '#000',
359
- fontFamily: 'helvetica_neue_lt_std_roman',
360
- }}>{state.currentNode.brightness}%</Text>
361
- </View>
362
- <Slider.Horizontal
363
- value={state.currentNode.brightness}
364
- minimumValue={0}
365
- maximumValue={100}
366
- theme={{
367
- trackRadius: cx(3),
368
- trackHeight: cx(6),
369
- thumbSize: cx(26),
370
- thumbRadius: cx(26),
371
- thumbTintColor: '#FFF',
372
- minimumTrackTintColor: '#f60',
373
- maximumTrackTintColor: '#eee',
374
- }}
375
- style={{ marginHorizontal: cx(24) }}
376
- onValueChange={v => {
377
- state.currentNode.brightness = Math.round(v)
378
- update()
379
- }}
380
- onSlidingComplete={v => {
381
- state.currentNode.brightness = Math.round(v)
382
- update()
383
- }} />
384
- </View>
385
- </Tab.TabPane>
386
- </Tab>
387
- </View>
388
- <View style={{ height: cx(20) }} />
389
- </View>
390
- <View style={{}}>
391
- <LdvItemView title={Strings.getLang('timeschedule_add_schedule_ceiling_fan_selectionfield_text2')} />
392
- <LdvItemView
393
- title={Strings.getLang('Fan Switch')}
394
- textStyle={{ fontWeight: 'normal' }}
395
- disabled={false}
396
- rightComponent={() => {
397
- return (<SwitchButton
398
- value={state.fanEnable}
399
- onValueChange={() => {
400
- state.fanEnable = !state.fanEnable
401
- }} />)
402
- }}
403
- />
404
-
405
- <LdvSlider
406
- style={{ paddingHorizontal: cx(20) }}
407
- titleStyle={{ fontSize: cx(16) }}
408
- title={Strings.getLang('ceiling_fan_tile_uvc_fan_speed')}
409
- min={1}
410
- max={3}
411
- value={state.fanSpeed}
412
- subTitleStr={state.fanSpeed + '/3'}
413
- onValueChange={() => {
414
- }}
415
- onSlidingComplete={value => state.fanSpeed = value}
416
- />
417
- </View>
418
- <View style={{ height: cx(100) }} />
419
- </ScrollView>
420
- </View>
421
- )
1
+ import React, { useCallback } from 'react'
2
+ import { FlatList, Image, SafeAreaView, ScrollView, Text, TouchableOpacity, View } from 'react-native'
3
+ import LDVTopBar from '@ledvance/base/src/components/ldvTopBar'
4
+ import { useNavigation, useRoute } from '@react-navigation/native'
5
+ import { Dialog, Slider, SwitchButton, Tab, TabBar, TYSdk, Utils } from 'tuya-panel-kit'
6
+ import { useReactive, useUpdate, useUpdateEffect } from 'ahooks'
7
+ import ColorExtractor, { colorTemperatureToColor } from '@ledvance/base/src/components/ColorExtractor'
8
+ import { SceneNodeTransitionMode, SceneUIState } from './SceneInfo'
9
+ import ColorUtils from '@ledvance/base/src/utils/ColorUtils'
10
+ import { saveScene, useScene } from './SceneAction'
11
+ import { useDeviceId } from '@ledvance/base/src/models/modules/NativePropsSlice'
12
+ import Cell from '@ledvance/base/src/components/Cell'
13
+ import Strings from '@ledvance/base/src/i18n'
14
+ import res from '@ledvance/base/src/res'
15
+ import LdvItemView from '@ledvance/base/src/components/ldvItemView'
16
+ import LdvSlider from '@ledvance/base/src/components/ldvSlider'
17
+ import dpCodes from 'config/dpCodes'
18
+
19
+ const cx = Utils.RatioUtils.convertX
20
+
21
+ interface SceneDetailPageParams {
22
+ scene: SceneUIState
23
+ sceneList: SceneUIState[],
24
+ onSave: () => void
25
+ }
26
+
27
+ export default function SceneDetailPage() {
28
+ const deviceId = useDeviceId()
29
+ const navigation = useNavigation()
30
+ const params = useRoute().params as SceneDetailPageParams
31
+ const scene: SceneUIState = JSON.parse(JSON.stringify(params.scene))
32
+ const update = useUpdate()
33
+ const sceneList = params.sceneList
34
+ const [, setScene] = useScene(dpCodes)
35
+ const state = useReactive({
36
+ name: scene.name,
37
+ fanEnable: scene.fanEnable,
38
+ fanSpeed: scene.fanSpeed,
39
+ nodes: scene.nodes,
40
+ transitionMode: scene.nodes[0].transitionMode,
41
+ transitionTime: scene.nodes[0].transitionTime,
42
+ currentNode: scene.nodes[scene.nodes.length - 1],
43
+ transitionModeSelections: [
44
+ {
45
+ key: SceneNodeTransitionMode.Static,
46
+ title: Strings.getLang('Static'),
47
+ },
48
+ {
49
+ key: SceneNodeTransitionMode.Jump,
50
+ title: Strings.getLang('Jump'),
51
+ },
52
+ {
53
+ key: SceneNodeTransitionMode.Gradient,
54
+ title: Strings.getLang('Gradient'),
55
+ },
56
+ ],
57
+ tabs: [
58
+ {
59
+ key: '0',
60
+ title: Strings.getLang('Colour'),
61
+ },
62
+ {
63
+ key: '1',
64
+ title: Strings.getLang('White'),
65
+ },
66
+ ],
67
+ })
68
+
69
+ useUpdateEffect(() => {
70
+ if (state.currentNode.isColorNode) {
71
+ TYSdk.event.emit('onColorChange', ColorUtils.hsv2Hex(state.currentNode.h, state.currentNode.s, state.currentNode.v))
72
+ } else {
73
+ TYSdk.event.emit('onColorTempChange', ColorUtils.hsv2Hex(0, state.currentNode.colorTemp, 100))
74
+ }
75
+ }, [state.currentNode, state.currentNode.isColorNode])
76
+
77
+ const getNodeListData = useCallback(() => {
78
+ if (state.transitionMode === SceneNodeTransitionMode.Static) {
79
+ if (state.currentNode !== state.nodes[0]) {
80
+ state.currentNode = state.nodes[0]
81
+ }
82
+ return [state.nodes[0]]
83
+ } else if (state.nodes.length >= 8) {
84
+ return [...state.nodes, 'remove']
85
+ } else if (state.nodes.length <= 1) {
86
+ return [...state.nodes, 'add']
87
+ } else {
88
+ return [...state.nodes, 'add', 'remove']
89
+ }
90
+ }, [])
91
+
92
+ const onTopBarRightBtnClick = useCallback(async () => {
93
+ const sceneObj = {
94
+ id: scene.id,
95
+ fanEnable: state.fanEnable,
96
+ fanSpeed: state.fanSpeed,
97
+ name: state.name,
98
+ image: scene.image,
99
+ nodes: scene.nodes,
100
+ }
101
+ const saveRes = await saveScene(deviceId, sceneObj, state.transitionMode, state.transitionTime, sceneList)
102
+ console.log('保存场景列表结果', saveRes)
103
+ if (saveRes.success) {
104
+ const setSceneRes = await setScene(deviceId, sceneObj,dpCodes)
105
+ console.log('设置修改后的场景结果', setSceneRes)
106
+ params.onSave()
107
+ navigation.goBack()
108
+ }
109
+ }, [])
110
+
111
+ return (
112
+ <View style={{ flex: 1 }}>
113
+ <LDVTopBar
114
+ title={Strings.getLang('Scene Edit')}
115
+ onBackPress={() => {
116
+ navigation.goBack()
117
+ }}
118
+ rightButtonIcon={res.ic_check}
119
+ onRightButtonPress={onTopBarRightBtnClick} />
120
+ <ScrollView style={{ flex: 1 }} nestedScrollEnabled={true}>
121
+ <View style={{ flexDirection: 'column', flex: 1 }}>
122
+ <Cell
123
+ title={Strings.getLang('Scene name')}
124
+ value={state.name}
125
+ onPress={() => {
126
+ Dialog.prompt({
127
+ title: Strings.getLang('Modify the scene name'),
128
+ cancelText: Strings.getLang('Cancel'),
129
+ confirmText: Strings.getLang('Confirm'),
130
+ defaultValue: state.name,
131
+ placeholder: Strings.getLang('Scene name'),
132
+ onConfirm: (text, { close }) => {
133
+ state.name = text
134
+ close()
135
+ },
136
+ })
137
+ }} />
138
+ <TabBar
139
+ type="radio"
140
+ activeKey={state.transitionMode}
141
+ tabs={state.transitionModeSelections}
142
+ onChange={value => {
143
+ state.transitionMode = parseInt(value)
144
+ }}
145
+ style={{
146
+ marginHorizontal: cx(24),
147
+ height: cx(40),
148
+ borderRadius: cx(20),
149
+ backgroundColor: '#eee',
150
+ }}
151
+ tabTextStyle={{ fontSize: cx(11), color: '#666' }}
152
+ tabActiveTextStyle={{
153
+ fontSize: cx(11),
154
+ color: '#f60',
155
+ }} />
156
+ {state.transitionMode !== SceneNodeTransitionMode.Static && <>
157
+ <View style={{ height: cx(20) }} />
158
+ <Text style={{
159
+ marginStart: cx(24),
160
+ fontSize: cx(14),
161
+ color: '#000',
162
+ fontFamily: 'helvetica_neue_lt_std_roman',
163
+ }}>{Strings.getLang('Transform time')}</Text>
164
+ <Slider.Horizontal
165
+ value={state.transitionTime}
166
+ minimumValue={0}
167
+ maximumValue={100}
168
+ theme={{
169
+ trackRadius: cx(3),
170
+ trackHeight: cx(6),
171
+ thumbSize: cx(26),
172
+ thumbRadius: cx(26),
173
+ thumbTintColor: '#FFF',
174
+ minimumTrackTintColor: '#f60',
175
+ maximumTrackTintColor: '#eee',
176
+ }}
177
+ style={{ marginHorizontal: cx(24) }}
178
+ onSlidingComplete={v => {
179
+ state.transitionTime = Math.round(v)
180
+ }} />
181
+ <SafeAreaView>
182
+ <FlatList
183
+ style={{ marginStart: cx(6) }}
184
+ numColumns={5}
185
+ data={getNodeListData()}
186
+ renderItem={({ item: node }) => {
187
+ if (typeof node === 'string') {
188
+ return (
189
+ <TouchableOpacity
190
+ style={{
191
+ width: cx(50),
192
+ height: cx(50),
193
+ marginStart: cx(18),
194
+ marginTop: cx(10),
195
+ backgroundColor: '#ff660080',
196
+ borderColor: '#ffffffff',
197
+ borderWidth: cx(2),
198
+ borderRadius: cx(25),
199
+ justifyContent: 'center',
200
+ alignItems: 'center',
201
+ }}
202
+ onPress={() => {
203
+ if (node === 'add') {
204
+ const newNode = {
205
+ switchingInterval: state.transitionTime,
206
+ transitionTime: state.transitionTime,
207
+ transitionMode: state.transitionMode,
208
+ h: 0,
209
+ s: 100,
210
+ v: 100,
211
+ brightness: 0,
212
+ colorTemp: 0,
213
+ isColorNode: true,
214
+ }
215
+ state.nodes.push(newNode)
216
+ state.currentNode = newNode
217
+ } else {
218
+ const index = state.nodes.findIndex(item => item === state.currentNode)
219
+ state.nodes.splice(index, 1)
220
+ state.currentNode = state.nodes[index <= state.nodes.length - 1 ? index : index - 1]
221
+ }
222
+ }}>
223
+ <Image
224
+ style={{ width: 24, height: 24 }}
225
+ source={{ uri: node === 'add' ? res.add : res.delete }} />
226
+ </TouchableOpacity>
227
+ )
228
+ }
229
+ const ct = (node.colorTemp / 100) * (6500 - 2700) + 2700
230
+ const color = colorTemperatureToColor(ct)
231
+ return (
232
+ <TouchableOpacity
233
+ style={{
234
+ width: cx(50),
235
+ height: cx(50),
236
+ marginStart: cx(18),
237
+ marginTop: cx(10),
238
+ borderColor: state.currentNode === node ? '#f60' : '#ffffffff',
239
+ borderWidth: cx(2),
240
+ borderRadius: cx(25),
241
+ justifyContent: 'center',
242
+ alignItems: 'center',
243
+ }}
244
+ onPress={() => {
245
+ state.currentNode = node
246
+ }}>
247
+ <View style={{
248
+ width: cx(40),
249
+ height: cx(40),
250
+ borderRadius: cx(20),
251
+ backgroundColor: node.isColorNode ? ColorUtils.hsv2Hex(node.h, node.s, 100) : color,
252
+ }} />
253
+ </TouchableOpacity>
254
+ )
255
+ }}
256
+ keyExtractor={(_item, index) => `${index}`} />
257
+ </SafeAreaView>
258
+ </>}
259
+ <View style={{ height: cx(380) }}>
260
+ <Tab
261
+ activeKey={state.currentNode.isColorNode ? '0' : '1'}
262
+ tabTextStyle={{
263
+ fontSize: cx(14),
264
+ color: '#666',
265
+ fontFamily: 'helvetica_neue_lt_std_roman',
266
+ }}
267
+ tabActiveTextStyle={{ color: '#f60' }}
268
+ tabBarUnderlineStyle={{ backgroundColor: '#f60' }}
269
+ tabDefaultColor={'#666'}
270
+ onChange={(value: string) => {
271
+ state.currentNode.isColorNode = value === '0'
272
+ update()
273
+ }}>
274
+ <Tab.TabPane style={{ flex: 1 }} key={state.tabs[0].key} tab={state.tabs[0].title}>
275
+ <View style={{ flex: 1 }}>
276
+ <View style={{ height: cx(30) }} />
277
+ <ColorExtractor
278
+ radius={100}
279
+ color={ColorUtils.hsv2Hex(state.currentNode.h, state.currentNode.s, state.currentNode.v)}
280
+ onColorChange={(color, isFirst) => {
281
+ if (!isFirst) {
282
+ state.currentNode.h = Math.round(color.h)
283
+ state.currentNode.s = Math.round(color.s)
284
+ update()
285
+ }
286
+ }} />
287
+ <View style={{ height: cx(30) }} />
288
+ <View
289
+ style={{
290
+ flexDirection: 'row',
291
+ justifyContent: 'space-between',
292
+ marginHorizontal: cx(24),
293
+ }}>
294
+ <Text style={{
295
+ fontSize: cx(14),
296
+ color: '#000',
297
+ fontFamily: 'helvetica_neue_lt_std_roman',
298
+ }}>{'亮度'}</Text>
299
+ <Text style={{
300
+ fontSize: cx(14),
301
+ color: '#000',
302
+ fontFamily: 'helvetica_neue_lt_std_roman',
303
+ }}>{state.currentNode.v}%</Text>
304
+ </View>
305
+ <Slider.Horizontal
306
+ value={state.currentNode.v}
307
+ minimumValue={0}
308
+ maximumValue={100}
309
+ theme={{
310
+ trackRadius: cx(3),
311
+ trackHeight: cx(6),
312
+ thumbSize: cx(26),
313
+ thumbRadius: cx(26),
314
+ thumbTintColor: '#FFF',
315
+ minimumTrackTintColor: '#f60',
316
+ maximumTrackTintColor: '#eee',
317
+ }}
318
+ style={{ marginHorizontal: cx(24) }}
319
+ onValueChange={v => {
320
+ state.currentNode.v = Math.round(v)
321
+ update()
322
+ }}
323
+ onSlidingComplete={v => {
324
+ state.currentNode.v = Math.round(v)
325
+ update()
326
+ }} />
327
+ </View>
328
+ </Tab.TabPane>
329
+ <Tab.TabPane style={{ flex: 1 }} key={state.tabs[1].key} tab={state.tabs[1].title}>
330
+ <View style={{ flex: 1 }}>
331
+ <View style={{ height: cx(30) }} />
332
+ <ColorExtractor
333
+ radius={100}
334
+ color={ColorUtils.hsv2Hex(0, state.currentNode.colorTemp, 100)}
335
+ showColorTemperature={true}
336
+ colorTemperatureInterval={6500 - 2700}
337
+ miniColorTemperature={2700}
338
+ onColorChange={(color, isFirst) => {
339
+ if (!isFirst) {
340
+ state.currentNode.colorTemp = Math.round(color.s)
341
+ update()
342
+ }
343
+ }} />
344
+ <View style={{ height: cx(30) }} />
345
+ <View
346
+ style={{
347
+ flexDirection: 'row',
348
+ justifyContent: 'space-between',
349
+ marginHorizontal: cx(24),
350
+ }}>
351
+ <Text style={{
352
+ fontSize: cx(14),
353
+ color: '#000',
354
+ fontFamily: 'helvetica_neue_lt_std_roman',
355
+ }}>{Strings.getLang('add_new_trigger_time_field_brightness_text')}</Text>
356
+ <Text style={{
357
+ fontSize: cx(14),
358
+ color: '#000',
359
+ fontFamily: 'helvetica_neue_lt_std_roman',
360
+ }}>{state.currentNode.brightness}%</Text>
361
+ </View>
362
+ <Slider.Horizontal
363
+ value={state.currentNode.brightness}
364
+ minimumValue={0}
365
+ maximumValue={100}
366
+ theme={{
367
+ trackRadius: cx(3),
368
+ trackHeight: cx(6),
369
+ thumbSize: cx(26),
370
+ thumbRadius: cx(26),
371
+ thumbTintColor: '#FFF',
372
+ minimumTrackTintColor: '#f60',
373
+ maximumTrackTintColor: '#eee',
374
+ }}
375
+ style={{ marginHorizontal: cx(24) }}
376
+ onValueChange={v => {
377
+ state.currentNode.brightness = Math.round(v)
378
+ update()
379
+ }}
380
+ onSlidingComplete={v => {
381
+ state.currentNode.brightness = Math.round(v)
382
+ update()
383
+ }} />
384
+ </View>
385
+ </Tab.TabPane>
386
+ </Tab>
387
+ </View>
388
+ <View style={{ height: cx(20) }} />
389
+ </View>
390
+ <View style={{}}>
391
+ <LdvItemView title={Strings.getLang('timeschedule_add_schedule_ceiling_fan_selectionfield_text2')} />
392
+ <LdvItemView
393
+ title={Strings.getLang('Fan Switch')}
394
+ textStyle={{ fontWeight: 'normal' }}
395
+ disabled={false}
396
+ rightComponent={() => {
397
+ return (<SwitchButton
398
+ value={state.fanEnable}
399
+ onValueChange={() => {
400
+ state.fanEnable = !state.fanEnable
401
+ }} />)
402
+ }}
403
+ />
404
+
405
+ <LdvSlider
406
+ style={{ paddingHorizontal: cx(20) }}
407
+ titleStyle={{ fontSize: cx(16) }}
408
+ title={Strings.getLang('ceiling_fan_tile_uvc_fan_speed')}
409
+ min={1}
410
+ max={3}
411
+ value={state.fanSpeed}
412
+ subTitleStr={state.fanSpeed + '/3'}
413
+ onValueChange={() => {
414
+ }}
415
+ onSlidingComplete={value => state.fanSpeed = value}
416
+ />
417
+ </View>
418
+ <View style={{ height: cx(100) }} />
419
+ </ScrollView>
420
+ </View>
421
+ )
422
422
  }