@ledvance/ui-biz-bundle 1.1.69 → 1.1.71

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 (222) 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 +62 -11
  162. package/src/newModules/biorhythm/BiorhythmPage.tsx +1 -4
  163. package/src/newModules/childLock/ChildLockPage.tsx +97 -97
  164. package/src/newModules/childLock/Router.ts +16 -16
  165. package/src/newModules/energyConsumption/EnergyConsumptionActions.ts +23 -23
  166. package/src/newModules/energyConsumption/EnergyConsumptionChart.tsx +84 -84
  167. package/src/newModules/energyConsumption/EnergyConsumptionDetail.tsx +322 -322
  168. package/src/newModules/energyConsumption/EnergyConsumptionPage.tsx +393 -393
  169. package/src/newModules/energyConsumption/Router.ts +34 -34
  170. package/src/newModules/energyConsumption/co2Data.ts +23655 -23655
  171. package/src/newModules/energyConsumption/component/BarChart.tsx +93 -93
  172. package/src/newModules/energyConsumption/component/EnergyModal.tsx +284 -284
  173. package/src/newModules/energyConsumption/component/Overview.tsx +118 -118
  174. package/src/newModules/fixedTime/FixedTimeActions.ts +241 -241
  175. package/src/newModules/fixedTime/FixedTimeDetailPage.tsx +345 -345
  176. package/src/newModules/fixedTime/FixedTimePage.tsx +302 -302
  177. package/src/newModules/fixedTime/Router.ts +25 -25
  178. package/src/newModules/lightMode/LightModePage.tsx +204 -204
  179. package/src/newModules/lightMode/Router.ts +16 -16
  180. package/src/newModules/mood/Interface.ts +5 -0
  181. package/src/newModules/mood/MixDynamicMoodEditor.tsx +8 -5
  182. package/src/newModules/mood/MoodActions.ts +32 -20
  183. package/src/newModules/mood/MoodItem.tsx +3 -3
  184. package/src/newModules/mood/MoodPage.tsx +31 -15
  185. package/src/newModules/mood/MoodParse.ts +5 -6
  186. package/src/newModules/mood/RecommendMoodItem.tsx +3 -3
  187. package/src/newModules/mood/Router.ts +9 -0
  188. package/src/newModules/overchargeSwitch/OverchargeSwitchPage.tsx +96 -96
  189. package/src/newModules/overchargeSwitch/Router.ts +16 -16
  190. package/src/newModules/powerOnBehavior/LightBehaviorPage.tsx +266 -266
  191. package/src/newModules/powerOnBehavior/PlugBehaviorPage.tsx +173 -173
  192. package/src/newModules/powerOnBehavior/PowerOnBehaviorActions.ts +106 -106
  193. package/src/newModules/powerOnBehavior/Router.ts +27 -27
  194. package/src/newModules/randomTime/RandomTimeActions.ts +238 -238
  195. package/src/newModules/randomTime/RandomTimeDetailPage.tsx +325 -325
  196. package/src/newModules/randomTime/RandomTimePage.tsx +299 -299
  197. package/src/newModules/randomTime/Router.ts +25 -25
  198. package/src/newModules/randomTime/Summary.tsx +116 -116
  199. package/src/newModules/remoteControl/RemoteControlActions.ts +5 -5
  200. package/src/newModules/remoteControl/RemoteControlPage.tsx +51 -51
  201. package/src/newModules/remoteControl/Router.ts +15 -15
  202. package/src/newModules/select/Route.ts +16 -16
  203. package/src/newModules/select/SelectPage.d.ts +12 -12
  204. package/src/newModules/select/SelectPage.tsx +137 -137
  205. package/src/newModules/sleepWakeUp/Interface.ts +69 -69
  206. package/src/newModules/sleepWakeUp/Router.ts +24 -24
  207. package/src/newModules/sleepWakeUp/SleepWakeUpActions.ts +317 -317
  208. package/src/newModules/sleepWakeUp/SleepWakeUpDetailPage.tsx +661 -661
  209. package/src/newModules/sleepWakeUp/SleepWakeUpPage.tsx +455 -455
  210. package/src/newModules/sleepWakeUp/utils.ts +253 -253
  211. package/src/newModules/swithInching/Router.ts +16 -16
  212. package/src/newModules/swithInching/SwithInching.tsx +231 -231
  213. package/src/newModules/swithInching/SwithInchingAction.ts +55 -55
  214. package/src/newModules/swithInching/pickerView.tsx +91 -91
  215. package/src/newModules/timeSchedule/Interface.ts +142 -142
  216. package/src/newModules/timeSchedule/Router.ts +25 -25
  217. package/src/newModules/timeSchedule/TimeScheduleActions.ts +53 -53
  218. package/src/newModules/timeSchedule/TimeScheduleDetailPage.tsx +648 -648
  219. package/src/newModules/timeSchedule/TimeSchedulePage.tsx +253 -253
  220. package/src/newModules/timeSchedule/components/ManuaSettings.tsx +460 -460
  221. package/src/newModules/timeSchedule/components/ScheduleCard.tsx +125 -125
  222. package/tsconfig.json +50 -50
