@ledvance/ui-biz-bundle 1.1.62 → 1.1.63

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.1.62",
7
+ "version": "1.1.63",
8
8
  "scripts": {},
9
9
  "dependencies": {
10
10
  "@ledvance/base": "^1.x",
@@ -235,7 +235,7 @@ const TimerPage = (props: {theme?: any}) => {
235
235
  <Text style={styles.itemTitle}>{I18n.getLang('timeschedule_add_schedule_subheadline_text')}</Text>
236
236
  <View
237
237
  style={{
238
- backgroundColor: props.theme.card.background,
238
+ backgroundColor: props.theme.card.board,
239
239
  borderRadius: 4,
240
240
  minHeight: cx(50),
241
241
  flex: 1,
@@ -7,13 +7,13 @@ import { padStart } from "lodash";
7
7
  import I18n from "@ledvance/base/src/i18n";
8
8
  import { hex2Int, spliceByStep } from "@ledvance/base/src/utils/common";
9
9
  import { parseJSON } from "@tuya/tuya-panel-lamp-sdk/lib/utils";
10
- import { Buffer } from "buffer";
11
- import { useUpdateEffect } from "ahooks";
10
+ import { Buffer } from 'buffer'
12
11
 
13
12
  const { to16 } = Utils
14
13
 
15
14
  const fixedFeatureId = 'cycle_timing'
16
15
  const plug_fixedFeatureId = 'cycle_time'
16
+
17
17
  export interface FixedTimerData {
18
18
  version: number
19
19
  length: number
@@ -22,6 +22,7 @@ export interface FixedTimerData {
22
22
 
23
23
  export interface FixedTimer {
24
24
  enable: boolean;
25
+ channel?: number;
25
26
  weeks: number[];
26
27
  startTime: number;
27
28
  endTime: number;
@@ -52,9 +53,9 @@ export interface PlugFixedTimer {
52
53
  closeTime: number;
53
54
  }
54
55
  let fixedTimer
55
- type UseFixedTimeType = (dpKey: string, isPlug?: boolean) => [FixedTimerUiItem[], (fixedTimeList: FixedTimerUiItem[]) => Promise<{ success: boolean }>]
56
+ type UseFixedTimeType = (dpKey: string, isPlug?: boolean, disableFeature?: boolean) => [FixedTimerUiItem[], (fixedTimeList: FixedTimerUiItem[], manualEdit?: boolean) => Promise<{ success: boolean }>]
56
57
 
57
- export const useFixedTime: UseFixedTimeType = (dpKey, isPlug) => {
58
+ export const useFixedTime: UseFixedTimeType = (dpKey, isPlug, disableFeature) => {
58
59
  const deviceId = useDeviceId()
59
60
  const [fixedTimeDp, setFixedTimeDp]: [string, (v: string) => Promise<Result<any>>] = useDp(dpKey)
60
61
  const [fixedTimeUiList, setFixedTimeUiList] = useState<FixedTimerUiItem[]>([])
@@ -66,54 +67,54 @@ export const useFixedTime: UseFixedTimeType = (dpKey, isPlug) => {
66
67
  name: `${I18n.getLang('fixedTimeCycle_socket_headline')} ${idx + 1}`
67
68
  }))
68
69
  }, [fixedTimeList])
69
-
70
70
  // 获取云端数据
71
71
  useEffect(() => {
72
+ // 不获取名称
73
+ if(disableFeature) {
74
+ setFixedTimeUiList(formatterFn())
75
+ return
76
+ }
72
77
  fixedTimer = setTimeout(() => {
73
- getFeatureFn()
74
- }, 300)
75
- return () => clearTimeout(fixedTimer)
76
- }, [])
77
-
78
- useUpdateEffect(() =>{
79
- fixedTimer = setTimeout(() =>{
80
- getFeatureFn()
81
- }, 100)
82
- return () => clearTimeout(fixedTimer)
83
- }, [fixedTimeDp])
84
-
85
- const getFeatureFn = () =>{
86
- getFeature(deviceId, isPlug ? plug_fixedFeatureId : fixedFeatureId).then(res => {
87
- if (res?.result) {
88
- // 首次进入同步云端数据 (云端无数据)
89
- if (!res.data) {
90
- const cloudData = formatterFn()
91
- setFixedTimeFn(cloudData).then()
92
- } else {
93
- const featureData = parseJSON(res.data)
78
+ getFeature(deviceId, isPlug ? plug_fixedFeatureId : fixedFeatureId).then(res => {
79
+ if (res?.result) {
80
+ // 首次进入同步云端数据 (云端无数据)
81
+ if (!res.data) {
82
+ const cloudData = formatterFn()
83
+ setFixedTimeFn(cloudData).then()
84
+ } else {
85
+ const featureData = parseJSON(res.data)
94
86
  if (fixedTimeList.length) {
95
87
  const uiPlan = fixedTimeList?.map((item, idx: number) => {
96
- const featureItem = featureData.find(feature => (isPlug ? parseJSON(feature?.v)?.dp : feature?.v) === fixedTimeToHex(item, isPlug))
88
+ const dp = fixedTimeToHex(item, isPlug, true)
89
+ const fixed = featureData[idx]
90
+ const featureItem = fixed?.v && (isPlug ? parseJSON(fixed?.v)?.dp : fixed?.v)?.includes(dp) ? (isPlug ? parseJSON(fixed) : fixed) : featureData.find(feature => (isPlug ? parseJSON(feature?.v)?.dp : feature?.v).includes(dp))
97
91
  return {
98
92
  ...item,
99
93
  index: idx,
100
- name: featureItem ? featureItem?.n : `${I18n.getLang('fixedTimeCycle_socket_headline')} ${idx + 1}`
94
+ name: featureItem ? featureItem?.n : `${I18n.getLang('randomtimecycle_sockets_headline_text')} ${idx + 1}`
101
95
  }
102
96
  })
103
97
  setFixedTimeUiList(uiPlan)
104
98
  } else {
105
99
  setFixedTimeUiList([])
106
100
  }
101
+ }
107
102
  }
108
- }
109
- })
110
- }
103
+ })
104
+ }, 250)
105
+
106
+ return () => clearTimeout(fixedTimer)
107
+ }, [fixedTimeDp])
108
+
111
109
 
112
110
  const setFixedTimeFn = async (fixedTimeList: FixedTimerUiItem[]) => {
113
- const fixedData = fixedTimeList.map(item => ({
114
- n: item?.name || '',
115
- v: isPlug ? JSON.stringify({dp: fixedTimeToHex(item, isPlug)}) : fixedTimeToHex(item, isPlug)
116
- }))
111
+ const fixedData = fixedTimeList.map(item => {
112
+ const fixedHex = fixedTimeToHex(item, isPlug)
113
+ return {
114
+ n: item?.name || '',
115
+ v: isPlug ? JSON.stringify({dp: fixedHex}) : fixedHex
116
+ }
117
+ })
117
118
  const cloudStatus = await putFeatureFn(deviceId, isPlug ? plug_fixedFeatureId : fixedFeatureId, JSON.stringify(fixedData))
118
119
  if (cloudStatus) {
119
120
  const fixedTimerData = {
@@ -121,8 +122,7 @@ export const useFixedTime: UseFixedTimeType = (dpKey, isPlug) => {
121
122
  length: isPlug ? 10 : 16,
122
123
  nodes: fixedTimeList
123
124
  }
124
- let hex = fixedTimeObj2Dp(fixedTimerData, isPlug)
125
- if(isPlug) hex = Buffer.from(hex, 'hex').toString('base64')
125
+ const hex = fixedTimeObj2Dp(fixedTimerData, isPlug)
126
126
  const res = await setFixedTimeDp(hex)
127
127
  if (res.success) {
128
128
  return {
@@ -156,7 +156,7 @@ const putFeatureFn = async (devId, featureId, data) => {
156
156
  }
157
157
 
158
158
  const fixedTimeDp2Obj = (fixedDp: string, isPlug?: boolean) => {
159
- if (fixedDp?.length <= 4) return
159
+ if (!fixedDp || fixedDp?.length <= 8) return
160
160
  if(isPlug){
161
161
  fixedDp = Buffer.from(fixedDp, 'base64').toString('hex')
162
162
  }
@@ -165,7 +165,11 @@ const fixedTimeDp2Obj = (fixedDp: string, isPlug?: boolean) => {
165
165
  const s = isPlug ? 0 : 4
166
166
  const n = isPlug ? 20 : 32
167
167
  const nodes = spliceByStep(fixedDp.slice(s), n).map(plan => {
168
- const enable = plan.slice(0, 2) === '01'
168
+ const powerInfo = padStart(parseInt(`${plan.slice(0, 2)}`, 16).toString(2), 8, '0');
169
+ const powerBits = powerInfo.split('');
170
+ const enable = !!Number(powerBits[powerBits.length - 1]);
171
+ // 通道号
172
+ const channel = parseInt(powerBits.slice(1, powerBits.length - 1).join(''), 2);
169
173
  const weeks = parseInt(plan.slice(2, 4), 16).toString(2).padStart(8, '0')
170
174
  .split('')
171
175
  .reverse()
@@ -175,7 +179,7 @@ const fixedTimeDp2Obj = (fixedDp: string, isPlug?: boolean) => {
175
179
  const openTime = hex2Int(plan.slice(12, 16))
176
180
  const closeTime = hex2Int(plan.slice(16, 20))
177
181
  const common = {
178
- enable, weeks, startTime, endTime, openTime, closeTime
182
+ enable, channel, weeks, startTime, endTime, openTime, closeTime
179
183
  }
180
184
  if (isPlug) {
181
185
  return common
@@ -211,9 +215,11 @@ const fixedTimeObj2Dp = (randomTimerData: FixedTimerData, isPlug?: boolean) => {
211
215
  }
212
216
 
213
217
 
214
- const fixedTimeToHex = (fixedTime: FixedTimer, isPlug?: boolean) => {
215
- const { weeks, startTime, endTime, openTime, closeTime, enable } = fixedTime
216
- const enableStr = enable ? '01' : '00'
218
+ const fixedTimeToHex = (fixedTime: FixedTimer, isPlug?: boolean, isFeatureData?: boolean) => {
219
+ const { weeks, startTime, endTime, openTime, closeTime, channel, enable } = fixedTime
220
+ const channelStr = padStart((channel ?? 0).toString(2), 7, '0');
221
+ const powerChannel = parseInt(`${channelStr}${enable ? 1 : 0}`, 2);
222
+ const powerChannelStr = to16(powerChannel, 2);
217
223
  const weeksValue: string = padStart([...weeks].reverse().join(''), 8, '0');
218
224
  const weeksStr = to16(parseInt(weeksValue, 2), 2);
219
225
  const startTimeStr = to16(startTime, 4);
@@ -230,5 +236,5 @@ const fixedTimeToHex = (fixedTime: FixedTimer, isPlug?: boolean) => {
230
236
  const temperatureStr = to16(temperature);
231
237
  colorHex = hueStr + saturationStr + valueStr + brightnessStr + temperatureStr
232
238
  }
233
- return enableStr + weeksStr + startTimeStr + endTimeStr + openTimeStr + closeTimeStr + colorHex
239
+ return (isFeatureData ? '' : powerChannelStr) + weeksStr + startTimeStr + endTimeStr + openTimeStr + closeTimeStr + colorHex
234
240
  }
@@ -2,7 +2,7 @@ import React, { useEffect, useMemo } from "react";
2
2
  import { ScrollView, StyleSheet, View, Text, Image, TouchableOpacity } from "react-native";
3
3
  import { useReactive, useUpdateEffect } from "ahooks";
4
4
  import Page from "@ledvance/base/src/components/Page";
5
- import { useNavigation, useRoute } from '@react-navigation/core'
5
+ import { useNavigation } from '@react-navigation/core'
6
6
  import I18n from "@ledvance/base/src/i18n";
7
7
  import res from "@ledvance/base/src/res";
8
8
  import TextField from "@ledvance/base/src/components/TextField";
@@ -21,6 +21,7 @@ import Summary from "../randomTime/Summary";
21
21
  import { FixedTimePageParams } from "./FixedTimePage";
22
22
  import { Result } from "@ledvance/base/src/models/modules/Result";
23
23
  import { useSystemTimeFormate } from "@ledvance/base/src/models/modules/NativePropsSlice";
24
+ import { useParams } from "@ledvance/base/src/hooks/Hooks";
24
25
 
25
26
  const { convertX: cx } = Utils.RatioUtils;
26
27
  const { toFixedString } = Utils.NumberUtils;
@@ -33,13 +34,11 @@ export interface FixedTimeDetailPageParams extends FixedTimePageParams {
33
34
 
34
35
  const FixedTimeDetailPage = () => {
35
36
  const navigation = useNavigation()
36
- const params = useRoute().params as FixedTimeDetailPageParams
37
+ const params = useParams<FixedTimeDetailPageParams>()
37
38
  const is24Hour = useSystemTimeFormate()
38
39
  const state = useReactive({
39
40
  loading: false,
40
41
  isColorMode: false,
41
- selectedSkill: params.applyDps.length === 1 ? params.applyDps : [],
42
- skillList: params.applyDps.length === 1 ? [] : params.applyDps,
43
42
  fixedTime: cloneDeep(params.scheduleItem)
44
43
  })
45
44
 
@@ -56,30 +55,30 @@ const FixedTimeDetailPage = () => {
56
55
  if (state.fixedTime.closeTime === 0) state.fixedTime.closeTime = 1
57
56
  }, [state.fixedTime.openTime, state.fixedTime.closeTime])
58
57
 
59
- const showClearIcon = useMemo(() => (
60
- false
61
- ), [state.skillList])
62
-
63
58
  const inRangeTime = useMemo(() => {
64
59
  const { startTime, endTime, closeTime, openTime } = state.fixedTime
65
60
  const poweredTime = openTime + closeTime
66
- if (startTime <= endTime) {
61
+ if (startTime < endTime) {
67
62
  return (endTime - startTime) >= poweredTime
68
63
  } else {
69
- return (1440 - endTime + startTime) >= poweredTime
64
+ return (1440 - endTime - startTime) >= poweredTime
70
65
  }
71
66
  }, [JSON.stringify(state.fixedTime)])
72
67
 
68
+ const checkItemChanged = useMemo(() =>{
69
+ return isEqual(state.fixedTime, params.scheduleItem)
70
+ }, [params.scheduleItem, JSON.stringify(state.fixedTime)])
71
+
73
72
  const canSubmit = useMemo(() => {
74
- return state.fixedTime.name?.length > 0 && state.fixedTime.name?.length < 33 && !isEqual(state.fixedTime, params.scheduleItem) && inRangeTime
75
- }, [JSON.stringify(state.fixedTime), inRangeTime])
73
+ return state.fixedTime.name?.length > 0 && state.fixedTime.name?.length < 33 && !checkItemChanged && inRangeTime && state.fixedTime.channel !== undefined
74
+ }, [JSON.stringify(state.fixedTime), checkItemChanged, inRangeTime])
76
75
 
77
76
  return (
78
77
  <Page
79
78
  backText={I18n.getLang('fixedTimeCycle_socket_headline')}
80
79
  rightButtonIcon={canSubmit ? res.ic_check : res.ic_uncheck}
81
80
  loading={state.loading}
82
- showBackDialog={canSubmit}
81
+ showBackDialog={!checkItemChanged}
83
82
  backDialogTitle={I18n.getLang('cancel_dialog_leave_unsaved_titel')}
84
83
  backDialogContent={I18n.getLang('cancel_dialog_leave_unsaved_fixedtimecycle_note')}
85
84
  headlineText={I18n.getLang(params.mode === 'add' ? 'add_fixedtimecycle_headline_text' : 'edit_fixedtimecycle_headline_text')}
@@ -143,25 +142,31 @@ const FixedTimeDetailPage = () => {
143
142
  <View style={styles.cardContainer}>
144
143
  <Text style={styles.itemTitle}>{I18n.getLang('timeschedule_add_schedule_subheadline_text')}</Text>
145
144
  <Spacer height={cx(10)} />
146
- <View style={styles.applyContent}>
147
- {state.selectedSkill.length === 0 ?
145
+ <View style={[styles.applyContent, { paddingTop: state.fixedTime.channel === undefined ? 0 : cx(10) }]}>
146
+ {state.fixedTime.channel === undefined ?
148
147
  <Text>{I18n.getLang('timer_ceiling_fan_selectionfield_no_components_text')}</Text> :
149
- state.selectedSkill.map((skill: any) => (
150
- <View style={[styles.applyItem, { marginBottom: cx(10), borderRadius: 4 }]} key={skill.label}>
151
- <Text style={{ color: '#000' }}>{skill.label}</Text>
152
- {showClearIcon && <TouchableOpacity
153
- onPress={() => { }}
154
- style={{ paddingHorizontal: cx(5) }}>
155
- <Image style={{ width: cx(16), height: cx(16) }} source={res.ic_arrows_nav_clear} />
156
- </TouchableOpacity>}
157
- </View>
158
- ))
148
+ <View style={[styles.applyItem, { marginBottom: cx(10), borderRadius: 4 }]}>
149
+ <Text style={{ color: '#000' }}>{params.applyForList[state.fixedTime.channel]?.key}</Text>
150
+ {params.applyForList.length > 1 && <TouchableOpacity
151
+ onPress={() => {
152
+ state.fixedTime.channel = undefined
153
+ }}
154
+ style={{ paddingHorizontal: cx(5) }}>
155
+ <Image style={{ width: cx(16), height: cx(16) }} source={res.ic_arrows_nav_clear} />
156
+ </TouchableOpacity>}
157
+ </View>
159
158
  }
160
159
  </View>
161
- {state.skillList.map((item: any) => {
160
+ {params.applyForList.map((item, index) => {
161
+ if (state.fixedTime.channel === index) return null
162
162
  return (
163
- <TouchableOpacity style={styles.applyItem} key={item.label} onPress={() => { }}>
164
- <Text style={{ color: '#000' }}>{item.label}</Text>
163
+ <TouchableOpacity
164
+ style={styles.applyItem}
165
+ key={item.key}
166
+ onPress={() => {
167
+ state.fixedTime.channel = index
168
+ }}>
169
+ <Text style={{ color: '#000' }}>{item.key}</Text>
165
170
  <Image style={{ width: cx(16), height: cx(16) }} source={res.device_panel_timer_add} />
166
171
  </TouchableOpacity>
167
172
  )
@@ -182,9 +187,9 @@ const FixedTimeDetailPage = () => {
182
187
  showSwitch={false}
183
188
  />
184
189
  <LampAdjustView
185
- isSupportColor={params.isSupportColor}
186
- isSupportBrightness={params.isSupportBrightness}
187
- isSupportTemperature={params.isSupportTemperature}
190
+ isSupportColor={!!params.isSupportColor}
191
+ isSupportBrightness={!!params.isSupportBrightness}
192
+ isSupportTemperature={!!params.isSupportTemperature}
188
193
  isColorMode={state.isColorMode}
189
194
  reserveSV={true}
190
195
  setIsColorMode={(v) => state.isColorMode = v}
@@ -263,12 +268,12 @@ const FixedTimeDetailPage = () => {
263
268
  <View style={{ flexDirection: 'column' }}>
264
269
  <Text style={{ color: '#000' }}>{I18n.formatValue('feature_summary_action_txt_4', `${Math.trunc(state.fixedTime.openTime / 60)}`, `${state.fixedTime.openTime % 60}`)}</Text>
265
270
  <View style={styles.summaryTag}>
266
- <Text style={{ color: '#000' }}>{state.selectedSkill[0]?.label || ''}</Text>
271
+ <Text style={{ color: '#000' }}>{I18n.getLang('timeschedule_add_schedule_nightlight_plug_selectionfield_text2')}</Text>
267
272
  </View>
268
273
  <Spacer height={cx(5)} />
269
274
  <Text style={{ color: '#000' }}>{I18n.formatValue('feature_summary_action_txt_6', `${Math.trunc(state.fixedTime.closeTime / 60)}`, `${state.fixedTime.closeTime % 60}`)}</Text>
270
275
  <View style={styles.summaryTag}>
271
- <Text style={{ color: '#000' }}>{state.selectedSkill[0]?.label || ''}</Text>
276
+ <Text style={{ color: '#000' }}>{I18n.getLang('timeschedule_add_schedule_nightlight_plug_selectionfield_text2')}</Text>
272
277
  </View>
273
278
  </View>
274
279
  )}
@@ -284,8 +289,8 @@ const FixedTimeDetailPage = () => {
284
289
  title: I18n.getLang('cancel_dialog_delete_item_fixedtimecycle_titel'),
285
290
  subTitle: I18n.getLang('cancel_dialog_delete_item_fixedtimecycle_description'),
286
291
  onConfirm: async (_, { close }) => {
287
- state.loading = true
288
292
  close()
293
+ state.loading = true
289
294
  const res = await params.onPost('del', state.fixedTime)
290
295
  state.loading = false
291
296
  if (res.success) {
@@ -338,4 +343,4 @@ const styles = StyleSheet.create({
338
343
  }
339
344
  })
340
345
 
341
- export default FixedTimeDetailPage
346
+ export default FixedTimeDetailPage