@ledvance/ui-biz-bundle 1.0.85 → 1.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "name": "@ledvance/ui-biz-bundle",
5
5
  "pid": [],
6
6
  "uiid": "",
7
- "version": "1.0.85",
7
+ "version": "1.0.87",
8
8
  "scripts": {},
9
9
  "dependencies": {
10
10
  "@ledvance/base": "^1.x",
@@ -34,6 +34,15 @@ export interface CycleTimerItem extends CycleTimer {
34
34
  name: string
35
35
  }
36
36
 
37
+ export interface PlugFixedTimer {
38
+ power: boolean;
39
+ channel: number;
40
+ weeks: number[];
41
+ startTime: number;
42
+ endTime: number;
43
+ openTime: number;
44
+ closeTime: number;
45
+ }
37
46
 
38
47
  type UseFixedTimeType = (dpKey: string, disableFeature?: boolean) => [CycleTimerItem[], (fixedTimeList: CycleTimerItem[], manualEdit?: boolean) => Promise<{ success: boolean }>]
39
48
 
@@ -41,7 +41,7 @@ const FantasyMoodPage = () => {
41
41
  const params: FantasyMoodPageProps = {
42
42
  ...routeParams,
43
43
  }
44
- const [sceneId, setScene] = useFantasyScene(params.sceneDpCode, params.workModeDpCode, params.isStringLight)
44
+ const [sceneId, setScene] = useFantasyScene(params.sceneDpCode, params.workModeDpCode, params.switchLedDpCode, params.isStringLight)
45
45
  const [workMode] = useWorkMode(params.workModeDpCode)
46
46
  const deviceInfo = useDeviceInfo()
47
47
  const navigation = useNavigation()
@@ -80,7 +80,7 @@ const FantasyMoodPage = () => {
80
80
  state.flag = Symbol()
81
81
  },
82
82
  })
83
- }, [])
83
+ }, [state.scenes])
84
84
 
