@ledvance/ui-biz-bundle 1.1.139 → 1.1.141

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.139",
7
+ "version": "1.1.141",
8
8
  "scripts": {},
9
9
  "dependencies": {
10
10
  "@ledvance/base": "^1.x",
@@ -27,6 +27,8 @@ export type dpItem = {
27
27
  cloudKey: any
28
28
  stringOn: any
29
29
  stringOff: any
30
+ dpValueToDisplay?: (value: number) => number
31
+ displayToDpValue?: (value: number) => number
30
32
  }
31
33
 
32
34
  type TimerPageRouteParams = {
@@ -271,6 +273,7 @@ const TimerPage = (props: {theme?: ThemeType}) => {
271
273
  <Spacer />
272
274
  <DeleteButton
273
275
  text={I18n.getLang('timer_sockets_button_text')}
276
+ disabled={!state.selectedSkill.length}
274
277
  onPress={onStartPress}
275
278
  textStyle={{ fontSize: cx(14) }}
276
279
  style={{ backgroundColor: !state.selectedSkill.length ? props.theme?.button.disabled : props.theme?.button.primary }}
@@ -6,11 +6,34 @@ import { useCountDown as useCountDownAHook, useUpdateEffect } from 'ahooks'
6
6
  import dayjs from "dayjs"
7
7
  import { NativeApi } from "@ledvance/base/src/api/native"
8
8
 
9
+ const useConvertCountdown = (item: dpItem): [number, (value: number) => Promise<Result<any>>] => {
10
+ const [dpValue, setDpValue] = useDp<number, (value: number) => Promise<Result<any>>>(item.dpId);
11
+ const [displayValue, setDisplayValue] = useState<number>(0);
12
+
13
+ // 当设备值变化时,转换为显示值
14
+ useEffect(() => {
15
+ // 如果dpValue是undefined或null,不进行转换
16
+ if (dpValue == null) return;
17
+
18
+ const value = item.dpValueToDisplay ? item.dpValueToDisplay(dpValue) : dpValue;
19
+ setDisplayValue(value);
20
+ }, [dpValue, item.dpValueToDisplay]);
21
+
22
+ // 将显示值转换为设备值并设置
23
+ const handleDisplayValueChange = useCallback((value: number) => {
24
+ if (value == null) return Promise.reject(new Error('Invalid value'));
25
+
26
+ const newDpValue = item.displayToDpValue ? item.displayToDpValue(value) : value;
27
+ return setDpValue(newDpValue);
28
+ }, [setDpValue, item.displayToDpValue]);
29
+
30
+ return [displayValue, handleDisplayValueChange];
31
+ }
9
32
 
10
33
  export const useCountdowns = (dps: dpItem[]) => {
11
34
  return dps.map(dp => {
12
35
  return ({
13
- countdown: useDp<number, (value: number) => Promise<Result<any>>>(dp.dpId),
36
+ countdown: useConvertCountdown(dp),
14
37
  enable: useDp<boolean, (value: boolean) => Promise<Result<any>>>(dp.enableDp),
15
38
  ...dp
16
39
  })
@@ -24,7 +47,7 @@ type FormateProgressType = {
24
47
  endTimer: () => void
25
48
  }
26
49
  const useFormateProgress: (dp: dpItem) => FormateProgressType = (dp) => {
27
- const [countdown, setCountdown] = useDp<number, (value: number) => Promise<Result<any>>>(dp.dpId)
50
+ const [countdown, setCountdown] = useConvertCountdown(dp)
28
51
  const [progress, setProgress] = useCountDownAHook({
29
52
  interval: 1000,
30
53
  onEnd: () => {
@@ -82,7 +82,10 @@ const LightBehaviorPage = (props: { theme?: ThemeType }) => {
82
82
  content: I18n.getLang('groups_settings_power_on_behavior_secondbox_status_value1_description'),
83
83
  value: PowerMemoryMode.Default,
84
84
  onPress: (value) => {
85
- state.powerMemory.type = value
85
+ state.powerMemory = {
86
+ ...state.powerMemory,
87
+ type: value
88
+ }
86
89
  setPowerMemory(state.powerMemory).then()
87
90
  }
88
91
  }, {
@@ -90,7 +93,10 @@ const LightBehaviorPage = (props: { theme?: ThemeType }) => {
90
93
  content: I18n.getLang('groups_settings_power_on_behavior_secondbox_status_value2_description'),
91
94
  value: PowerMemoryMode.Last,
92
95
  onPress: (value) => {
93
- state.powerMemory.type = value
96
+ state.powerMemory = {
97
+ ...state.powerMemory,
98
+ type: value
99
+ }
94
100
  setPowerMemory(state.powerMemory).then()
95
101
  }
96
102
  }, {
@@ -98,7 +104,10 @@ const LightBehaviorPage = (props: { theme?: ThemeType }) => {
98
104
  content: I18n.getLang('groups_settings_power_on_behavior_secondbox_status_value3_description'),
99
105
  value: PowerMemoryMode.Custom,
100
106
  onPress: (value) => {
101
- state.powerMemory.type = value
107
+ state.powerMemory = {
108
+ ...state.powerMemory,
109
+ type: value
110
+ }
102
111
  setPowerMemory(state.powerMemory).then()
103
112
  }
104
113
  }]} />
@@ -114,34 +123,63 @@ const LightBehaviorPage = (props: { theme?: ThemeType }) => {
114
123
  isColorMode={state.powerMemory.isColor}
115
124
  reserveSV={true}
116
125
  setIsColorMode={async isColorMode => {
117
- state.powerMemory.isColor = isColorMode
126
+ state.powerMemory = {
127
+ ...state.powerMemory,
128
+ isColor: isColorMode,
129
+ }
118
130
  }}
119
131
  h={state.powerMemory.hue} s={state.powerMemory.sat} v={state.powerMemory.val}
120
132
  onHSVChange={(h, s, v) => {
121
- state.powerMemory.hue = h
122
- state.powerMemory.sat = s
123
- state.powerMemory.val = v
133
+ state.powerMemory = {
134
+ ...state.powerMemory,
135
+ isColor: true,
136
+ hue: h,
137
+ sat: s,
138
+ val: v,
139
+ }
124
140
  }}
125
141
  onHSVChangeComplete={async (h, s, v) => {
126
- state.powerMemory.hue = h
127
- state.powerMemory.sat = s
128
- state.powerMemory.val = v
142
+ state.powerMemory = {
143
+ ...state.powerMemory,
144
+ isColor: true,
145
+ hue: h,
146
+ sat: s,
147
+ val: v,
148
+ }
129
149
  await setPowerMemory(state.powerMemory)
130
150
  }}
131
151
  colorTemp={state.powerMemory.temperature}
132
152
  brightness={state.powerMemory.bright}
133
153
  onCCTChange={cct => {
134
- state.powerMemory.temperature = cct
154
+ state.powerMemory ={
155
+ ...state.powerMemory,
156
+ isColor: false,
157
+ temperature: cct,
158
+ }
135
159
  }}
136
160
  onCCTChangeComplete={async cct => {
137
- state.powerMemory.temperature = cct
161
+ state.powerMemory = {
162
+ ...state.powerMemory,
163
+ isColor: false,
164
+ temperature: cct,
165
+ }
166
+ console.log('cct', cct, state.powerMemory);
138
167
  await setPowerMemory(state.powerMemory)
139
168
  }}
140
169
  onBrightnessChange={brightness => {
141
- state.powerMemory.bright = brightness
170
+ state.powerMemory = {
171
+ ...state.powerMemory,
172
+ isColor: false,
173
+ bright: brightness,
174
+ }
142
175
  }}
143
176
  onBrightnessChangeComplete={async brightness => {
144
- state.powerMemory.bright = brightness
177
+ state.powerMemory = {
178
+ ...state.powerMemory,
179
+ isColor: false,
180
+ bright: brightness,
181
+ }
182
+ console.log('brightness', brightness, state.powerMemory);
145
183
  await setPowerMemory(state.powerMemory)
146
184
  }} />
147
185
  </View>
@@ -567,8 +567,8 @@ const SleepWakeUpDetailPage = (props: { theme?: ThemeType }) => {
567
567
  </View>
568
568
  {/* Summary */}
569
569
  <Summary
570
- frequency={loopText(state.sleepWakeUp.weeks, parseTimer(state.sleepWakeUp.endTime * 60))}
571
- time={`${convertMinutesTo12HourFormat(state.sleepWakeUp.startTime, is24HourClock)} - ${convertMinutesTo12HourFormat(state.sleepWakeUp.endTime, is24HourClock)}`}
570
+ frequency={loopText(state.sleepWakeUp.weeks, parseTimer(getEndTime(state.sleepWakeUp) * 60))}
571
+ time={`${convertMinutesTo12HourFormat(getStartTime(state.sleepWakeUp), is24HourClock)} - ${convertMinutesTo12HourFormat(getEndTime(state.sleepWakeUp), is24HourClock)}`}
572
572
  actions={(
573
573
  <View>
574
574
  <Text style={{ fontSize: cx(12), color: props.theme?.global.fontColor }}>
@@ -594,7 +594,7 @@ const SleepWakeUpDetailPage = (props: { theme?: ThemeType }) => {
594
594
  <View style={styles.filletCorner}>
595
595
  <Text style={styles.rightTitle}>
596
596
  {convertMinutesTo12HourFormat(
597
- state.sleepWakeUp.endTime,
597
+ getEndTime(state.sleepWakeUp),
598
598
  is24HourClock
599
599
  )}
600
600
  </Text>
@@ -1,5 +1,5 @@
1
1
  import I18n from "@ledvance/base/src/i18n";
2
- import { AdjustType, DiySceneInfo } from "@ledvance/base/src/utils/interface";
2
+ import { AdjustType, ApplyForItem, DiySceneInfo } from "@ledvance/base/src/utils/interface";
3
3
  import { MoodInfo, MoodUIInfo } from "../mood/Interface";
4
4
 
5
5
  export interface Timer {
@@ -25,17 +25,6 @@ export interface HSV {
25
25
  v: number;
26
26
  }
27
27
 
28
- export type Category = 'light' | 'socket' | 'fan' | 'mainLight' | 'secondaryLight' | 'shutter'
29
-
30
- export interface ApplyForItem {
31
- name?: string
32
- index?: number
33
- key: string;
34
- dp: string;
35
- type: Category;
36
- enable: boolean;
37
- }
38
-
39
28
  interface judgmentSupport {
40
29
  isSupportColor: boolean;
41
30
  isSupportBrightness: boolean;
@@ -68,6 +57,7 @@ export enum DeviceType {
68
57
  FanLight = 'fanLight',
69
58
  MoodStrip = 'moodStrip',
70
59
  Shutter = 'shutter',
60
+ OsramFanLight = 'osramFanLight'
71
61
  }
72
62
  // export type DeviceType = 'LightSource' | 'CeilingLight' | 'StringLight' | 'StripLight' | 'MixLight';
73
63
 
@@ -111,6 +101,11 @@ export interface ShutterData extends DeviceData {
111
101
  percentControl: number
112
102
  }
113
103
 
104
+ export interface OsramFanLightData extends DeviceData {
105
+ fanMode: 'fresh' | 'nature'
106
+ fanSpeed: number
107
+ }
108
+
114
109
  export type ComponentConfig =
115
110
  | { type: DeviceType.LightSource; deviceData: DeviceData }
116
111
  | { type: DeviceType.MixLight; deviceData: MixLightData }
@@ -120,6 +115,8 @@ export type ComponentConfig =
120
115
  | { type: DeviceType.PowerStrip; deviceData: DeviceData}
121
116
  | { type: DeviceType.MoodStrip; deviceData: MoodStripData}
122
117
  | { type: DeviceType.Shutter; deviceData: ShutterData}
118
+ | { type: DeviceType.OsramFanLight; deviceData: OsramFanLightData}
119
+
123
120
  export interface TimeScheduleDetailState {
124
121
  timeSchedule: Timer;
125
122
  dps: Record<string, any>;
@@ -42,6 +42,12 @@ export const defShutterDeviceData = {
42
42
  percentControl: 100
43
43
  };
44
44
 
45
+ export const defOsramFanLightDeviceData = {
46
+ ...defDeviceData,
47
+ fanSpeed: 1,
48
+ fanMode: 'fresh',
49
+ }
50
+
45
51
  export const getTimeSchedule = async (deviceId: string): Promise<Timer[]> => {
46
52
  const res = await NativeApi.getAllTaskTimer(deviceId);
47
53
  if (res.success && Array.isArray(res.data)) {
@@ -10,7 +10,7 @@ import {SwitchButton, TimerPicker, Utils} from 'tuya-panel-kit';
10
10
  import Spacer from '@ledvance/base/src/components/Spacer';
11
11
  import LdvWeekView from '@ledvance/base/src/components/weekSelect';
12
12
  import {convertTo12HourFormat, loopText, showDialog} from '@ledvance/base/src/utils/common';
13
- import {ApplyForItem, ComponentConfig, DeviceType, Timer, TimerActions, TimeScheduleDetailState,} from './Interface';
13
+ import { ComponentConfig, DeviceType, Timer, TimerActions, TimeScheduleDetailState,} from './Interface';
14
14
  import res from '@ledvance/base/src/res';
15
15
  import {useDeviceId, useMoods, useSystemTimeFormate,} from '@ledvance/base/src/models/modules/NativePropsSlice';
16
16
  import {TimeSchedulePageParams} from './TimeSchedulePage';
@@ -26,7 +26,8 @@ import {
26
26
  defMixDeviceData,
27
27
  defMoodStripDeviceData,
28
28
  defStripDeviceData,
29
- defShutterDeviceData
29
+ defShutterDeviceData,
30
+ defOsramFanLightDeviceData
30
31
  } from './TimeScheduleActions';
31
32
  import MoodItem from '../mood/MoodItem';
32
33
  import {getRemoteMoodList} from '../mood/MoodActions';
@@ -35,7 +36,7 @@ import Summary from '@ledvance/base/src/components/Summary'
35
36
  import ThemeType from '@ledvance/base/src/config/themeType'
36
37
  import Tag from "@ledvance/base/src/components/Tag";
37
38
  import DiySceneItem from '@ledvance/base/src/components/DiySceneItem';
38
- import {DiySceneInfo} from "@ledvance/base/src/utils/interface";
39
+ import {ApplyForItem, DiySceneInfo} from "@ledvance/base/src/utils/interface";
39
40
 
40
41
  const { convertX: cx } = Utils.RatioUtils;
41
42
  const { toFixedString } = Utils.NumberUtils;
@@ -688,7 +689,8 @@ const getDefaultManual = (props: TimeScheduleDetailPageParams): ComponentConfig
688
689
  isFanLight: DeviceType.FanLight,
689
690
  isCeilingLight: DeviceType.CeilingLight,
690
691
  isMoodStrip: DeviceType.MoodStrip,
691
- isShutter: DeviceType.Shutter
692
+ isShutter: DeviceType.Shutter,
693
+ isOsramFanLight: DeviceType.OsramFanLight
692
694
  };
693
695
 
694
696
  const deviceType = Object.entries(deviceTypeMap)
@@ -702,9 +704,10 @@ const getDefaultManual = (props: TimeScheduleDetailPageParams): ComponentConfig
702
704
  [DeviceType.FanLight]: defFanLightDeviceData,
703
705
  [DeviceType.MoodStrip]: defMoodStripDeviceData,
704
706
  [DeviceType.Shutter]: defShutterDeviceData,
707
+ [DeviceType.OsramFanLight]: defOsramFanLightDeviceData,
705
708
  [DeviceType.PowerStrip]: defDeviceData,
706
709
  [DeviceType.LightSource]: defDeviceData,
707
- [DeviceType.Plug]: defDeviceData
710
+ [DeviceType.Plug]: defDeviceData,
708
711
  };
709
712
 
710
713
  return {
@@ -14,7 +14,7 @@ import Spacer from '@ledvance/base/src/components/Spacer';
14
14
  import InfoText from '@ledvance/base/src/components/InfoText';
15
15
  import DeleteButton from '@ledvance/base/src/components/DeleteButton';
16
16
  import { useReactive, useUpdateEffect } from 'ahooks';
17
- import { ApplyForItem, DeviceStateType, Timer, TimerActions } from './Interface';
17
+ import { DeviceStateType, Timer, TimerActions } from './Interface';
18
18
  import { getTimeSchedule, manageTimeSchedule } from './TimeScheduleActions';
19
19
  import { useParams } from '@ledvance/base/src/hooks/Hooks';
20
20
  import ScheduleCard from './components/ScheduleCard';
@@ -23,6 +23,7 @@ import Tag from '@ledvance/base/src/components/Tag';
23
23
  import { cloneDeep } from 'lodash';
24
24
  import ThemeType from '@ledvance/base/src/config/themeType'
25
25
  import { showDialog } from '@ledvance/base/src/utils/common';
26
+ import { ApplyForItem } from '@ledvance/base/src/utils/interface';
26
27
 
27
28
  const { convertX: cx } = Utils.RatioUtils;
28
29
  const { withTheme } = Utils.ThemeUtils
@@ -43,6 +44,7 @@ export interface TimeSchedulePageParams {
43
44
  isPowerStrip?: boolean
44
45
  isMoodStrip?: boolean
45
46
  isShutter?: boolean
47
+ isOsramFan?: boolean
46
48
  featureId?: string
47
49
  applyForList: ApplyForItem[];
48
50
  applyForDisabled?: boolean; // 是否可以选择apply for
@@ -5,10 +5,11 @@ import {
5
5
  FanLightData,
6
6
  ManualSettingProps,
7
7
  modeOptions,
8
+ OsramFanLightData,
8
9
  ShutterData,
9
10
  StripLightData
10
11
  } from '../Interface';
11
- import { View } from 'react-native';
12
+ import { View, Text, } from 'react-native';
12
13
  import Card from '@ledvance/base/src/components/Card';
13
14
  import LampAdjustView from '@ledvance/base/src/components/LampAdjustView';
14
15
  import { Utils } from 'tuya-panel-kit';
@@ -26,6 +27,7 @@ import { cctToColor } from '@ledvance/base/src/utils/cctUtils';
26
27
  import { hsv2Hex, mapFloatToRange } from '@ledvance/base/src/utils';
27
28
  import { AdjustType, ApplyForItem } from "@ledvance/base/src/utils/interface";
28
29
  import LdvSlider from '@ledvance/base/src/components/ldvSlider';
30
+ import OsramFanAdjustView from '@ledvance/base/src/components/OsramFanAdjustView'
29
31
 
30
32
  const { convertX: cx } = Utils.RatioUtils;
31
33
  const { withTheme } = Utils.ThemeUtils
@@ -112,7 +114,7 @@ function ManualSettings(props: ManualSettingProps) {
112
114
  state.applyFlag = Symbol()
113
115
  }}
114
116
  />
115
- {item.enable && (item.type !== 'socket' && item.type !== 'fan') && (
117
+ {item.enable && !['socket', 'fan', 'osramFan'].includes(item.type) && (
116
118
  <LampAdjustView
117
119
  isSupportColor={props.isSupportColor}
118
120
  isSupportBrightness={props.isSupportBrightness}
@@ -205,6 +207,30 @@ function ManualSettings(props: ManualSettingProps) {
205
207
  }}
206
208
  />
207
209
  )}
210
+
211
+ {item.enable && item.type === 'osramFan' && (
212
+ <OsramFanAdjustView
213
+ hideFanSwitch={true}
214
+ fanSwitch={item.enable}
215
+ setFanSwitch={() => {}}
216
+ fanSpeed={(state.deviceData as OsramFanLightData).fanSpeed}
217
+ setFanSpeed={(v: number) => {
218
+ state.deviceData = {
219
+ ...state.deviceData,
220
+ fanSpeed: v
221
+ }
222
+ state.manualFlag = Symbol()
223
+ }}
224
+ fanMode={(state.deviceData as OsramFanLightData).fanMode}
225
+ setFanMode={(v: 'fresh' | 'nature') => {
226
+ state.deviceData = {
227
+ ...state.deviceData,
228
+ fanMode: v
229
+ }
230
+ state.manualFlag = Symbol()
231
+ }}
232
+ />
233
+ )}
208
234
  </Card>
209
235
  <Spacer />
210
236
  </View>