@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,442 +1,442 @@
1
- import React, { useCallback, useMemo } from 'react'
2
- import I18n from '@ledvance/base/src/i18n'
3
- import { useNavigation, useRoute } from '@react-navigation/native'
4
- import Page from '@ledvance/base/src/components/Page'
5
- import res from '@ledvance/base/src/res'
6
- import { ScrollView, View, FlatList, StyleSheet, Image, TouchableOpacity, Text } from 'react-native'
7
- import Spacer from '@ledvance/base/src/components/Spacer'
8
- import { useReactive, useUpdateEffect } from 'ahooks'
9
- import { Utils } from 'tuya-panel-kit'
10
- import TextField from '@ledvance/base/src/components/TextField'
11
- import Card from '@ledvance/base/src/components/Card'
12
- import LdvSlider from '@ledvance/base/src/components/ldvSlider'
13
- import TextButton from '@ledvance/base/src/components/TextButton'
14
- import { hsv2Hex } from '@ledvance/base/src/utils'
15
- import { cloneDeep, find, isEqual } from 'lodash'
16
- import { FlagUiInfo } from './FlagInfo'
17
- import ColorAdjustView from '@ledvance/base/src/components/ColorAdjustView'
18
- import { Result } from '@ledvance/base/src/models/modules/Result'
19
- import { FlagOption } from './FlagActions'
20
- import { FlagPageProps } from './FlagPage'
21
- import ColorTempAdjustView from '@ledvance/base/src/components/ColorTempAdjustView'
22
- import { showDialog } from '@ledvance/base/src/utils/common'
23
- import { cctToColor } from '@ledvance/base/src/utils/cctUtils'
24
-
25
- const cx = Utils.RatioUtils.convertX
26
-
27
- export interface FlagEditParams {
28
- mode: 'add' | 'edit'
29
- currentMood: FlagUiInfo
30
- moods: FlagUiInfo[]
31
- moduleParams: FlagPageProps
32
- modDeleteFlag: (mode: 'add' | 'edit' | 'del', currentMood: FlagUiInfo, options?: FlagOption) => Promise<Result<any>>
33
- }
34
-
35
- const FlagEditPage = () => {
36
- const navigation = useNavigation()
37
- const params = cloneDeep(useRoute().params as FlagEditParams)
38
- const state = useReactive({
39
- showAddMoodPopover: true,
40
- mood: params.currentMood,
41
- currentWhiteNode: params.currentMood.whiteColors[params.currentMood.whiteColors.length - 1]!,
42
- currentNode: params.currentMood.colors[params.currentMood.colors.length - 1],
43
- whitePaintBucketIdx: params.currentMood.whiteColors.length - 1,
44
- colorPaintBucketIdx: params.currentMood.colors.length - 1,
45
- whitePaintBucketSelected: true,
46
- colorPaintBucketSelected: false,
47
- loading: false
48
- })
49
-
50
- const getColorBlockColor = useCallback((isMainLight?: boolean) => {
51
- if (isMainLight) {
52
- return cctToColor(state.currentWhiteNode.colorTemp, Math.max(...[state.currentWhiteNode.brightness, 50]))
53
- }
54
- const { h, s, v } = state.currentNode
55
- return hsv2Hex(h, s, v)
56
- }, [state.currentNode, state.currentWhiteNode])
57
-
58
- useUpdateEffect(() =>{
59
- state.currentNode = state.mood.colors[state.colorPaintBucketIdx]
60
- }, [JSON.stringify(state.mood.colors), state.colorPaintBucketIdx])
61
-
62
- useUpdateEffect(() =>{
63
- state.currentWhiteNode = state.mood.whiteColors[state.whitePaintBucketIdx]
64
- }, [JSON.stringify(state.mood.whiteColors), state.whitePaintBucketIdx])
65
-
66
- const checkMoodDataChanged = useMemo(() =>{
67
- return isEqual(state.mood, params.currentMood)
68
- }, [params.currentMood, state.mood])
69
-
70
- const nameRepeat = useMemo(() => {
71
- return !!find(params.moods, m => (m.id !== state.mood.id && m.name === state.mood.name && state.mood.name !== ''))
72
- }, [state.mood.name])
73
-
74
- const canSaveMoodData = useMemo(() =>{
75
- return state.mood.name.length > 0 && state.mood.name.length < 33 && !nameRepeat && (params.mode === 'add' || !checkMoodDataChanged)
76
- }, [nameRepeat, state.mood.name, checkMoodDataChanged, params.mode])
77
-
78
- return (
79
- <Page
80
- backText={I18n.getLang('Feature_devicepanel_flags')}
81
- showBackDialog={!checkMoodDataChanged}
82
- loading={state.loading}
83
- backDialogTitle={
84
- I18n.getLang(params.mode === 'add' ?
85
- 'flag_canceladding' :
86
- 'flag_canceledit')
87
- }
88
- backDialogContent={
89
- I18n.getLang('flag_cancelinfo')
90
- }
91
- headlineText={I18n.getLang(params.mode === 'add' ? 'flag_addanewflag' : 'flag_edittheflag')}
92
- rightButtonIcon={canSaveMoodData ? res.ic_check : res.ic_uncheck}
93
- rightButtonIconClick={async () => {
94
- if (state.loading || !canSaveMoodData) return
95
- state.loading = true
96
- const res = await params.modDeleteFlag(params.mode, state.mood)
97
- if (res.success) {
98
- state.loading = false
99
- navigation.goBack()
100
- }
101
- }}>
102
- <ScrollView
103
- style={{ flex: 1 }}
104
- nestedScrollEnabled={true}>
105
- <View style={styles.root}>
106
- <TextField
107
- style={styles.name}
108
- value={state.mood.name}
109
- placeholder={I18n.getLang('edit_static_mood_inputfield_topic_text')}
110
- onChangeText={text => {
111
- state.mood.name = text
112
- }}
113
- maxLength={33}
114
- showError={state.mood.name.length > 32 || nameRepeat}
115
- tipColor={nameRepeat ? '#f00' : undefined}
116
- tipIcon={nameRepeat ? res.ic_text_field_input_error : undefined}
117
- errorText={I18n.getLang(nameRepeat ? 'string_light_pp_field_sm_add_error1' : 'add_new_dynamic_mood_alert_text')} />
118
- {(params.moduleParams.isSupportMixScene || params.moduleParams.isCeilingLight) && <><Card style={styles.adjustCard}>
119
- <Spacer height={cx(16)} />
120
- <View style={styles.lightLine}>
121
- <Text style={styles.light}>
122
- {I18n.getLang('light_sources_tile_main_lighting_headline')}
123
- </Text>
124
- <View style={[styles.preview, { backgroundColor: getColorBlockColor(true) }]} />
125
- </View>
126
- <Spacer />
127
- <ColorTempAdjustView
128
- isSupportBrightness={!!params.moduleParams.isSupportTemperature}
129
- isSupportTemperature={!!params.moduleParams.isSupportTemperature}
130
- colorTemp={state.currentWhiteNode.colorTemp}
131
- brightness={state.currentWhiteNode.brightness}
132
- onCCTChange={(cct) => {
133
- state.currentWhiteNode.colorTemp = cct
134
- }}
135
- onCCTChangeComplete={(cct) => {
136
- state.currentWhiteNode.colorTemp = cct
137
- state.mood.whiteColors = state.mood.whiteColors.map((item, idx) => {
138
- if (idx === state.whitePaintBucketIdx) {
139
- return {
140
- ...state.mood.whiteColors[idx],
141
- colorTemp: cct
142
- }
143
- }
144
- return item
145
- })
146
- }}
147
- onBrightnessChange={() => { }}
148
- onBrightnessChangeComplete={(bright) => {
149
- state.currentWhiteNode.brightness = bright
150
- state.mood.whiteColors = state.mood.whiteColors.map((item, idx) => {
151
- if (idx === state.whitePaintBucketIdx) {
152
- return {
153
- ...state.mood.whiteColors[idx],
154
- brightness: bright
155
- }
156
- }
157
- return item
158
- })
159
- }}
160
- />
161
- <Spacer height={cx(16)} />
162
- </Card>
163
- <Spacer />
164
- </>}
165
- <Card style={styles.adjustCard}>
166
- <Spacer height={cx(16)} />
167
- <View style={styles.lightLine}>
168
- <Text style={styles.light}>
169
- {I18n.getLang((params.moduleParams.isSupportMixScene || params.moduleParams.isCeilingLight) ? 'light_sources_tile_sec_lighting_headline' : 'light_sources_tile_tw_lighting_headline')}
170
- </Text>
171
- </View>
172
- <Spacer height={cx(10)} />
173
- {(!params.moduleParams.isStripLight && !params.moduleParams.isCeilingLight) && <>
174
- <LdvSlider
175
- title={I18n.getLang('add_new_dynamic_mood_lights_field_speed_topic_text')}
176
- value={state.mood.speed}
177
- onValueChange={value => {
178
- state.mood.speed = value
179
- }}
180
- onSlidingComplete={value => {
181
- state.mood.speed = value
182
- }} />
183
- <Spacer height={cx(16)} />
184
- </>}
185
- <View style={styles.nodesAdjust}>
186
- <View style={styles.adjustButtons}>
187
- <TouchableOpacity
188
- onPress={() => {
189
- state.colorPaintBucketSelected = true
190
- }}>
191
- <Image
192
- style={[styles.adjustButton, { tintColor: state.colorPaintBucketSelected ? '#f60' : '#666' }]}
193
- source={res.ic_paint_bucket} />
194
- </TouchableOpacity>
195
- <TouchableOpacity
196
- onPress={() => {
197
- state.colorPaintBucketSelected = false
198
- }}>
199
- <Image
200
- style={[styles.adjustButton, { tintColor: state.colorPaintBucketSelected ? '#666' : '#f60' }]}
201
- source={res.ic_colorize} />
202
- </TouchableOpacity>
203
- </View>
204
- <FlatList
205
- data={state.mood.colors}
206
- style={styles.nodeList}
207
- renderItem={({ item, index }) => {
208
- return (
209
- <View style={styles.nodeItem}>
210
- <TouchableOpacity
211
- style={[
212
- styles.nodeBlock,
213
- {
214
- backgroundColor: hsv2Hex(item.h, item.s, item.v),
215
- },
216
- ]}
217
- onPress={() => {
218
- state.currentNode = item
219
- state.colorPaintBucketIdx = index
220
- }} />
221
- <TouchableOpacity
222
- style={styles.nodeDeleteBtn}
223
- disabled={state.mood.colors.length < 3}
224
- onPress={() => {
225
- state.mood.colors.splice(index, 1)
226
- state.currentNode = state.mood.colors[state.mood.colors.length - 1]
227
- }}>
228
- <Image
229
- style={[
230
- styles.nodeDeleteIcon,
231
- {
232
- tintColor: state.mood.colors.length < 3 ? '#ccc' : '#666',
233
- },
234
- ]}
235
- source={res.ic_mood_del} />
236
- </TouchableOpacity>
237
- </View>
238
- )
239
- }}
240
- keyExtractor={(_, index) => `${index}`}
241
- ItemSeparatorComponent={() => <Spacer height={cx(12)} />}
242
- ListFooterComponent={() => {
243
- if (state.mood.colors.length >= 8) {
244
- return (<></>)
245
- }
246
- return (
247
- <View>
248
- <Spacer height={cx(12)} />
249
- <TouchableOpacity
250
- style={styles.nodeAddBtn}
251
- onPress={() => {
252
- const node = {
253
- ...state.currentNode,
254
- }
255
- state.mood.colors.push(node)
256
- state.currentNode = node
257
- state.colorPaintBucketIdx = state.mood.colors.length - 1
258
- }}>
259
- <Image
260
- style={{
261
- width: cx(18),
262
- height: cx(18),
263
- tintColor: '#000',
264
- }}
265
- source={{ uri: res.add }} />
266
- </TouchableOpacity>
267
- </View>
268
- )
269
- }} />
270
- </View>
271
- <Spacer />
272
- <View style={styles.lightLine}>
273
- <Text style={styles.light}>
274
- {I18n.getLang('add_new_dynamic_mood_lights_field_headline2_text')}
275
- </Text>
276
- <View style={[styles.preview, { backgroundColor: getColorBlockColor() }]} />
277
- </View>
278
- <Spacer />
279
- <ColorAdjustView
280
- h={state.currentNode.h}
281
- s={state.currentNode.s}
282
- v={state.currentNode.v}
283
- reserveSV={true}
284
- minBrightness={0}
285
- onHSVChange={(h, s, v) => {
286
- if (state.colorPaintBucketSelected) {
287
- state.mood.colors = state.mood.colors.map(() => (
288
- { h, s, v }
289
- ))
290
- } else {
291
- state.currentNode.h = h
292
- state.currentNode.s = s
293
- state.currentNode.v = v
294
- }
295
- }}
296
- onHSVChangeComplete={(h, s, v) => {
297
- if (state.colorPaintBucketSelected) {
298
- state.mood.colors = state.mood.colors.map(() => (
299
- { h, s, v }
300
- ))
301
- } else {
302
- state.currentNode.h = h
303
- state.currentNode.s = s
304
- state.currentNode.v = v
305
- state.mood.colors = state.mood.colors.map((item, idx) => {
306
- if (idx === state.colorPaintBucketIdx) {
307
- return { h, s, v }
308
- }
309
- return item
310
- })
311
- }
312
- }}
313
- />
314
- <Spacer height={cx(16)} />
315
- </Card>
316
- <Spacer />
317
- {params.mode === 'edit' &&
318
- <View style={{ marginTop: cx(20), marginHorizontal: cx(24) }}>
319
- <TextButton
320
- style={styles.deleteBtn}
321
- textStyle={styles.deleteBtnText}
322
- text={I18n.getLang('flag_deleteflag')}
323
- onPress={() => {
324
- showDialog({
325
- method: 'confirm',
326
- title: I18n.getLang('flag_deletepopup'),
327
- subTitle: I18n.getLang('strip_light_static_mood_edit_dialog_text'),
328
- onConfirm: async (_, { close }) => {
329
- close()
330
- if (state.loading) return
331
- state.loading = true
332
- const res = await params.modDeleteFlag('del', state.mood)
333
- if (res.success) {
334
- state.loading = false
335
- navigation.goBack()
336
- }
337
- }
338
- })
339
- }} />
340
- </View>}
341
- <Spacer />
342
- </View>
343
- </ScrollView>
344
- </Page>
345
- )
346
- }
347
-
348
- const styles = StyleSheet.create({
349
- root: {
350
- flex: 1,
351
- flexDirection: 'column',
352
- },
353
- name: {
354
- marginHorizontal: cx(24),
355
- },
356
- adjustCard: {
357
- marginVertical: cx(12),
358
- marginHorizontal: cx(24),
359
- },
360
- fanAdjustCard: {
361
- marginHorizontal: cx(24),
362
- },
363
- lightLine: {
364
- flexDirection: 'row',
365
- marginHorizontal: cx(16),
366
- },
367
- light: {
368
- color: '#000',
369
- fontSize: cx(18),
370
- fontFamily: 'helvetica_neue_lt_std_bd',
371
- },
372
- transitionMode: {
373
- marginHorizontal: cx(16),
374
- },
375
- preview: {
376
- width: cx(20),
377
- height: cx(20),
378
- marginStart: cx(12),
379
- borderRadius: cx(4),
380
- },
381
- nodesAdjust: {
382
- flexDirection: 'row',
383
- alignItems: 'center',
384
- },
385
- adjustButtons: {
386
- width: cx(44),
387
- marginStart: cx(16),
388
- },
389
- adjustButton: {
390
- width: cx(44),
391
- height: cx(44),
392
- },
393
- nodeList: {
394
- flex: 1,
395
- marginHorizontal: cx(16),
396
- },
397
- nodeItem: {
398
- flexDirection: 'row',
399
- alignItems: 'center',
400
- },
401
- nodeBlock: {
402
- flex: 1,
403
- height: cx(40),
404
- borderRadius: cx(8),
405
- borderWidth: 1,
406
- borderColor: '#ccc'
407
- },
408
- nodeDeleteBtn: {
409
- width: cx(24),
410
- height: cx(30),
411
- justifyContent: 'center',
412
- alignItems: 'center',
413
- },
414
- nodeDeleteIcon: {
415
- width: cx(16),
416
- height: cx(16),
417
- },
418
- nodeAddBtn: {
419
- height: cx(40),
420
- justifyContent: 'center',
421
- alignItems: 'center',
422
- marginEnd: cx(26),
423
- borderRadius: cx(8),
424
- borderWidth: cx(1),
425
- borderStyle: 'dashed',
426
- borderColor: '#666',
427
- backgroundColor: '#f6f6f6',
428
- },
429
- deleteBtn: {
430
- width: '100%',
431
- height: cx(50),
432
- backgroundColor: '#666',
433
- borderRadius: cx(8),
434
- },
435
- deleteBtnText: {
436
- color: '#fff',
437
- fontSize: cx(16),
438
- fontFamily: 'helvetica_neue_lt_std_bd',
439
- },
440
- })
441
-
1
+ import React, { useCallback, useMemo } from 'react'
2
+ import I18n from '@ledvance/base/src/i18n'
3
+ import { useNavigation, useRoute } from '@react-navigation/native'
4
+ import Page from '@ledvance/base/src/components/Page'
5
+ import res from '@ledvance/base/src/res'
6
+ import { ScrollView, View, FlatList, StyleSheet, Image, TouchableOpacity, Text } from 'react-native'
7
+ import Spacer from '@ledvance/base/src/components/Spacer'
8
+ import { useReactive, useUpdateEffect } from 'ahooks'
9
+ import { Utils } from 'tuya-panel-kit'
10
+ import TextField from '@ledvance/base/src/components/TextField'
11
+ import Card from '@ledvance/base/src/components/Card'
12
+ import LdvSlider from '@ledvance/base/src/components/ldvSlider'
13
+ import TextButton from '@ledvance/base/src/components/TextButton'
14
+ import { hsv2Hex } from '@ledvance/base/src/utils'
15
+ import { cloneDeep, find, isEqual } from 'lodash'
16
+ import { FlagUiInfo } from './FlagInfo'
17
+ import ColorAdjustView from '@ledvance/base/src/components/ColorAdjustView'
18
+ import { Result } from '@ledvance/base/src/models/modules/Result'
19
+ import { FlagOption } from './FlagActions'
20
+ import { FlagPageProps } from './FlagPage'
21
+ import ColorTempAdjustView from '@ledvance/base/src/components/ColorTempAdjustView'
22
+ import { showDialog } from '@ledvance/base/src/utils/common'
23
+ import { cctToColor } from '@ledvance/base/src/utils/cctUtils'
24
+
25
+ const cx = Utils.RatioUtils.convertX
26
+
27
+ export interface FlagEditParams {
28
+ mode: 'add' | 'edit'
29
+ currentMood: FlagUiInfo
30
+ moods: FlagUiInfo[]
31
+ moduleParams: FlagPageProps
32
+ modDeleteFlag: (mode: 'add' | 'edit' | 'del', currentMood: FlagUiInfo, options?: FlagOption) => Promise<Result<any>>
33
+ }
34
+
35
+ const FlagEditPage = () => {
36
+ const navigation = useNavigation()
37
+ const params = cloneDeep(useRoute().params as FlagEditParams)
38
+ const state = useReactive({
39
+ showAddMoodPopover: true,
40
+ mood: params.currentMood,
41
+ currentWhiteNode: params.currentMood.whiteColors[params.currentMood.whiteColors.length - 1]!,
42
+ currentNode: params.currentMood.colors[params.currentMood.colors.length - 1],
43
+ whitePaintBucketIdx: params.currentMood.whiteColors.length - 1,
44
+ colorPaintBucketIdx: params.currentMood.colors.length - 1,
45
+ whitePaintBucketSelected: true,
46
+ colorPaintBucketSelected: false,
47
+ loading: false
48
+ })
49
+
50
+ const getColorBlockColor = useCallback((isMainLight?: boolean) => {
51
+ if (isMainLight) {
52
+ return cctToColor(state.currentWhiteNode.colorTemp, Math.max(...[state.currentWhiteNode.brightness, 50]))
53
+ }
54
+ const { h, s, v } = state.currentNode
55
+ return hsv2Hex(h, s, v)
56
+ }, [state.currentNode, state.currentWhiteNode])
57
+
58
+ useUpdateEffect(() =>{
59
+ state.currentNode = state.mood.colors[state.colorPaintBucketIdx]
60
+ }, [JSON.stringify(state.mood.colors), state.colorPaintBucketIdx])
61
+
62
+ useUpdateEffect(() =>{
63
+ state.currentWhiteNode = state.mood.whiteColors[state.whitePaintBucketIdx]
64
+ }, [JSON.stringify(state.mood.whiteColors), state.whitePaintBucketIdx])
65
+
66
+ const checkMoodDataChanged = useMemo(() =>{
67
+ return isEqual(state.mood, params.currentMood)
68
+ }, [params.currentMood, state.mood])
69
+
70
+ const nameRepeat = useMemo(() => {
71
+ return !!find(params.moods, m => (m.id !== state.mood.id && m.name === state.mood.name && state.mood.name !== ''))
72
+ }, [state.mood.name])
73
+
74
+ const canSaveMoodData = useMemo(() =>{
75
+ return state.mood.name.length > 0 && state.mood.name.length < 33 && !nameRepeat && (params.mode === 'add' || !checkMoodDataChanged)
76
+ }, [nameRepeat, state.mood.name, checkMoodDataChanged, params.mode])
77
+
78
+ return (
79
+ <Page
80
+ backText={I18n.getLang('Feature_devicepanel_flags')}
81
+ showBackDialog={!checkMoodDataChanged}
82
+ loading={state.loading}
83
+ backDialogTitle={
84
+ I18n.getLang(params.mode === 'add' ?
85
+ 'flag_canceladding' :
86
+ 'flag_canceledit')
87
+ }
88
+ backDialogContent={
89
+ I18n.getLang('flag_cancelinfo')
90
+ }
91
+ headlineText={I18n.getLang(params.mode === 'add' ? 'flag_addanewflag' : 'flag_edittheflag')}
92
+ rightButtonIcon={canSaveMoodData ? res.ic_check : res.ic_uncheck}
93
+ rightButtonIconClick={async () => {
94
+ if (state.loading || !canSaveMoodData) return
95
+ state.loading = true
96
+ const res = await params.modDeleteFlag(params.mode, state.mood)
97
+ if (res.success) {
98
+ state.loading = false
99
+ navigation.goBack()
100
+ }
101
+ }}>
102
+ <ScrollView
103
+ style={{ flex: 1 }}
104
+ nestedScrollEnabled={true}>
105
+ <View style={styles.root}>
106
+ <TextField
107
+ style={styles.name}
108
+ value={state.mood.name}
109
+ placeholder={I18n.getLang('edit_static_mood_inputfield_topic_text')}
110
+ onChangeText={text => {
111
+ state.mood.name = text
112
+ }}
113
+ maxLength={33}
114
+ showError={state.mood.name.length > 32 || nameRepeat}
115
+ tipColor={nameRepeat ? '#f00' : undefined}
116
+ tipIcon={nameRepeat ? res.ic_text_field_input_error : undefined}
117
+ errorText={I18n.getLang(nameRepeat ? 'string_light_pp_field_sm_add_error1' : 'add_new_dynamic_mood_alert_text')} />
118
+ {(params.moduleParams.isSupportMixScene || params.moduleParams.isCeilingLight) && <><Card style={styles.adjustCard}>
119
+ <Spacer height={cx(16)} />
120
+ <View style={styles.lightLine}>
121
+ <Text style={styles.light}>
122
+ {I18n.getLang('light_sources_tile_main_lighting_headline')}
123
+ </Text>
124
+ <View style={[styles.preview, { backgroundColor: getColorBlockColor(true) }]} />
125
+ </View>
126
+ <Spacer />
127
+ <ColorTempAdjustView
128
+ isSupportBrightness={!!params.moduleParams.isSupportTemperature}
129
+ isSupportTemperature={!!params.moduleParams.isSupportTemperature}
130
+ colorTemp={state.currentWhiteNode.colorTemp}
131
+ brightness={state.currentWhiteNode.brightness}
132
+ onCCTChange={(cct) => {
133
+ state.currentWhiteNode.colorTemp = cct
134
+ }}
135
+ onCCTChangeComplete={(cct) => {
136
+ state.currentWhiteNode.colorTemp = cct
137
+ state.mood.whiteColors = state.mood.whiteColors.map((item, idx) => {
138
+ if (idx === state.whitePaintBucketIdx) {
139
+ return {
140
+ ...state.mood.whiteColors[idx],
141
+ colorTemp: cct
142
+ }
143
+ }
144
+ return item
145
+ })
146
+ }}
147
+ onBrightnessChange={() => { }}
148
+ onBrightnessChangeComplete={(bright) => {
149
+ state.currentWhiteNode.brightness = bright
150
+ state.mood.whiteColors = state.mood.whiteColors.map((item, idx) => {
151
+ if (idx === state.whitePaintBucketIdx) {
152
+ return {
153
+ ...state.mood.whiteColors[idx],
154
+ brightness: bright
155
+ }
156
+ }
157
+ return item
158
+ })
159
+ }}
160
+ />
161
+ <Spacer height={cx(16)} />
162
+ </Card>
163
+ <Spacer />
164
+ </>}
165
+ <Card style={styles.adjustCard}>
166
+ <Spacer height={cx(16)} />
167
+ <View style={styles.lightLine}>
168
+ <Text style={styles.light}>
169
+ {I18n.getLang((params.moduleParams.isSupportMixScene || params.moduleParams.isCeilingLight) ? 'light_sources_tile_sec_lighting_headline' : 'light_sources_tile_tw_lighting_headline')}
170
+ </Text>
171
+ </View>
172
+ <Spacer height={cx(10)} />
173
+ {(!params.moduleParams.isStripLight && !params.moduleParams.isCeilingLight) && <>
174
+ <LdvSlider
175
+ title={I18n.getLang('add_new_dynamic_mood_lights_field_speed_topic_text')}
176
+ value={state.mood.speed}
177
+ onValueChange={value => {
178
+ state.mood.speed = value
179
+ }}
180
+ onSlidingComplete={value => {
181
+ state.mood.speed = value
182
+ }} />
183
+ <Spacer height={cx(16)} />
184
+ </>}
185
+ <View style={styles.nodesAdjust}>
186
+ <View style={styles.adjustButtons}>
187
+ <TouchableOpacity
188
+ onPress={() => {
189
+ state.colorPaintBucketSelected = true
190
+ }}>
191
+ <Image
192
+ style={[styles.adjustButton, { tintColor: state.colorPaintBucketSelected ? '#f60' : '#666' }]}
193
+ source={res.ic_paint_bucket} />
194
+ </TouchableOpacity>
195
+ <TouchableOpacity
196
+ onPress={() => {
197
+ state.colorPaintBucketSelected = false
198
+ }}>
199
+ <Image
200
+ style={[styles.adjustButton, { tintColor: state.colorPaintBucketSelected ? '#666' : '#f60' }]}
201
+ source={res.ic_colorize} />
202
+ </TouchableOpacity>
203
+ </View>
204
+ <FlatList
205
+ data={state.mood.colors}
206
+ style={styles.nodeList}
207
+ renderItem={({ item, index }) => {
208
+ return (
209
+ <View style={styles.nodeItem}>
210
+ <TouchableOpacity
211
+ style={[
212
+ styles.nodeBlock,
213
+ {
214
+ backgroundColor: hsv2Hex(item.h, item.s, item.v),
215
+ },
216
+ ]}
217
+ onPress={() => {
218
+ state.currentNode = item
219
+ state.colorPaintBucketIdx = index
220
+ }} />
221
+ <TouchableOpacity
222
+ style={styles.nodeDeleteBtn}
223
+ disabled={state.mood.colors.length < 3}
224
+ onPress={() => {
225
+ state.mood.colors.splice(index, 1)
226
+ state.currentNode = state.mood.colors[state.mood.colors.length - 1]
227
+ }}>
228
+ <Image
229
+ style={[
230
+ styles.nodeDeleteIcon,
231
+ {
232
+ tintColor: state.mood.colors.length < 3 ? '#ccc' : '#666',
233
+ },
234
+ ]}
235
+ source={res.ic_mood_del} />
236
+ </TouchableOpacity>
237
+ </View>
238
+ )
239
+ }}
240
+ keyExtractor={(_, index) => `${index}`}
241
+ ItemSeparatorComponent={() => <Spacer height={cx(12)} />}
242
+ ListFooterComponent={() => {
243
+ if (state.mood.colors.length >= 8) {
244
+ return (<></>)
245
+ }
246
+ return (
247
+ <View>
248
+ <Spacer height={cx(12)} />
249
+ <TouchableOpacity
250
+ style={styles.nodeAddBtn}
251
+ onPress={() => {
252
+ const node = {
253
+ ...state.currentNode,
254
+ }
255
+ state.mood.colors.push(node)
256
+ state.currentNode = node
257
+ state.colorPaintBucketIdx = state.mood.colors.length - 1
258
+ }}>
259
+ <Image
260
+ style={{
261
+ width: cx(18),
262
+ height: cx(18),
263
+ tintColor: '#000',
264
+ }}
265
+ source={{ uri: res.add }} />
266
+ </TouchableOpacity>
267
+ </View>
268
+ )
269
+ }} />
270
+ </View>
271
+ <Spacer />
272
+ <View style={styles.lightLine}>
273
+ <Text style={styles.light}>
274
+ {I18n.getLang('add_new_dynamic_mood_lights_field_headline2_text')}
275
+ </Text>
276
+ <View style={[styles.preview, { backgroundColor: getColorBlockColor() }]} />
277
+ </View>
278
+ <Spacer />
279
+ <ColorAdjustView
280
+ h={state.currentNode.h}
281
+ s={state.currentNode.s}
282
+ v={state.currentNode.v}
283
+ reserveSV={true}
284
+ minBrightness={0}
285
+ onHSVChange={(h, s, v) => {
286
+ if (state.colorPaintBucketSelected) {
287
+ state.mood.colors = state.mood.colors.map(() => (
288
+ { h, s, v }
289
+ ))
290
+ } else {
291
+ state.currentNode.h = h
292
+ state.currentNode.s = s
293
+ state.currentNode.v = v
294
+ }
295
+ }}
296
+ onHSVChangeComplete={(h, s, v) => {
297
+ if (state.colorPaintBucketSelected) {
298
+ state.mood.colors = state.mood.colors.map(() => (
299
+ { h, s, v }
300
+ ))
301
+ } else {
302
+ state.currentNode.h = h
303
+ state.currentNode.s = s
304
+ state.currentNode.v = v
305
+ state.mood.colors = state.mood.colors.map((item, idx) => {
306
+ if (idx === state.colorPaintBucketIdx) {
307
+ return { h, s, v }
308
+ }
309
+ return item
310
+ })
311
+ }
312
+ }}
313
+ />
314
+ <Spacer height={cx(16)} />
315
+ </Card>
316
+ <Spacer />
317
+ {params.mode === 'edit' &&
318
+ <View style={{ marginTop: cx(20), marginHorizontal: cx(24) }}>
319
+ <TextButton
320
+ style={styles.deleteBtn}
321
+ textStyle={styles.deleteBtnText}
322
+ text={I18n.getLang('flag_deleteflag')}
323
+ onPress={() => {
324
+ showDialog({
325
+ method: 'confirm',
326
+ title: I18n.getLang('flag_deletepopup'),
327
+ subTitle: I18n.getLang('strip_light_static_mood_edit_dialog_text'),
328
+ onConfirm: async (_, { close }) => {
329
+ close()
330
+ if (state.loading) return
331
+ state.loading = true
332
+ const res = await params.modDeleteFlag('del', state.mood)
333
+ if (res.success) {
334
+ state.loading = false
335
+ navigation.goBack()
336
+ }
337
+ }
338
+ })
339
+ }} />
340
+ </View>}
341
+ <Spacer />
342
+ </View>
343
+ </ScrollView>
344
+ </Page>
345
+ )
346
+ }
347
+
348
+ const styles = StyleSheet.create({
349
+ root: {
350
+ flex: 1,
351
+ flexDirection: 'column',
352
+ },
353
+ name: {
354
+ marginHorizontal: cx(24),
355
+ },
356
+ adjustCard: {
357
+ marginVertical: cx(12),
358
+ marginHorizontal: cx(24),
359
+ },
360
+ fanAdjustCard: {
361
+ marginHorizontal: cx(24),
362
+ },
363
+ lightLine: {
364
+ flexDirection: 'row',
365
+ marginHorizontal: cx(16),
366
+ },
367
+ light: {
368
+ color: '#000',
369
+ fontSize: cx(18),
370
+ fontFamily: 'helvetica_neue_lt_std_bd',
371
+ },
372
+ transitionMode: {
373
+ marginHorizontal: cx(16),
374
+ },
375
+ preview: {
376
+ width: cx(20),
377
+ height: cx(20),
378
+ marginStart: cx(12),
379
+ borderRadius: cx(4),
380
+ },
381
+ nodesAdjust: {
382
+ flexDirection: 'row',
383
+ alignItems: 'center',
384
+ },
385
+ adjustButtons: {
386
+ width: cx(44),
387
+ marginStart: cx(16),
388
+ },
389
+ adjustButton: {
390
+ width: cx(44),
391
+ height: cx(44),
392
+ },
393
+ nodeList: {
394
+ flex: 1,
395
+ marginHorizontal: cx(16),
396
+ },
397
+ nodeItem: {
398
+ flexDirection: 'row',
399
+ alignItems: 'center',
400
+ },
401
+ nodeBlock: {
402
+ flex: 1,
403
+ height: cx(40),
404
+ borderRadius: cx(8),
405
+ borderWidth: 1,
406
+ borderColor: '#ccc'
407
+ },
408
+ nodeDeleteBtn: {
409
+ width: cx(24),
410
+ height: cx(30),
411
+ justifyContent: 'center',
412
+ alignItems: 'center',
413
+ },
414
+ nodeDeleteIcon: {
415
+ width: cx(16),
416
+ height: cx(16),
417
+ },
418
+ nodeAddBtn: {
419
+ height: cx(40),
420
+ justifyContent: 'center',
421
+ alignItems: 'center',
422
+ marginEnd: cx(26),
423
+ borderRadius: cx(8),
424
+ borderWidth: cx(1),
425
+ borderStyle: 'dashed',
426
+ borderColor: '#666',
427
+ backgroundColor: '#f6f6f6',
428
+ },
429
+ deleteBtn: {
430
+ width: '100%',
431
+ height: cx(50),
432
+ backgroundColor: '#666',
433
+ borderRadius: cx(8),
434
+ },
435
+ deleteBtnText: {
436
+ color: '#fff',
437
+ fontSize: cx(16),
438
+ fontFamily: 'helvetica_neue_lt_std_bd',
439
+ },
440
+ })
441
+
442
442
  export default FlagEditPage