85
85
  const getSwitchEnable = useCallback((id: number) => {
86
86
  return state.currentScene?.id === id && workMode === SCENE
@@ -50,7 +50,7 @@ const FantasyMoodEditPage = () => {
50
50
  const moduleParams = params.moduleParams
51
51
  const deviceId = useDeviceId()
52
52
  const [, setWorkMode] = useWorkMode(moduleParams.workModeDpCode)
53
- const [, setFantasyScene] = useFantasyScene(params.moduleParams.sceneDpCode, params.moduleParams.workModeDpCode, moduleParams.isStringLight)
53
+ const [, setFantasyScene] = useFantasyScene(params.moduleParams.sceneDpCode, params.moduleParams.workModeDpCode, params.moduleParams.switchLedDpCode, moduleParams.isStringLight)
54
54
  const role = useRole()
55
55
  const state = useReactive<FantasyMoodEditPageState>({
56
56
  headline: '',
@@ -83,7 +83,7 @@ const FantasyMoodEditPage = () => {
83
83
  }, [])
84
84
 
85
85
  const onPost = useCallback(async (isDelete: boolean) => {
86
- const maxModeObject = maxBy(params.moods, 'mode');
86
+ const maxModeObject = maxBy(params.moods, 'id');
87
87
  const currentMood = {
88
88
  ...state.mood,
89
89
  nodes: state.mood.nodes.map(node => {
@@ -97,8 +97,9 @@ const FantasyMoodEditPage = () => {
97
97
  }
98
98
  return node
99
99
  }),
100
- id: params.mode === 'add' ? maxModeObject && maxModeObject.mode > 200 ? maxModeObject.mode + 1 : 201 : state.mood.id
100
+ id: params.mode === 'add' ? maxModeObject && maxModeObject.id > 200 ? maxModeObject.id + 1 : 201 : state.mood.id
101
101
  }
102
+
102
103
  const list = params.mode === 'add' ? [currentMood,...params.moods] :
103
104
  isDelete ? params.moods.filter(mood => mood.id !== currentMood.id) :
104
105
  params.moods.map(mood => {
@@ -118,7 +119,7 @@ const FantasyMoodEditPage = () => {
118
119
  }
119
120
  navigation.navigate(ui_biz_routerKey.ui_biz_fantasy_mood)
120
121
  routeParams.onSave()
121
- }, [])
122
+ }, [params.moods])
122
123
 
123
124
  const createSelectModeData = useCallback(() => {
124
125
  return Object.values(state.sceneMode).map(scene => {
@@ -0,0 +1,12 @@
1
+ import { useDp } from "@ledvance/base/src/models/modules/NativePropsSlice"
2
+ import { Result } from "@ledvance/base/src/models/modules/Result"
3
+
4
+ export interface PowerBehaviorPageParams {
5
+ powerBehaviorCode: string
6
+ }
7
+
8
+ type PowerBehaviorType = 'off' | 'on' | 'memory'
9
+
10
+ export const usePowerBehavior = (code: string): [PowerBehaviorType, (v: PowerBehaviorType) => Promise<Result<any>>] => {
11
+ return useDp(code)
12
+ }
@@ -0,0 +1,173 @@
1
+ import React, { PropsWithChildren } from 'react'
2
+ import { Image, ScrollView, StyleSheet, Text, TouchableOpacity, View, ViewProps } from 'react-native'
3
+ import { useRoute } from '@react-navigation/core'
4
+ import Page from '@ledvance/base/src/components/Page'
5
+ import { useDeviceInfo } from '@ledvance/base/src/models/modules/NativePropsSlice'
6
+ import I18n from '@ledvance/base/src/i18n'
7
+ import { PowerBehaviorPageParams, usePowerBehavior } from './PowerOnBehaviorActions'
8
+ import { Utils } from 'tuya-panel-kit'
9
+ import Spacer from '@ledvance/base/src/components/Spacer'
10
+ import Card from '@ledvance/base/src/components/Card'
11
+ import res from '@ledvance/base/src/res'
12
+ import { useReactive, useUpdateEffect } from 'ahooks'
13
+
14
+ const { convertX: cx } = Utils.RatioUtils
15
+
16
+ const RELAY_STATUS_OFF = 'off'
17
+ const RELAY_STATUS_ON = 'on'
18
+ const RELAY_STATUS_MEMORY = 'memory'
19
+
20
+ const PowerOnBehaviorPage = () => {
21
+ const params = useRoute().params as PowerBehaviorPageParams
22
+ const deviceInfo = useDeviceInfo()
23
+ const [powerMemory, setPowerMemory] = usePowerBehavior(params.powerBehaviorCode)
24
+
25
+ const state = useReactive({
26
+ powerMemory,
27
+ loading: false,
28
+ })
29
+
30
+ useUpdateEffect(() => {
31
+ state.powerMemory = powerMemory
32
+ }, [powerMemory])
33
+
34
+ return (
35
+ <Page
36
+ backText={deviceInfo.name}
37
+ headlineText={I18n.getLang('light_sources_specific_settings_power_off')}
38
+ loading={state.loading}>
39
+ <ScrollView style={styles.root} nestedScrollEnabled={true}>
40
+ <Spacer />
41
+ <View style={styles.modeSelectGroup}>
42
+ <Spacer height={cx(8)} />
43
+ <Text style={styles.modeTip}>
44
+ {I18n.getLang('socket_settings_firstbox_topic')}
45
+ </Text>
46
+ <Spacer height={cx(8)} />
47
+ <Card style={styles.modeSelectCard}>
48
+ <Spacer height={cx(12)} />
49
+ <PowerOnBehaviorModeItem
50
+ enable={state.powerMemory === RELAY_STATUS_OFF}
51
+ title={I18n.getLang('feature_summary_action_txt_2')}
52
+ content={I18n.getLang('socket_settings_firstbox_status1_description')}
53
+ onPress={async () => {
54
+ state.powerMemory = RELAY_STATUS_OFF
55
+ await setPowerMemory(state.powerMemory)
56
+ }} />
57
+ <View style={styles.line} />
58
+ <Spacer height={cx(8)} />
59
+ <PowerOnBehaviorModeItem
60
+ enable={state.powerMemory === RELAY_STATUS_ON}
61
+ title={I18n.getLang('feature_summary_action_txt_1')}
62
+ content={I18n.getLang('socket_settings_firstbox_status2_description')}
63
+ onPress={async () => {
64
+ state.powerMemory = RELAY_STATUS_ON
65
+ await setPowerMemory(state.powerMemory)
66
+ }} />
67
+ <View style={styles.line} />
68
+ <Spacer height={cx(8)} />
69
+ <PowerOnBehaviorModeItem
70
+ enable={state.powerMemory === RELAY_STATUS_MEMORY}
71
+ title={I18n.getLang('sockets_specific_settings_relay_status_remember')}
72
+ content={I18n.getLang('socket_settings_firstbox_status3_description')}
73
+ onPress={async () => {
74
+ state.powerMemory = RELAY_STATUS_MEMORY
75
+ await setPowerMemory(state.powerMemory)
76
+ }} />
77
+ <Spacer height={cx(4)} />
78
+ </Card>
79
+ <Spacer height={cx(8)} />
80
+ </View>
81
+ </ScrollView>
82
+ </Page>
83
+ )
84
+ }
85
+
86
+ interface PowerOnBehaviorModeItemProps extends PropsWithChildren<ViewProps> {
87
+ onPress: () => void
88
+ title: string
89
+ content: string
90
+ enable: boolean
91
+ }
92
+
93
+ function PowerOnBehaviorModeItem(props: PowerOnBehaviorModeItemProps) {
94
+ return (
95
+ <TouchableOpacity onPress={props.onPress}>
96
+ <View style={styles.itemRoot}>
97
+ <View style={styles.itemTextGroup}>
98
+ <Text style={styles.itemTitle}>{props.title}</Text>
99
+ <Spacer height={cx(4)} />
100
+ <Text style={styles.itemContent}>{props.content}</Text>
101
+ </View>
102
+ <Image
103
+ source={{ uri: res.ic_check }}
104
+ style={[
105
+ styles.itemCheckedIcon,
106
+ {
107
+ display: props.enable ? 'flex' : 'none',
108
+ },
109
+ ]} />
110
+ </View>
111
+ </TouchableOpacity>
112
+ )
113
+ }
114
+
115
+ const styles = StyleSheet.create({
116
+ root: {
117
+ flex: 1,
118
+ },
119
+ tipText: {
120
+ marginHorizontal: cx(24),
121
+ color: '#000',
122
+ fontSize: cx(14),
123
+ fontFamily: 'helvetica_neue_lt_std_roman',
124
+ },
125
+ modeSelectGroup: {
126
+ marginHorizontal: cx(24),
127
+ backgroundColor: '#f6f6f6',
128
+ borderRadius: cx(4),
129
+ },
130
+ modeTip: {
131
+ marginHorizontal: cx(8),
132
+ color: '#000',
133
+ fontSize: cx(14),
134
+ fontWeight: 'bold',
135
+ fontFamily: 'helvetica_neue_lt_std_bd',
136
+ },
137
+ modeSelectCard: {
138
+ marginHorizontal: cx(8),
139
+ },
140
+ line: {
141
+ height: cx(1),
142
+ marginHorizontal: cx(12),
143
+ backgroundColor: '#3C3C435B',
144
+ },
145
+ itemRoot: {
146
+ flexDirection: 'row',
147
+ alignItems: 'center',
148
+ paddingHorizontal: cx(12),
149
+ paddingBottom: cx(8),
150
+ },
151
+ itemTextGroup: {
152
+ flex: 1,
153
+ marginEnd: cx(12),
154
+ justifyContent: 'center',
155
+ },
156
+ itemTitle: {
157
+ color: '#000',
158
+ fontSize: cx(14),
159
+ fontFamily: 'helvetica_neue_lt_std_roman',
160
+ },
161
+ itemContent: {
162
+ color: '#666',
163
+ fontSize: cx(14),
164
+ fontFamily: 'helvetica_neue_lt_std_roman',
165
+ },
166
+ itemCheckedIcon: {
167
+ width: cx(32),
168
+ height: cx(32),
169
+ marginEnd: cx(4),
170
+ },
171
+ })
172
+
173
+ export default PowerOnBehaviorPage
@@ -29,6 +29,18 @@ export interface RandomTimerItem extends RandomTimer{
29
29
  name: string
30
30
  }
31
31
 
32
+ export interface PlugRandomTimer {
33
+ power: boolean;
34
+ weeks: number[];
35
+ startTime: number;
36
+ endTime: number;
37
+ }
38
+
39
+ export interface PlugRandomTimerItem extends PlugRandomTimer {
40
+ index: number | string
41
+ name: string
42
+ }
43
+
32
44
 
33
45
  type UseFixedTimeType = (dpKey: string, disableFeature?: boolean) => [RandomTimerItem[], (randomTimeList: RandomTimerItem[], manualEdit?: boolean) => Promise<{ success: boolean}>]
34
46
 
@@ -401,7 +401,7 @@ export function stripObj2Dp(scene: StripSceneInfo, isStringLight: boolean = fals
401
401
  return versionHex + idHex + modeHex + intervalTimeHex + changeTimeHex + optionAHex + optionBHex + optionCHex + nodeHex
402
402
  }
403
403
 
404
- export function useFantasyScene(sceneDp: string, workModeDp: string, isStringLight?: boolean): [number, (scene: StripSceneInfo) => Promise<Result<any>>] {
404
+ export function useFantasyScene(sceneDp: string, workModeDp: string, switchDp: string, isStringLight?: boolean): [number, (scene: StripSceneInfo) => Promise<Result<any>>] {
405
405
  const [dps, setDps]: [any, (v: any) => Promise<Result<any>>] = useDps()
406
406
  const dp = dps[sceneDp]
407
407
  const [sceneState, setSceneState] = useState<StripSceneInfo>(stripDp2Obj(dp, isStringLight))
@@ -414,7 +414,8 @@ export function useFantasyScene(sceneDp: string, workModeDp: string, isStringLig
414
414
  const sceneHex = stripObj2Dp(scene, isStringLight)
415
415
  return setDps({
416
416
  [sceneDp]: sceneHex,
417
- [workModeDp]: SCENE
417
+ [workModeDp]: SCENE,
418
+ [switchDp]: true
418
419
  })
419
420
  }
420
421
  return [sceneState.id, setFantasyScene]
@@ -426,14 +427,14 @@ type LampType = {
426
427
  }
427
428
  export async function getRemoteFantasyScene(featureId: string, devId: string, lampType: LampType) {
428
429
  const res = await NativeApi.getJson(devId, featureId)
429
- const cloudData = Array.isArray(parseJSON(res?.data)) && parseJSON(res?.data) || []
430
- if (res.success && cloudData?.length) {
430
+ const isNormalData = Array.isArray(parseJSON(res?.data))
431
+ if (res.success && isNormalData) {
431
432
  return {
432
433
  success: true,
433
434
  data: JSON.parse(res.data)?.map(item => remoteFantasySceneInfo2SceneUIState(item, lampType.isStringLight)),
434
435
  }
435
436
  } else {
436
- if (res.msg?.includes('资源未找到') || cloudData?.length === 0) {
437
+ if (res.msg?.includes('资源未找到') || !isNormalData) {
437
438
  const defaultScene = getDefFantasyScene(lampType)
438
439
  const res = await NativeApi.putJson(devId, featureId, JSON.stringify(defaultScene))
439
440
  if (res.success) {
@@ -126,19 +126,19 @@ const SleepWakeUpDetailPage = () => {
126
126
  }, [])
127
127
 
128
128
  useUpdateEffect(() => {
129
- const min = state.fadeOutHour === '02' ? '00' : (state.fadeOutHour === '00' && state.fadeOutMinute === '00' && '05') || state.fadeOutMinute
129
+ const min = state.fadeOutHour === '02' ? '00' : (state.fadeOutHour === '00' && state.fadeOutMinute === '00') ? '05' : state.fadeOutMinute
130
130
  state.fadeOutMinute = min
131
131
  state.fadeOut = (Number(state.fadeOutHour) * 60) + Number(min)
132
132
  }, [state.fadeOutHour, state.fadeOutMinute])
133
133
 
134
134
  useUpdateEffect(() => {
135
- const min = state.fadeInHour === '02' ? '00' : (state.fadeInHour === '00' && state.fadeInMinute === '00' && '05') || state.fadeInMinute
135
+ const min = state.fadeInHour === '02' ? '00' : (state.fadeInHour === '00' && state.fadeInMinute === '00') ? '05' : state.fadeInMinute
136
136
  state.fadeInMinute = min
137
137
  state.fadeIn = (Number(state.fadeInHour) * 60) + Number(min)
138
138
  }, [state.fadeInHour, state.fadeInMinute])
139
139
 
140
140
  useUpdateEffect(() => {
141
- const min = state.durationHour === '02' ? '00' : (state.durationHour === '00' && state.durationMinute === '00' && '05') || state.durationMinute
141
+ const min = state.durationHour === '02' ? '00' : (state.durationHour === '00' && state.durationMinute === '00') ? '05' : state.durationMinute
142
142
  state.durationMinute = min
143
143
  state.duration = (Number(state.durationHour) * 60) + Number(min)
144
144
  }, [state.durationHour, state.durationMinute])
@@ -386,7 +386,7 @@ const SleepWakeUpDetailPage = () => {
386
386
  <LdvPickerView
387
387
  style={styles.picker}
388
388
  hour={props.isSleep ? state.fadeOutHour : state.fadeInHour}
389
- minute={props.isSleep ? state.fadeOutMinute : state.fadeOutMinute}
389
+ minute={props.isSleep ? state.fadeOutMinute : state.fadeInMinute}
390
390
  minutesStep={5}
391
391
  setHour={v => {
392
392
  if (props.isSleep) {
@@ -403,6 +403,7 @@ const SleepWakeUpDetailPage = () => {
403
403
  }
404
404
  }}
405
405
  unit={['h', 'min']}
406
+ maxHour={3}
406
407
  />
407
408
  <Text>{I18n.formatValue(props.isSleep ? 'add_sleepschedule_one_source_settings_text2' : 'add_wakeupschedule_settings_text2', `${formateTime(props.isSleep ? state.fadeOut : state.fadeIn, props.isSleep)}`)}</Text>
408
409
  <Spacer />
@@ -435,6 +436,7 @@ const SleepWakeUpDetailPage = () => {
435
436
  setHour={v => (state.durationHour = v)}
436
437
  setMinute={v => (state.durationMinute = v)}
437
438
  unit={['h', 'min']}
439
+ maxHour={3}
438
440
  />
439
441
  <Text>{I18n.formatValue('add_wakeupschedule_settings_text5', `${formateTime(state.duration, !props.isSleep)}`)}</Text>
440
442
  <Spacer />
@@ -1,4 +1,4 @@
1
- import {NavigationRoute, TransitionPresets} from 'tuya-panel-kit'
1
+ import { NavigationRoute, TransitionPresets } from 'tuya-panel-kit'
2
2
  import TimeSchedulePage from '../modules/timeSchedule/TimeSchedulePage'
3
3
  import TimeScheduleEditPage from '../modules/timeSchedule/TimeScheduleEditpage'
4
4
  import DynamicMoodEditorPage from '../modules/mood/DynamicMoodEditorPage'
@@ -19,6 +19,8 @@ import FixedTimePage from '../modules/fixedTime/FixedTimePage'
19
19
  import FixedTimeDetailPage from '../modules/fixedTime/FixedTimeDetailPage'
20
20
  import RandomTimePage from 'modules/randomTime/RandomTimePage'
21
21
  import RandomTimeDetailPage from '../modules/randomTime/RandomTimeDetailPage'
22
+ import HistoryPage from '../modules/history/HistoryPage'
23
+ import PowerOnBehaviorPage from '../modules/powerOnBehavior/PowerOnBehaviorPage'
22
24
 
23
25
  export const ui_biz_routerKey = {
24
26
  'ui_biz_time_schedule': 'ui_biz_time_schedule',
@@ -40,7 +42,9 @@ export const ui_biz_routerKey = {
40
42
  'ui_biz_fixed_time': 'ui_biz_fixed_time',
41
43
  'ui_biz_fixed_time_edit': 'ui_biz_fixed_time_edit',
42
44
  'ui_biz_random_time': 'ui_biz_random_time',
43
- 'ui_biz_random_time_edit': 'ui_biz_random_time_edit'
45
+ 'ui_biz_random_time_edit': 'ui_biz_random_time_edit',
46
+ 'ui_biz_history': 'ui_biz_history',
47
+ 'ui_biz_power_behavior': 'ui_biz_power_behavior'
44
48
  }
45
49
 
46
50
  export const BiologicalRouters: NavigationRoute[] = [
@@ -238,4 +242,26 @@ export const RandomTimePageRouters: NavigationRoute[] = [
238
242
  showOfflineView: false,
239
243
  },
240
244
  }
245
+ ]
246
+
247
+ export const HistoryPageRouters: NavigationRoute[] = [
248
+ {
249
+ name: ui_biz_routerKey.ui_biz_history,
250
+ component: HistoryPage,
251
+ options: {
252
+ hideTopbar: true,
253
+ showOfflineView: false,
254
+ }
255
+ }
256
+ ]
257
+
258
+ export const PowerOnBehaviorPageRouters: NavigationRoute[] = [
259
+ {
260
+ name: ui_biz_routerKey.ui_biz_power_behavior,
261
+ component: PowerOnBehaviorPage,
262
+ options: {
263
+ hideTopbar: true,
264
+ showOfflineView: false,
265
+ }
266
+ }
241
267
  ]