@@ -1,661 +1,661 @@
1
- import React, { useCallback, useEffect, useMemo } from 'react';
2
- import { ScrollView, StyleSheet, Text, View } from 'react-native';
3
- import { useNavigation } from '@react-navigation/native';
4
- import Page from '@ledvance/base/src/components/Page';
5
- import I18n from '@ledvance/base/src/i18n';
6
- import res from '@ledvance/base/src/res';
7
- import { TimerPicker, Utils } from 'tuya-panel-kit';
8
- import { useReactive, useUpdateEffect } from 'ahooks';
9
- import TextField from '@ledvance/base/src/components/TextField';
10
- import LdvPickerView from '@ledvance/base/src/components/ldvPickerView';
11
- import LdvWeekView from '@ledvance/base/src/components/weekSelect';
12
- import {
13
- convertMinutesTo12HourFormat,
14
- loopText,
15
- showDialog,
16
- } from '@ledvance/base/src/utils/common';
17
- import Spacer from '@ledvance/base/src/components/Spacer';
18
- import DeleteButton from '@ledvance/base/src/components/DeleteButton';
19
- import { SleepWakeUpPageRouteParams } from './SleepWakeUpPage';
20
- import LdvSwitch from '@ledvance/base/src/components/ldvSwitch';
21
- import { cloneDeep, isEqual } from 'lodash';
22
- import { SleepUIItem, WakeUpUIItem } from './Interface';
23
- import { useSystemTimeFormate } from '@ledvance/base/src/models/modules/NativePropsSlice';
24
- import { Result } from '@ledvance/base/src/models/modules/Result';
25
- import LampAdjustView from '@ledvance/base/src/components/LampAdjustView';
26
- import Card from '@ledvance/base/src/components/Card';
27
- import { hsv2Hex, mapFloatToRange } from '@ledvance/base/src/utils';
28
- import { cctToColor } from '@ledvance/base/src/utils/cctUtils';
29
- import { useParams } from '@ledvance/base/src/hooks/Hooks';
30
- import ColorTempAdjustView from '@ledvance/base/src/components/ColorTempAdjustView';
31
- import ColorAdjustView from '@ledvance/base/src/components/ColorAdjustView';
32
- import Summary from '@ledvance/base/src/components/Summary';
33
-
34
- const { convertX: cx } = Utils.RatioUtils;
35
- const { toFixedString } = Utils.NumberUtils;
36
-
37
- interface SleepWakeUpDetailPageProps extends SleepWakeUpPageRouteParams {
38
- mode: 'add' | 'edit';
39
- isSleep: boolean;
40
- scheduleItem: any;
41
- modDeleteTimeSchedule: (
42
- mode: 'add' | 'edit' | 'del',
43
- isSleep: boolean,
44
- sleepWakeUp: SleepUIItem | WakeUpUIItem
45
- ) => Promise<Result<any>>;
46
- }
47
-
48
- const SleepWakeUpDetailPage = () => {
49
- const navigation = useNavigation();
50
- const props = useParams<SleepWakeUpDetailPageProps>();
51
- const is24HourClock = useSystemTimeFormate();
52
- const state = useReactive({
53
- sleepWakeUp: cloneDeep(props.scheduleItem) as WakeUpUIItem,
54
- loading: false,
55
- });
56
-
57
- useEffect(() => {
58
- if (props.mode !== 'edit') return;
59
- if (state.sleepWakeUp.isColorMode) {
60
- state.sleepWakeUp.brightness = 100;
61
- } else {
62
- state.sleepWakeUp.s = 100;
63
- state.sleepWakeUp.v = 100;
64
- }
65
- }, []);
66
-
67
- useUpdateEffect(() => {
68
- if (state.sleepWakeUp.delay === 0) {
69
- state.sleepWakeUp.delay = 1;
70
- }
71
- if (state.sleepWakeUp.delay > 24) {
72
- state.sleepWakeUp.delay = 24;
73
- }
74
- }, [state.sleepWakeUp.delay]);
75
-
76
- useUpdateEffect(() => {
77
- if (state.sleepWakeUp.last > 24) {
78
- state.sleepWakeUp.last = 24;
79
- }
80
- }, [state.sleepWakeUp.last]);
81
-
82
- useUpdateEffect(() => {
83
- const { startTime, endTime, delay, isSleep } = state.sleepWakeUp;
84
- if (isSleep) {
85
- state.sleepWakeUp.hour = Math.trunc(startTime / 60);
86
- state.sleepWakeUp.minute = startTime % 60;
87
- const endMin = startTime + delay * 5;
88
- state.sleepWakeUp.endTime = endMin > 1440 ? endMin - 1440 : endMin;
89
- } else {
90
- state.sleepWakeUp.hour = Math.trunc(endTime / 60);
91
- state.sleepWakeUp.minute = endTime % 60;
92
- const startMin = endTime - delay * 5;
93
- state.sleepWakeUp.startTime = startMin < 0 ? startMin + 1440 : startMin;
94
- }
95
- }, [state.sleepWakeUp.startTime, state.sleepWakeUp.delay, state.sleepWakeUp.endTime]);
96
-
97
- const getRangeTime = (time: number, isStart?: boolean) => {
98
- if (isStart) {
99
- return time < 0 ? 1440 + time : time;
100
- } else {
101
- return time > 1440 ? time - 1440 : time;
102
- }
103
- };
104
-
105
- const getBlockColor = useCallback(() => {
106
- if (state.sleepWakeUp.isColorMode) {
107
- const s = Math.round(mapFloatToRange(state.sleepWakeUp.s / 100, 30, 100));
108
- return hsv2Hex(state.sleepWakeUp.h, s, 100);
109
- }
110
- return cctToColor(state.sleepWakeUp.temperature);
111
- }, [state.sleepWakeUp]);
112
-
113
- const checkItemChanged = useMemo(() =>{
114
- const { isColorMode, h, s, v, brightness, temperature } = state.sleepWakeUp;
115
- const currentSleepWakeUp = {
116
- ...state.sleepWakeUp,
117
- h: isColorMode ? h : 0,
118
- s: isColorMode ? s : 0,
119
- v: isColorMode ? v : 0,
120
- brightness: isColorMode ? 0 : brightness,
121
- temperature: isColorMode ? 0 : temperature,
122
- };
123
- return isEqual(props.scheduleItem, props.mode === 'add' ? state.sleepWakeUp : currentSleepWakeUp);
124
- }, [props.scheduleItem, JSON.stringify(state.sleepWakeUp), props.mode])
125
-
126
- const canSubmit = useMemo(() => {
127
- return state.sleepWakeUp.name?.length > 0 && state.sleepWakeUp.name?.length < 33 && !checkItemChanged
128
- }, [state.sleepWakeUp.name, checkItemChanged]);
129
-
130
- const mixLightCard = useMemo(() => {
131
- const applyList = props.applyForList.map(item => {
132
- if (item.type === 'mainLight' && state.sleepWakeUp.isColorMode) {
133
- return {
134
- ...item,
135
- enable: false,
136
- };
137
- }
138
- if (item.type === 'secondaryLight' && !state.sleepWakeUp.isColorMode) {
139
- return {
140
- ...item,
141
- enable: false,
142
- };
143
- }
144
- return item;
145
- });
146
- return (
147
- <View>
148
- {applyList.map(item => (
149
- <View key={item.dp}>
150
- <Card style={{ marginHorizontal: cx(24) }}>
151
- <LdvSwitch
152
- title={item.key}
153
- color={'#fff'}
154
- colorAlpha={1}
155
- enable={
156
- item.type === 'mainLight'
157
- ? !state.sleepWakeUp.isColorMode
158
- : state.sleepWakeUp.isColorMode
159
- }
160
- setEnable={(enable: boolean) => {
161
- state.sleepWakeUp.isColorMode = item.type === 'mainLight' ? !enable : enable;
162
- }}
163
- />
164
- {item.type === 'mainLight' && !state.sleepWakeUp.isColorMode ? (
165
- <View>
166
- <ColorTempAdjustView
167
- isSupportBrightness={!!props.isSupportBrightness}
168
- isSupportTemperature={!!props.isSupportTemperature}
169
- colorTemp={state.sleepWakeUp.temperature}
170
- brightness={state.sleepWakeUp.brightness}
171
- onBrightnessChangeComplete={bright => {
172
- state.sleepWakeUp.brightness = bright;
173
- }}
174
- onCCTChangeComplete={cct => {
175
- state.sleepWakeUp.temperature = cct;
176
- }}
177
- />
178
- <Spacer height={cx(16)} />
179
- </View>
180
- ) : item.type === 'secondaryLight' && state.sleepWakeUp.isColorMode ? (
181
- <View>
182
- <ColorAdjustView
183
- h={state.sleepWakeUp.h}
184
- s={state.sleepWakeUp.s}
185
- v={state.sleepWakeUp.v}
186
- reserveSV={true}
187
- minSaturation={1}
188
- onHSVChangeComplete={(h, s, v) => {
189
- state.sleepWakeUp.h = h;
190
- state.sleepWakeUp.s = s;
191
- state.sleepWakeUp.v = v;
192
- }}
193
- />
194
- <Spacer />
195
- </View>
196
- ) : null}
197
- </Card>
198
- <Spacer />
199
- </View>
200
- ))}
201
- </View>
202
- );
203
- }, [props.applyForList, JSON.stringify(state.sleepWakeUp)]);
204
-
205
- return (
206
- <Page
207
- backText={I18n.getLang('add_sleepschedule_one_source_system_back_text')}
208
- showBackDialog={!checkItemChanged}
209
- loading={state.loading}
210
- backDialogTitle={I18n.getLang('cancel_dialog_leave_unsaved_titel')}
211
- backDialogContent={I18n.getLang(
212
- props.isSleep
213
- ? 'cancel_dialog_leave_unsaved_sleepschedule_note'
214
- : 'cancel_dialog_leave_unsaved_wakeupschedule_note'
215
- )}
216
- rightButtonIcon={canSubmit ? res.ic_check : res.ic_uncheck}
217
- rightButtonIconClick={async () => {
218
- if (!canSubmit || state.loading) return;
219
- state.loading = true;
220
- if (state.sleepWakeUp.isColorMode) {
221
- state.sleepWakeUp.brightness = 0;
222
- state.sleepWakeUp.temperature = 0;
223
- } else {
224
- state.sleepWakeUp.h = 0;
225
- state.sleepWakeUp.s = 0;
226
- state.sleepWakeUp.v = 0;
227
- }
228
- state.sleepWakeUp.enable = true
229
- const res = await props.modDeleteTimeSchedule(
230
- props.mode,
231
- state.sleepWakeUp.isSleep,
232
- state.sleepWakeUp
233
- );
234
- state.loading = false;
235
- if (res.success) {
236
- navigation.goBack();
237
- }
238
- }}
239
- headlineText={I18n.getLang(
240
- props.isSleep
241
- ? props.mode === 'add'
242
- ? 'add_sleepschedule_one_source_headline_text'
243
- : 'edit_sleepschedule_headline_text'
244
- : props.mode === 'add'
245
- ? 'add_wakeupschedule_one_source_headline_text'
246
- : 'edit_wakeupschedule_headline_text'
247
- )}
248
- >
249
- <ScrollView
250
- nestedScrollEnabled={true}
251
- showsHorizontalScrollIndicator={false}
252
- showsVerticalScrollIndicator={false}
253
- >
254
- <TextField
255
- style={styles.cardContainer}
256
- value={state.sleepWakeUp.name}
257
- showError={state.sleepWakeUp.name?.length > 32}
258
- maxLength={33}
259
- errorText={I18n.getLang('add_new_dynamic_mood_alert_text')}
260
- placeholder={I18n.getLang('add_new_trigger_time_inputfield_value_text')}
261
- onChangeText={(t: string) => {
262
- state.sleepWakeUp.name = t;
263
- }}
264
- />
265
- {/* pick */}
266
- <TimerPicker
267
- itemTextColor="#aeadb5"
268
- style={{ paddingVertical: cx(0), marginVertical: cx(0) }}
269
- is12Hours={!is24HourClock}
270
- singlePicker={true}
271
- amText={I18n.getLang('manage_user_calendar_label_am')}
272
- pmText={I18n.getLang('manage_user_calendar_label_pm')}
273
- startTime={props.isSleep ? state.sleepWakeUp.startTime : state.sleepWakeUp.endTime}
274
- symbol={''}
275
- onTimerChange={time => {
276
- if (props.isSleep) {
277
- state.sleepWakeUp.startTime = time;
278
- } else {
279
- state.sleepWakeUp.endTime = time;
280
- }
281
- }}
282
- />
283
-
284
- {/* week */}
285
- <View style={styles.week}>
286
- <LdvWeekView
287
- value={state.sleepWakeUp.weeks}
288
- onSelect={(weekIdx: number) => {
289
- state.sleepWakeUp.weeks = state.sleepWakeUp.weeks.map((week, idx) => {
290
- if (idx === weekIdx - 1) {
291
- return week === 1 ? 0 : 1;
292
- }
293
- return week;
294
- });
295
- }}
296
- />
297
- <Spacer />
298
- <Text style={{ marginHorizontal: cx(24) }}>{loopText(state.sleepWakeUp.weeks)}</Text>
299
- <Spacer />
300
- </View>
301
-
302
- {/* Apply for */}
303
- <View style={styles.cardContainer}>
304
- <Text style={styles.itemTitle}>
305
- {I18n.getLang('timeschedule_add_schedule_subheadline_text')}
306
- </Text>
307
- <View
308
- style={{
309
- backgroundColor: '#f6f6f6',
310
- borderRadius: 4,
311
- minHeight: cx(50),
312
- flex: 1,
313
- justifyContent: 'center',
314
- }}
315
- >
316
- <View
317
- style={{
318
- marginHorizontal: cx(8),
319
- marginTop: cx(8),
320
- borderRadius: 4,
321
- }}
322
- >
323
- {props.applyForList.map(apply => (
324
- <View
325
- style={{
326
- flexDirection: 'row',
327
- justifyContent: 'space-between',
328
- alignItems: 'center',
329
- backgroundColor: '#fff',
330
- marginBottom: cx(8),
331
- }}
332
- key={apply.dp}
333
- >
334
- <Text
335
- style={{
336
- color: '#000',
337
- fontSize: cx(14),
338
- marginHorizontal: cx(6),
339
- marginVertical: cx(9),
340
- }}
341
- >
342
- {apply.key}
343
- </Text>
344
- </View>
345
- ))}
346
- </View>
347
- </View>
348
- <Spacer />
349
- </View>
350
-
351
- {/* Device state */}
352
- <View>
353
- <Text style={[styles.itemTitle, styles.cardContainer]}>
354
- {I18n.getLang('timeschedule_add_schedule_subheadline2_text')}
355
- </Text>
356
- {props.isMixLight ? (
357
- mixLightCard
358
- ) : (
359
- <Card style={styles.cardContainer}>
360
- <LdvSwitch
361
- title={I18n.getLang('light_sources_tile_tw_lighting_headline')}
362
- color={getBlockColor()}
363
- colorAlpha={1}
364
- enable={false}
365
- showSwitch={false}
366
- setEnable={() => { }}
367
- />
368
- <LampAdjustView
369
- isSupportColor={!!props.isSupportColor}
370
- isSupportTemperature={!!props.isSupportTemperature}
371
- isSupportBrightness={!!props.isSupportBrightness}
372
- isColorMode={state.sleepWakeUp.isColorMode}
373
- reserveSV={true}
374
- setIsColorMode={() => {
375
- state.sleepWakeUp.isColorMode = !state.sleepWakeUp.isColorMode;
376
- }}
377
- h={state.sleepWakeUp.h}
378
- s={state.sleepWakeUp.s}
379
- v={state.sleepWakeUp.v}
380
- onHSVChange={(h, s, v) => {
381
- state.sleepWakeUp.h = h;
382
- state.sleepWakeUp.s = s;
383
- state.sleepWakeUp.v = v;
384
- }}
385
- onHSVChangeComplete={(h, s, v) => {
386
- state.sleepWakeUp.h = h;
387
- state.sleepWakeUp.s = s;
388
- state.sleepWakeUp.v = v;
389
- }}
390
- colorTemp={state.sleepWakeUp.temperature}
391
- brightness={state.sleepWakeUp.brightness}
392
- onCCTChange={cct => {
393
- state.sleepWakeUp.temperature = cct;
394
- }}
395
- onCCTChangeComplete={cct => {
396
- state.sleepWakeUp.temperature = cct;
397
- }}
398
- onBrightnessChange={brightness => {
399
- state.sleepWakeUp.brightness = brightness;
400
- }}
401
- onBrightnessChangeComplete={brightness => {
402
- state.sleepWakeUp.brightness = brightness;
403
- }}
404
- />
405
- </Card>
406
- )}
407
- </View>
408
- <Spacer />
409
- {/* Settings */}
410
- <View style={styles.cardContainer}>
411
- <Text style={styles.itemTitle}>
412
- {I18n.getLang('timeschedule_add_schedule_subheadline4_text')}
413
- </Text>
414
- <Spacer />
415
- <Text>
416
- {I18n.getLang(
417
- props.isSleep
418
- ? 'add_sleepschedule_one_source_settings_text'
419
- : 'add_wakeupschedule_settings_text'
420
- )}
421
- </Text>
422
- <LdvPickerView
423
- style={styles.picker}
424
- hour={toFixedString(Math.trunc((state.sleepWakeUp.delay * 5) / 60), 2)}
425
- minute={toFixedString((state.sleepWakeUp.delay * 5) % 60, 2)}
426
- minutesStep={5}
427
- setHour={v => {
428
- const m = (state.sleepWakeUp.delay * 5) % 60;
429
- state.sleepWakeUp.delay = (Number(v) * 60 + m) / 5;
430
- }}
431
- setMinute={v => {
432
- const h = Math.trunc((state.sleepWakeUp.delay * 5) / 60);
433
- state.sleepWakeUp.delay = (h * 60 + Number(v)) / 5;
434
- }}
435
- unit={['h', 'min']}
436
- maxHour={3}
437
- />
438
- <Text>
439
- {I18n.formatValue(
440
- props.isSleep
441
- ? 'add_sleepschedule_one_source_settings_text2'
442
- : 'add_wakeupschedule_settings_text2',
443
- `${convertMinutesTo12HourFormat(state.sleepWakeUp.startTime, is24HourClock)}`
444
- )}
445
- </Text>
446
- <Spacer />
447
- {!props.isSleep && (
448
- <View style={{ marginHorizontal: -cx(16), marginTop: -cx(20) }}>
449
- <LdvSwitch
450
- title={I18n.getLang('add_wakeupschedule_settings_text3')}
451
- enable={state.sleepWakeUp.last > 0}
452
- color="#fff"
453
- colorAlpha={1}
454
- setEnable={v => {
455
- state.sleepWakeUp.last = v ? 1 : 0;
456
- }}
457
- />
458
- </View>
459
- )}
460
- {state.sleepWakeUp.last > 0 && (
461
- <>
462
- <Text style={{ fontSize: cx(14) }}>
463
- {I18n.getLang('add_wakeupschedule_settings_text4')}
464
- </Text>
465
- <LdvPickerView
466
- style={styles.picker}
467
- hour={toFixedString(Math.trunc((state.sleepWakeUp.last * 5) / 60), 2)}
468
- minute={toFixedString((state.sleepWakeUp.last * 5) % 60, 2)}
469
- minutesStep={5}
470
- setHour={v => {
471
- const m = (state.sleepWakeUp.last * 5) % 60;
472
- if (Number(v) === 0 && m === 0) {
473
- state.sleepWakeUp.last = 1;
474
- } else {
475
- state.sleepWakeUp.last = (Number(v) * 60 + m) / 5;
476
- }
477
- }}
478
- setMinute={v => {
479
- const h = Math.trunc((state.sleepWakeUp.last * 5) / 60);
480
- if (Number(v) === 0 && h === 0) {
481
- state.sleepWakeUp.last = 1;
482
- } else {
483
- state.sleepWakeUp.last = (h * 60 + Number(v)) / 5;
484
- }
485
- }}
486
- unit={['h', 'min']}
487
- maxHour={3}
488
- />
489
- <Text>
490
- {I18n.formatValue(
491
- 'add_wakeupschedule_settings_text5',
492
- `${convertMinutesTo12HourFormat(
493
- getRangeTime(state.sleepWakeUp.endTime + state.sleepWakeUp.last * 5),
494
- is24HourClock
495
- )}`
496
- )}
497
- </Text>
498
- <Spacer />
499
- </>
500
- )}
501
- </View>
502
- {/* Summary */}
503
- <Summary
504
- frequency={loopText(state.sleepWakeUp.weeks)}
505
- time={`${convertMinutesTo12HourFormat(
506
- state.sleepWakeUp.startTime,
507
- is24HourClock
508
- )} - ${convertMinutesTo12HourFormat(state.sleepWakeUp.endTime, is24HourClock)}`}
509
- actions={(
510
- <View>
511
- <Text style={{ fontSize: cx(12), color: '#000000' }}>
512
- {I18n.getLang(
513
- !props.isSleep ? 'feature_summary_action_txt_11' : 'feature_summary_action_txt_10'
514
- )}
515
- </Text>
516
- <View style={styles.filletCorner}>
517
- <Text style={styles.rightTitle}>
518
- {props.isMixLight ? (state.sleepWakeUp.isColorMode ? props.applyForList[1].key : props.applyForList[0].key) : props.applyForList[0].key}
519
- </Text>
520
- </View>
521
- <Spacer height={cx(10)} />
522
- <Text style={{ fontSize: cx(12), color: '#000000' }}>
523
- {I18n.getLang(
524
- props.isSleep
525
- ? 'feature_summary_action_txt_2'
526
- : state.sleepWakeUp.last
527
- ? 'feature_summary_action_txt_12'
528
- : 'feature_summary_action_txt_1'
529
- )}
530
- </Text>
531
- <View style={styles.filletCorner}>
532
- <Text style={styles.rightTitle}>
533
- {convertMinutesTo12HourFormat(
534
- props.isSleep
535
- ? state.sleepWakeUp.endTime
536
- : getRangeTime(state.sleepWakeUp.endTime + state.sleepWakeUp.last * 5),
537
- is24HourClock
538
- )}
539
- </Text>
540
- </View>
541
- </View>
542
- )}
543
- />
544
- <Spacer />
545
- {/* Delete btn */}
546
- {props.mode === 'edit' && (
547
- <View style={styles.cardContainer}>
548
- <DeleteButton
549
- text={I18n.getLang('edit_timeschedule_bttn_text')}
550
- onPress={async () => {
551
- showDialog({
552
- method: 'confirm',
553
- title: I18n.getLang(
554
- props.isSleep
555
- ? 'cancel_dialog_delete_item_sleepschedule_titel'
556
- : 'cancel_dialog_delete_item_wakeupschedule_titel'
557
- ),
558
- subTitle: I18n.getLang(
559
- props.isSleep
560
- ? 'cancel_dialog_delete_item_sleepschedule_description'
561
- : 'cancel_dialog_delete_item_wakeupschedule_description'
562
- ),
563
- onConfirm: async (_, { close }) => {
564
- close();
565
- if (state.loading) return;
566
- state.loading = true;
567
- const res = await props.modDeleteTimeSchedule(
568
- 'del',
569
- state.sleepWakeUp.isSleep,
570
- state.sleepWakeUp
571
- );
572
- state.loading = false;
573
- if (res.success) {
574
- navigation.goBack();
575
- }
576
- },
577
- });
578
- }}
579
- />
580
- </View>
581
- )}
582
- <Spacer />
583
- </ScrollView>
584
- </Page>
585
- );
586
- };
587
-
588
- const styles = StyleSheet.create({
589
- cardContainer: {
590
- marginHorizontal: cx(24),
591
- },
592
- textField: {
593
- marginHorizontal: cx(24),
594
- },
595
- picker: {
596
- marginHorizontal: cx(24),
597
- marginVertical: cx(15),
598
- color: 'rgb(35,35,38)',
599
- },
600
- week: {},
601
- itemTitle: {
602
- color: '#000',
603
- fontSize: cx(16),
604
- fontWeight: 'bold',
605
- fontFamily: 'helvetica_neue_lt_std_bd',
606
- marginBottom: cx(10),
607
- },
608
- skillListItem: {
609
- flexDirection: 'row',
610
- justifyContent: 'space-between',
611
- height: cx(30),
612
- alignItems: 'center',
613
- marginVertical: cx(5),
614
- },
615
- summaryContainer: {
616
- flexDirection: 'row',
617
- justifyContent: 'flex-start',
618
- marginBottom: cx(10),
619
- marginHorizontal: cx(24),
620
- },
621
- summaryImg: {
622
- height: cx(12),
623
- width: cx(12),
624
- tintColor: '#000',
625
- },
626
- summaryLeft: {
627
- flexDirection: 'row',
628
- alignItems: 'center',
629
- minWidth: cx(90),
630
- },
631
- leftTitle: {
632
- fontSize: cx(14),
633
- color: '#000',
634
- },
635
- summaryRight: {
636
- flexDirection: 'column',
637
- marginLeft: cx(21),
638
- borderRadius: cx(16),
639
- backgroundColor: '#cbcbcb',
640
- },
641
- rightItem: {
642
- paddingHorizontal: cx(12),
643
- color: '#000',
644
- },
645
- rightTitle: {
646
- paddingLeft: cx(12),
647
- paddingRight: cx(12),
648
- fontSize: cx(10),
649
- textAlign: 'center',
650
- alignSelf: 'flex-start',
651
- color: '#000'
652
- },
653
- filletCorner: {
654
- flexDirection: 'row',
655
- backgroundColor: '#cbcbcb',
656
- borderRadius: cx(16),
657
- alignSelf: 'flex-start',
658
- },
659
- });
660
-
661
- export default SleepWakeUpDetailPage;
1
+ import React, { useCallback, useEffect, useMemo } from 'react';
2
+ import { ScrollView, StyleSheet, Text, View } from 'react-native';
3
+ import { useNavigation } from '@react-navigation/native';
4
+ import Page from '@ledvance/base/src/components/Page';
5
+ import I18n from '@ledvance/base/src/i18n';
6
+ import res from '@ledvance/base/src/res';
7
+ import { TimerPicker, Utils } from 'tuya-panel-kit';
8
+ import { useReactive, useUpdateEffect } from 'ahooks';
9
+ import TextField from '@ledvance/base/src/components/TextField';
10
+ import LdvPickerView from '@ledvance/base/src/components/ldvPickerView';
11
+ import LdvWeekView from '@ledvance/base/src/components/weekSelect';
12
+ import {
13
+ convertMinutesTo12HourFormat,
14
+ loopText,
15
+ showDialog,
16
+ } from '@ledvance/base/src/utils/common';
17
+ import Spacer from '@ledvance/base/src/components/Spacer';
18
+ import DeleteButton from '@ledvance/base/src/components/DeleteButton';
19
+ import { SleepWakeUpPageRouteParams } from './SleepWakeUpPage';
20
+ import LdvSwitch from '@ledvance/base/src/components/ldvSwitch';
21
+ import { cloneDeep, isEqual } from 'lodash';
22
+ import { SleepUIItem, WakeUpUIItem } from './Interface';
23
+ import { useSystemTimeFormate } from '@ledvance/base/src/models/modules/NativePropsSlice';
24
+ import { Result } from '@ledvance/base/src/models/modules/Result';
25
+ import LampAdjustView from '@ledvance/base/src/components/LampAdjustView';
26
+ import Card from '@ledvance/base/src/components/Card';
27
+ import { hsv2Hex, mapFloatToRange } from '@ledvance/base/src/utils';
28
+ import { cctToColor } from '@ledvance/base/src/utils/cctUtils';
29
+ import { useParams } from '@ledvance/base/src/hooks/Hooks';
30
+ import ColorTempAdjustView from '@ledvance/base/src/components/ColorTempAdjustView';
31
+ import ColorAdjustView from '@ledvance/base/src/components/ColorAdjustView';
32
+ import Summary from '@ledvance/base/src/components/Summary';
33
+
34
+ const { convertX: cx } = Utils.RatioUtils;
35
+ const { toFixedString } = Utils.NumberUtils;
36
+
37
+ interface SleepWakeUpDetailPageProps extends SleepWakeUpPageRouteParams {
38
+ mode: 'add' | 'edit';
39
+ isSleep: boolean;
40
+ scheduleItem: any;
41
+ modDeleteTimeSchedule: (
42
+ mode: 'add' | 'edit' | 'del',
43
+ isSleep: boolean,
44
+ sleepWakeUp: SleepUIItem | WakeUpUIItem
45
+ ) => Promise<Result<any>>;
46
+ }
47
+
48
+ const SleepWakeUpDetailPage = () => {
49
+ const navigation = useNavigation();
50
+ const props = useParams<SleepWakeUpDetailPageProps>();
51
+ const is24HourClock = useSystemTimeFormate();
52
+ const state = useReactive({
53
+ sleepWakeUp: cloneDeep(props.scheduleItem) as WakeUpUIItem,
54
+ loading: false,
55
+ });
56
+
57
+ useEffect(() => {
58
+ if (props.mode !== 'edit') return;
59
+ if (state.sleepWakeUp.isColorMode) {
60
+ state.sleepWakeUp.brightness = 100;
61
+ } else {
62
+ state.sleepWakeUp.s = 100;
63
+ state.sleepWakeUp.v = 100;
64
+ }
65
+ }, []);
66
+
67
+ useUpdateEffect(() => {
68
+ if (state.sleepWakeUp.delay === 0) {
69
+ state.sleepWakeUp.delay = 1;
70
+ }
71
+ if (state.sleepWakeUp.delay > 24) {
72
+ state.sleepWakeUp.delay = 24;
73
+ }
74
+ }, [state.sleepWakeUp.delay]);
75
+
76
+ useUpdateEffect(() => {
77
+ if (state.sleepWakeUp.last > 24) {
78
+ state.sleepWakeUp.last = 24;
79
+ }
80
+ }, [state.sleepWakeUp.last]);
81
+
82
+ useUpdateEffect(() => {
83
+ const { startTime, endTime, delay, isSleep } = state.sleepWakeUp;
84
+ if (isSleep) {
85
+ state.sleepWakeUp.hour = Math.trunc(startTime / 60);
86
+ state.sleepWakeUp.minute = startTime % 60;
87
+ const endMin = startTime + delay * 5;
88
+ state.sleepWakeUp.endTime = endMin > 1440 ? endMin - 1440 : endMin;
89
+ } else {
90
+ state.sleepWakeUp.hour = Math.trunc(endTime / 60);
91
+ state.sleepWakeUp.minute = endTime % 60;
92
+ const startMin = endTime - delay * 5;
93
+ state.sleepWakeUp.startTime = startMin < 0 ? startMin + 1440 : startMin;
94
+ }
95
+ }, [state.sleepWakeUp.startTime, state.sleepWakeUp.delay, state.sleepWakeUp.endTime]);
96
+
97
+ const getRangeTime = (time: number, isStart?: boolean) => {
98
+ if (isStart) {
99
+ return time < 0 ? 1440 + time : time;
100
+ } else {
101
+ return time > 1440 ? time - 1440 : time;
102
+ }
103
+ };
104
+
105
+ const getBlockColor = useCallback(() => {
106
+ if (state.sleepWakeUp.isColorMode) {
107
+ const s = Math.round(mapFloatToRange(state.sleepWakeUp.s / 100, 30, 100));
108
+ return hsv2Hex(state.sleepWakeUp.h, s, 100);
109
+ }
110
+ return cctToColor(state.sleepWakeUp.temperature);
111
+ }, [state.sleepWakeUp]);
112
+
113
+ const checkItemChanged = useMemo(() =>{
114
+ const { isColorMode, h, s, v, brightness, temperature } = state.sleepWakeUp;
115
+ const currentSleepWakeUp = {
116
+ ...state.sleepWakeUp,
117
+ h: isColorMode ? h : 0,
118
+ s: isColorMode ? s : 0,
119
+ v: isColorMode ? v : 0,
120
+ brightness: isColorMode ? 0 : brightness,
121
+ temperature: isColorMode ? 0 : temperature,
122
+ };
123
+ return isEqual(props.scheduleItem, props.mode === 'add' ? state.sleepWakeUp : currentSleepWakeUp);
124
+ }, [props.scheduleItem, JSON.stringify(state.sleepWakeUp), props.mode])
125
+
126
+ const canSubmit = useMemo(() => {
127
+ return state.sleepWakeUp.name?.length > 0 && state.sleepWakeUp.name?.length < 33 && !checkItemChanged
128
+ }, [state.sleepWakeUp.name, checkItemChanged]);
129
+
130
+ const mixLightCard = useMemo(() => {
131
+ const applyList = props.applyForList.map(item => {
132
+ if (item.type === 'mainLight' && state.sleepWakeUp.isColorMode) {
133
+ return {
134
+ ...item,
135
+ enable: false,
136
+ };
137
+ }
138
+ if (item.type === 'secondaryLight' && !state.sleepWakeUp.isColorMode) {
139
+ return {
140
+ ...item,
141
+ enable: false,
142
+ };
143
+ }
144
+ return item;
145
+ });
146
+ return (
147
+ <View>
148
+ {applyList.map(item => (
149
+ <View key={item.dp}>
150
+ <Card style={{ marginHorizontal: cx(24) }}>
151
+ <LdvSwitch
152
+ title={item.key}
153
+ color={'#fff'}
154
+ colorAlpha={1}
155
+ enable={
156
+ item.type === 'mainLight'
157
+ ? !state.sleepWakeUp.isColorMode
158
+ : state.sleepWakeUp.isColorMode
159
+ }
160
+ setEnable={(enable: boolean) => {
161
+ state.sleepWakeUp.isColorMode = item.type === 'mainLight' ? !enable : enable;
162
+ }}
163
+ />
164
+ {item.type === 'mainLight' && !state.sleepWakeUp.isColorMode ? (
165
+ <View>
166
+ <ColorTempAdjustView
167
+ isSupportBrightness={!!props.isSupportBrightness}
168
+ isSupportTemperature={!!props.isSupportTemperature}
169
+ colorTemp={state.sleepWakeUp.temperature}
170
+ brightness={state.sleepWakeUp.brightness}
171
+ onBrightnessChangeComplete={bright => {
172
+ state.sleepWakeUp.brightness = bright;
173
+ }}
174
+ onCCTChangeComplete={cct => {
175
+ state.sleepWakeUp.temperature = cct;
176
+ }}
177
+ />
178
+ <Spacer height={cx(16)} />
179
+ </View>
180
+ ) : item.type === 'secondaryLight' && state.sleepWakeUp.isColorMode ? (
181
+ <View>
182
+ <ColorAdjustView
183
+ h={state.sleepWakeUp.h}
184
+ s={state.sleepWakeUp.s}
185
+ v={state.sleepWakeUp.v}
186
+ reserveSV={true}
187
+ minSaturation={1}
188
+ onHSVChangeComplete={(h, s, v) => {
189
+ state.sleepWakeUp.h = h;
190
+ state.sleepWakeUp.s = s;
191
+ state.sleepWakeUp.v = v;
192
+ }}
193
+ />
194
+ <Spacer />
195
+ </View>
196
+ ) : null}
197
+ </Card>
198
+ <Spacer />
199
+ </View>
200
+ ))}
201
+ </View>
202
+ );
203
+ }, [props.applyForList, JSON.stringify(state.sleepWakeUp)]);
204
+
205
+ return (
206
+ <Page
207
+ backText={I18n.getLang('add_sleepschedule_one_source_system_back_text')}
208
+ showBackDialog={!checkItemChanged}
209
+ loading={state.loading}
210
+ backDialogTitle={I18n.getLang('cancel_dialog_leave_unsaved_titel')}
211
+ backDialogContent={I18n.getLang(
212
+ props.isSleep
213
+ ? 'cancel_dialog_leave_unsaved_sleepschedule_note'
214
+ : 'cancel_dialog_leave_unsaved_wakeupschedule_note'
215
+ )}
216
+ rightButtonIcon={canSubmit ? res.ic_check : res.ic_uncheck}
217
+ rightButtonIconClick={async () => {
218
+ if (!canSubmit || state.loading) return;
219
+ state.loading = true;
220
+ if (state.sleepWakeUp.isColorMode) {
221
+ state.sleepWakeUp.brightness = 0;
222
+ state.sleepWakeUp.temperature = 0;
223
+ } else {
224
+ state.sleepWakeUp.h = 0;
225
+ state.sleepWakeUp.s = 0;
226
+ state.sleepWakeUp.v = 0;
227
+ }
228
+ state.sleepWakeUp.enable = true
229
+ const res = await props.modDeleteTimeSchedule(
230
+ props.mode,
231
+ state.sleepWakeUp.isSleep,
232
+ state.sleepWakeUp
233
+ );
234
+ state.loading = false;
235
+ if (res.success) {
236
+ navigation.goBack();
237
+ }
238
+ }}
239
+ headlineText={I18n.getLang(
240
+ props.isSleep
241
+ ? props.mode === 'add'
242
+ ? 'add_sleepschedule_one_source_headline_text'
243
+ : 'edit_sleepschedule_headline_text'
244
+ : props.mode === 'add'
245
+ ? 'add_wakeupschedule_one_source_headline_text'
246
+ : 'edit_wakeupschedule_headline_text'
247
+ )}
248
+ >
249
+ <ScrollView
250
+ nestedScrollEnabled={true}
251
+ showsHorizontalScrollIndicator={false}
252
+ showsVerticalScrollIndicator={false}
253
+ >
254
+ <TextField
255
+ style={styles.cardContainer}
256
+ value={state.sleepWakeUp.name}
257
+ showError={state.sleepWakeUp.name?.length > 32}
258
+ maxLength={33}
259
+ errorText={I18n.getLang('add_new_dynamic_mood_alert_text')}
260
+ placeholder={I18n.getLang('add_new_trigger_time_inputfield_value_text')}
261
+ onChangeText={(t: string) => {
262
+ state.sleepWakeUp.name = t;
263
+ }}
264
+ />
265
+ {/* pick */}
266
+ <TimerPicker
267
+ itemTextColor="#aeadb5"
268
+ style={{ paddingVertical: cx(0), marginVertical: cx(0) }}
269
+ is12Hours={!is24HourClock}
270
+ singlePicker={true}
271
+ amText={I18n.getLang('manage_user_calendar_label_am')}
272
+ pmText={I18n.getLang('manage_user_calendar_label_pm')}
273
+ startTime={props.isSleep ? state.sleepWakeUp.startTime : state.sleepWakeUp.endTime}
274
+ symbol={''}
275
+ onTimerChange={time => {
276
+ if (props.isSleep) {
277
+ state.sleepWakeUp.startTime = time;
278
+ } else {
279
+ state.sleepWakeUp.endTime = time;
280
+ }
281
+ }}
282
+ />
283
+
284
+ {/* week */}
285
+ <View style={styles.week}>
286
+ <LdvWeekView
287
+ value={state.sleepWakeUp.weeks}
288
+ onSelect={(weekIdx: number) => {
289
+ state.sleepWakeUp.weeks = state.sleepWakeUp.weeks.map((week, idx) => {
290
+ if (idx === weekIdx - 1) {
291
+ return week === 1 ? 0 : 1;
292
+ }
293
+ return week;
294
+ });
295
+ }}
296
+ />
297
+ <Spacer />
298
+ <Text style={{ marginHorizontal: cx(24) }}>{loopText(state.sleepWakeUp.weeks)}</Text>
299
+ <Spacer />
300
+ </View>
301
+
302
+ {/* Apply for */}
303
+ <View style={styles.cardContainer}>
304
+ <Text style={styles.itemTitle}>
305
+ {I18n.getLang('timeschedule_add_schedule_subheadline_text')}
306
+ </Text>
307
+ <View
308
+ style={{
309
+ backgroundColor: '#f6f6f6',
310
+ borderRadius: 4,
311
+ minHeight: cx(50),
312
+ flex: 1,
313
+ justifyContent: 'center',
314
+ }}
315
+ >
316
+ <View
317
+ style={{
318
+ marginHorizontal: cx(8),
319
+ marginTop: cx(8),
320
+ borderRadius: 4,
321
+ }}
322
+ >
323
+ {props.applyForList.map(apply => (
324
+ <View
325
+ style={{
326
+ flexDirection: 'row',
327
+ justifyContent: 'space-between',
328
+ alignItems: 'center',
329
+ backgroundColor: '#fff',
330
+ marginBottom: cx(8),
331
+ }}
332
+ key={apply.dp}
333
+ >
334
+ <Text
335
+ style={{
336
+ color: '#000',
337
+ fontSize: cx(14),
338
+ marginHorizontal: cx(6),
339
+ marginVertical: cx(9),
340
+ }}
341
+ >
342
+ {apply.key}
343
+ </Text>
344
+ </View>
345
+ ))}
346
+ </View>
347
+ </View>
348
+ <Spacer />
349
+ </View>
350
+
351
+ {/* Device state */}
352
+ <View>
353
+ <Text style={[styles.itemTitle, styles.cardContainer]}>
354
+ {I18n.getLang('timeschedule_add_schedule_subheadline2_text')}
355
+ </Text>
356
+ {props.isMixLight ? (
357
+ mixLightCard
358
+ ) : (
359
+ <Card style={styles.cardContainer}>
360
+ <LdvSwitch
361
+ title={I18n.getLang('light_sources_tile_tw_lighting_headline')}
362
+ color={getBlockColor()}
363
+ colorAlpha={1}
364
+ enable={false}
365
+ showSwitch={false}
366
+ setEnable={() => { }}
367
+ />
368
+ <LampAdjustView
369
+ isSupportColor={!!props.isSupportColor}
370
+ isSupportTemperature={!!props.isSupportTemperature}
371
+ isSupportBrightness={!!props.isSupportBrightness}
372
+ isColorMode={state.sleepWakeUp.isColorMode}
373
+ reserveSV={true}
374
+ setIsColorMode={() => {
375
+ state.sleepWakeUp.isColorMode = !state.sleepWakeUp.isColorMode;
376
+ }}
377
+ h={state.sleepWakeUp.h}
378
+ s={state.sleepWakeUp.s}
379
+ v={state.sleepWakeUp.v}
380
+ onHSVChange={(h, s, v) => {
381
+ state.sleepWakeUp.h = h;
382
+ state.sleepWakeUp.s = s;
383
+ state.sleepWakeUp.v = v;
384
+ }}
385
+ onHSVChangeComplete={(h, s, v) => {
386
+ state.sleepWakeUp.h = h;
387
+ state.sleepWakeUp.s = s;
388
+ state.sleepWakeUp.v = v;
389
+ }}
390
+ colorTemp={state.sleepWakeUp.temperature}
391
+ brightness={state.sleepWakeUp.brightness}
392
+ onCCTChange={cct => {
393
+ state.sleepWakeUp.temperature = cct;
394
+ }}
395
+ onCCTChangeComplete={cct => {
396
+ state.sleepWakeUp.temperature = cct;
397
+ }}
398
+ onBrightnessChange={brightness => {
399
+ state.sleepWakeUp.brightness = brightness;
400
+ }}
401
+ onBrightnessChangeComplete={brightness => {
402
+ state.sleepWakeUp.brightness = brightness;
403
+ }}
404
+ />
405
+ </Card>
406
+ )}
407
+ </View>
408
+ <Spacer />
409
+ {/* Settings */}
410
+ <View style={styles.cardContainer}>
411
+ <Text style={styles.itemTitle}>
412
+ {I18n.getLang('timeschedule_add_schedule_subheadline4_text')}
413
+ </Text>
414
+ <Spacer />
415
+ <Text>
416
+ {I18n.getLang(
417
+ props.isSleep
418
+ ? 'add_sleepschedule_one_source_settings_text'
419
+ : 'add_wakeupschedule_settings_text'
420
+ )}
421
+ </Text>
422
+ <LdvPickerView
423
+ style={styles.picker}
424
+ hour={toFixedString(Math.trunc((state.sleepWakeUp.delay * 5) / 60), 2)}
425
+ minute={toFixedString((state.sleepWakeUp.delay * 5) % 60, 2)}
426
+ minutesStep={5}
427
+ setHour={v => {
428
+ const m = (state.sleepWakeUp.delay * 5) % 60;
429
+ state.sleepWakeUp.delay = (Number(v) * 60 + m) / 5;
430
+ }}
431
+ setMinute={v => {
432
+ const h = Math.trunc((state.sleepWakeUp.delay * 5) / 60);
433
+ state.sleepWakeUp.delay = (h * 60 + Number(v)) / 5;
434
+ }}
435
+ unit={['h', 'min']}
436
+ maxHour={3}
437
+ />
438
+ <Text>
439
+ {I18n.formatValue(
440
+ props.isSleep
441
+ ? 'add_sleepschedule_one_source_settings_text2'
442
+ : 'add_wakeupschedule_settings_text2',
443
+ `${convertMinutesTo12HourFormat(state.sleepWakeUp.startTime, is24HourClock)}`
444
+ )}
445
+ </Text>
446
+ <Spacer />
447
+ {!props.isSleep && (
448
+ <View style={{ marginHorizontal: -cx(16), marginTop: -cx(20) }}>
449
+ <LdvSwitch
450
+ title={I18n.getLang('add_wakeupschedule_settings_text3')}
451
+ enable={state.sleepWakeUp.last > 0}
452
+ color="#fff"
453
+ colorAlpha={1}
454
+ setEnable={v => {
455
+ state.sleepWakeUp.last = v ? 1 : 0;
456
+ }}
457
+ />
458
+ </View>
459
+ )}
460
+ {state.sleepWakeUp.last > 0 && (
461
+ <>
462
+ <Text style={{ fontSize: cx(14) }}>
463
+ {I18n.getLang('add_wakeupschedule_settings_text4')}
464
+ </Text>
465
+ <LdvPickerView
466
+ style={styles.picker}
467
+ hour={toFixedString(Math.trunc((state.sleepWakeUp.last * 5) / 60), 2)}
468
+ minute={toFixedString((state.sleepWakeUp.last * 5) % 60, 2)}
469
+ minutesStep={5}
470
+ setHour={v => {
471
+ const m = (state.sleepWakeUp.last * 5) % 60;
472
+ if (Number(v) === 0 && m === 0) {
473
+ state.sleepWakeUp.last = 1;
474
+ } else {
475
+ state.sleepWakeUp.last = (Number(v) * 60 + m) / 5;
476
+ }
477
+ }}
478
+ setMinute={v => {
479
+ const h = Math.trunc((state.sleepWakeUp.last * 5) / 60);
480
+ if (Number(v) === 0 && h === 0) {
481
+ state.sleepWakeUp.last = 1;
482
+ } else {
483
+ state.sleepWakeUp.last = (h * 60 + Number(v)) / 5;
484
+ }
485
+ }}
486
+ unit={['h', 'min']}
487
+ maxHour={3}
488
+ />
489
+ <Text>
490
+ {I18n.formatValue(
491
+ 'add_wakeupschedule_settings_text5',
492
+ `${convertMinutesTo12HourFormat(
493
+ getRangeTime(state.sleepWakeUp.endTime + state.sleepWakeUp.last * 5),
494
+ is24HourClock
495
+ )}`
496
+ )}
497
+ </Text>
498
+ <Spacer />
499
+ </>
500
+ )}
501
+ </View>
502
+ {/* Summary */}
503
+ <Summary
504
+ frequency={loopText(state.sleepWakeUp.weeks)}
505
+ time={`${convertMinutesTo12HourFormat(
506
+ state.sleepWakeUp.startTime,
507
+ is24HourClock
508
+ )} - ${convertMinutesTo12HourFormat(state.sleepWakeUp.endTime, is24HourClock)}`}
509
+ actions={(
510
+ <View>
511
+ <Text style={{ fontSize: cx(12), color: '#000000' }}>
512
+ {I18n.getLang(
513
+ !props.isSleep ? 'feature_summary_action_txt_11' : 'feature_summary_action_txt_10'
514
+ )}
515
+ </Text>
516
+ <View style={styles.filletCorner}>
517
+ <Text style={styles.rightTitle}>
518
+ {props.isMixLight ? (state.sleepWakeUp.isColorMode ? props.applyForList[1].key : props.applyForList[0].key) : props.applyForList[0].key}
519
+ </Text>
520
+ </View>
521
+ <Spacer height={cx(10)} />
522
+ <Text style={{ fontSize: cx(12), color: '#000000' }}>
523
+ {I18n.getLang(
524
+ props.isSleep
525
+ ? 'feature_summary_action_txt_2'
526
+ : state.sleepWakeUp.last
527
+ ? 'feature_summary_action_txt_12'
528
+ : 'feature_summary_action_txt_1'
529
+ )}
530
+ </Text>
531
+ <View style={styles.filletCorner}>
532
+ <Text style={styles.rightTitle}>
533
+ {convertMinutesTo12HourFormat(
534
+ props.isSleep
535
+ ? state.sleepWakeUp.endTime
536
+ : getRangeTime(state.sleepWakeUp.endTime + state.sleepWakeUp.last * 5),
537
+ is24HourClock
538
+ )}
539
+ </Text>
540
+ </View>
541
+ </View>
542
+ )}
543
+ />
544
+ <Spacer />
545
+ {/* Delete btn */}
546
+ {props.mode === 'edit' && (
547
+ <View style={styles.cardContainer}>
548
+ <DeleteButton
549
+ text={I18n.getLang('edit_timeschedule_bttn_text')}
550
+ onPress={async () => {
551
+ showDialog({
552
+ method: 'confirm',
553
+ title: I18n.getLang(
554
+ props.isSleep
555
+ ? 'cancel_dialog_delete_item_sleepschedule_titel'
556
+ : 'cancel_dialog_delete_item_wakeupschedule_titel'
557
+ ),
558
+ subTitle: I18n.getLang(
559
+ props.isSleep
560
+ ? 'cancel_dialog_delete_item_sleepschedule_description'
561
+ : 'cancel_dialog_delete_item_wakeupschedule_description'
562
+ ),
563
+ onConfirm: async (_, { close }) => {
564
+ close();
565
+ if (state.loading) return;
566
+ state.loading = true;
567
+ const res = await props.modDeleteTimeSchedule(
568
+ 'del',
569
+ state.sleepWakeUp.isSleep,
570
+ state.sleepWakeUp
571
+ );
572
+ state.loading = false;
573
+ if (res.success) {
574
+ navigation.goBack();
575
+ }
576
+ },
577
+ });
578
+ }}
579
+ />
580
+ </View>
581
+ )}
582
+ <Spacer />
583
+ </ScrollView>
584
+ </Page>
585
+ );
586
+ };
587
+
588
+ const styles = StyleSheet.create({
589
+ cardContainer: {
590
+ marginHorizontal: cx(24),
591
+ },
592
+ textField: {
593
+ marginHorizontal: cx(24),
594
+ },
595
+ picker: {
596
+ marginHorizontal: cx(24),
597
+ marginVertical: cx(15),
598
+ color: 'rgb(35,35,38)',
599
+ },
600
+ week: {},
601
+ itemTitle: {
602
+ color: '#000',
603
+ fontSize: cx(16),
604
+ fontWeight: 'bold',
605
+ fontFamily: 'helvetica_neue_lt_std_bd',
606
+ marginBottom: cx(10),
607
+ },
608
+ skillListItem: {
609
+ flexDirection: 'row',
610
+ justifyContent: 'space-between',
611
+ height: cx(30),
612
+ alignItems: 'center',
613
+ marginVertical: cx(5),
614
+ },
615
+ summaryContainer: {
616
+ flexDirection: 'row',
617
+ justifyContent: 'flex-start',
618
+ marginBottom: cx(10),
619
+ marginHorizontal: cx(24),
620
+ },
621
+ summaryImg: {
622
+ height: cx(12),
623
+ width: cx(12),
624
+ tintColor: '#000',
625
+ },
626
+ summaryLeft: {
627
+ flexDirection: 'row',
628
+ alignItems: 'center',
629
+ minWidth: cx(90),
630
+ },
631
+ leftTitle: {
632
+ fontSize: cx(14),
633
+ color: '#000',
634
+ },
635
+ summaryRight: {
636
+ flexDirection: 'column',
637
+ marginLeft: cx(21),
638
+ borderRadius: cx(16),
639
+ backgroundColor: '#cbcbcb',
640
+ },
641
+ rightItem: {
642
+ paddingHorizontal: cx(12),
643
+ color: '#000',
644
+ },
645
+ rightTitle: {
646
+ paddingLeft: cx(12),
647
+ paddingRight: cx(12),
648
+ fontSize: cx(10),
649
+ textAlign: 'center',
650
+ alignSelf: 'flex-start',
651
+ color: '#000'
652
+ },
653
+ filletCorner: {
654
+ flexDirection: 'row',
655
+ backgroundColor: '#cbcbcb',
656
+ borderRadius: cx(16),
657
+ alignSelf: 'flex-start',
658
+ },
659
+ });
660
+
661
+ export default SleepWakeUpDetailPage;