@ledvance/group-ui-biz-bundle 1.0.48 → 1.0.49

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/group-ui-biz-bundle",
5
5
  "pid": [],
6
6
  "uiid": "",
7
- "version": "1.0.48",
7
+ "version": "1.0.49",
8
8
  "scripts": {},
9
9
  "dependencies": {
10
10
  "@ledvance/base": "^1.x",
@@ -1,62 +1,129 @@
1
- import { useFeatureHook } from "@ledvance/base/src/models/modules/NativePropsSlice";
2
- import { parseJSON } from "@tuya/tuya-panel-lamp-sdk/lib/utils";
1
+ import { useFeatureHook, useGroupDp, useGroupEzvizConfig, useUAGroupInfo } from "@ledvance/base/src/models/modules/NativePropsSlice";
2
+ import { ColorUtils, nToSH, parseJSON } from "@tuya/tuya-panel-lamp-sdk/lib/utils";
3
3
  import { cloneDeep } from "lodash";
4
- import { FlagItemInfo, FlagUiInfo, defFlagList, def2FlagList, def3FlagList } from "./FlagInfo";
4
+ import { FlagItemInfo, defFlagList, def2FlagList, def3FlagList, FlagUiInfo } from "./FlagInfo";
5
5
  import { NativeApi } from "@ledvance/base/src/api/native";
6
- import { hsv2Hex } from "@ledvance/base/src/utils";
7
6
  import { WorkMode } from "@ledvance/base/src/utils/interface";
8
7
  import { Utils } from '@tuya/tuya-panel-lamp-sdk'
8
+ import { useEffect, useState } from "react";
9
+ import { getGlobalParamsDp } from "@ledvance/base/src/utils/common";
10
+ import { Result } from "@ledvance/base/src/models/modules/Result";
9
11
  const { nToHS, toFixed } = Utils
10
12
 
11
13
  interface LightType {
12
14
  isStringLight?: boolean
13
15
  isStripLight?: boolean
14
16
  isMixLight?: boolean
17
+ isCeilingLight?: boolean
18
+ }
19
+
20
+ interface FlagMode {
21
+ flagMode: boolean
22
+ flagId?: number
15
23
  }
16
24
 
17
25
  interface FlagDataType {
18
- sceneStatus?: {
19
- sceneDataDpCode: string
20
- }
21
- drawToolStatus?: {
22
- drawToolCode: string
23
- drawToolObj2dp: (colors: string[]) => string;
24
- }
25
26
  flag?: FlagItemInfo
26
- workModeDpCode: string
27
- workMode: WorkMode
28
- switchLedDpCode: string
29
27
  }
30
28
 
31
29
  export interface FlagConfigType {
32
- switchLed: boolean
33
- workMode: WorkMode
30
+ switch_led: boolean
31
+ colour_switch: boolean
32
+ white_switch: boolean
33
+ work_mode: WorkMode
34
+ rgbic_work_mode: WorkMode
34
35
  flagSceneConfig?: FlagDataType
36
+ flagMode?: FlagMode
37
+ }
38
+
39
+ export const useFlagMode = () : [FlagMode, (flagMode: FlagMode) => Promise<Result<any>>] =>{
40
+ const uaGroupInfo = useUAGroupInfo()
41
+ const [config, setConfig] = useGroupEzvizConfig<FlagConfigType, FlagMode>('flagMode', undefined)
42
+ const [cloudConfig, setCloudConfig] = useState()
43
+ useEffect(() =>{
44
+ if (!config) {
45
+ getFlagMode(uaGroupInfo.tyGroupId.toString()).then(res =>{
46
+ if (res.success && res.data) {
47
+ setCloudConfig(parseJSON(res.data))
48
+ }
49
+ })
50
+ }
51
+ }, [uaGroupInfo.tyGroupId])
52
+ return [config ?? cloudConfig, setConfig]
35
53
  }
54
+
55
+ export function useWorkMode(): [WorkMode, (value: WorkMode) => Promise<Result<any>>] {
56
+ const [workMode] = useGroupDp<WorkMode>(getGlobalParamsDp('work_mode'))
57
+ const [config, setConfig] = useFeatureHook<FlagConfigType, WorkMode>('work_mode', WorkMode.White);
58
+ return [workMode ?? config, setConfig]
59
+ }
60
+
61
+ export function useRgbicWorkMode(): [WorkMode, (value: WorkMode) => Promise<Result<any>>] {
62
+ const [workMode] = useGroupDp<WorkMode>(getGlobalParamsDp('rgbic_work_mode'))
63
+ const [config, setConfig] = useFeatureHook<FlagConfigType, WorkMode>('rgbic_work_mode', WorkMode.White);
64
+ return [workMode ?? config, setConfig]
65
+ }
66
+
67
+
36
68
  const featureId = 'Flag_data'
37
69
 
38
70
  type UseFlagType = (params: LightType) => [FlagDataType | undefined, (flagData: FlagDataType) => Promise<any>]
39
71
 
40
72
  export const useFlag: UseFlagType = (params) => {
41
73
  return useFeatureHook<FlagConfigType, FlagDataType | undefined>('flagSceneConfig', undefined, undefined, (flagData) =>{
42
- if(flagData){
74
+ if(flagData?.flag){
43
75
  const dps = {}
44
- const { flag, drawToolStatus, sceneStatus, switchLedDpCode, workModeDpCode} = flagData
45
- if(params.isStripLight && drawToolStatus){
46
- dps[drawToolStatus.drawToolCode] = flag ? drawToolStatus.drawToolObj2dp(flag.colors.map(hsv => hsv2Hex(hsv.h, hsv.s, hsv.v))) : ''
47
- dps[workModeDpCode] = WorkMode.Colour
76
+ const { flag } = flagData
77
+ if (!(params.isStringLight || params.isCeilingLight)){
78
+ dps[getGlobalParamsDp('scene_data')] = obj2Dp(flag, params)
48
79
  }else{
49
- if(sceneStatus){
50
- dps[sceneStatus.sceneDataDpCode] = flag ? obj2Dp(flag, {isStringLight: params.isStringLight}) : ''
51
- dps[workModeDpCode] = WorkMode.Scene
80
+ const paintHex = drawToolFormat({
81
+ adjustCode: 3,
82
+ colors: flag.colors.map(f => ColorUtils.hsv2hex(f.h,f.s,f.v)).slice(0, 5),
83
+ daubType: 0,
84
+ effect: 0
85
+ })
86
+ if (getGlobalParamsDp('paint_colour_data')){
87
+ dps[getGlobalParamsDp('paint_colour_data')] = paintHex
88
+ }
89
+ if (getGlobalParamsDp('paint_color')) {
90
+ dps[getGlobalParamsDp('paint_color')] = paintHex
91
+ }
92
+ if (params.isStripLight){
93
+ dps[getGlobalParamsDp('work_mode')] = WorkMode.Colour
52
94
  }
53
95
  }
54
- dps[switchLedDpCode] = true
55
-
96
+ if (params.isCeilingLight){
97
+ dps[getGlobalParamsDp('bright_value')] = flag.whiteColors[0].brightness * 10
98
+ dps[getGlobalParamsDp('temp_value')] = flag.whiteColors[0].colorTemp * 10
99
+ dps[getGlobalParamsDp('white_switch')] = true
100
+ dps[getGlobalParamsDp('colour_switch')] = true
101
+ dps[getGlobalParamsDp('work_mode')] = WorkMode.White
102
+ dps[getGlobalParamsDp('rgbic_work_mode')] = WorkMode.Colour
103
+ }
104
+ dps[getGlobalParamsDp('switch_led')] = true
56
105
  return dps
57
106
  }
58
- }, flagData => ({workMode: (params.isStripLight && flagData?.drawToolStatus) ? WorkMode.Colour : WorkMode.Scene, switch_led: true}))
59
- }
107
+ },
108
+ flagData => {
109
+ if (flagData?.flag){
110
+ const config = {}
111
+ config['work_mode'] = params.isStripLight ? WorkMode.Colour : WorkMode.Scene
112
+ config['switch_led'] = true
113
+ if (params.isCeilingLight){
114
+ config['white_switch'] = true
115
+ config['colour_switch'] = true
116
+ config['work_mode'] = WorkMode.White
117
+ config['rgbic_work_mode'] = WorkMode.Colour
118
+ }
119
+ config['flagMode'] = {
120
+ flagMode: true,
121
+ flagId: flagData.flag.id
122
+ }
123
+ return config
124
+ }
125
+ }
126
+ )}
60
127
 
61
128
  export interface FlagOption {
62
129
  isMixLight?: boolean
@@ -136,8 +203,19 @@ export function obj2Dp(flagItem: FlagItemInfo, option?: FlagOption): string {
136
203
  interface defFlagOption {
137
204
  isDef2?: boolean
138
205
  isDef3?: boolean
206
+ isRefresh?: boolean
139
207
  }
140
208
  export async function getRemoteFlag(devId: string, defFlag?: defFlagOption) {
209
+ if (defFlag?.isRefresh){
210
+ const flags = defFlag?.isDef2 ? def2FlagList : defFlag?.isDef3 ? def3FlagList : defFlagList
211
+ const res = await NativeApi.putJson(devId, featureId, JSON.stringify(flags))
212
+ if (res.success) {
213
+ return {
214
+ success: true,
215
+ data: cloneDeep(flags)
216
+ }
217
+ }
218
+ }
141
219
  const res = await NativeApi.getJson(devId, featureId)
142
220
  const isNormalData = Array.isArray(parseJSON(res?.data))
143
221
  if (res.success && isNormalData) {
@@ -169,7 +247,50 @@ export function getFlagMode(groupId: string){
169
247
  return NativeApi.getJson(groupId, 'flagMode')
170
248
  }
171
249
 
172
- export function saveFlagMode(groupId: string, v:string){
173
- return NativeApi.putJson(groupId, 'flagMode', v)
250
+ export interface PaintData {
251
+ version?: number // 版本
252
+ adjustCode: number // 调节模式 00 白光, 01 彩光, 02 色卡, 03 组合
253
+ daubType?: number // 涂抹动作 00 全选, 01 单选, 02 擦除 白光模式下只有 00
254
+ effect?: number // 调节效果 00 静态, 01 过度, 02 闪烁, 03 呼吸, 04 闪耀
255
+ num?: number
256
+ h?: number
257
+ s?: number
258
+ v?: number
259
+ part?: number
260
+ selected?: string[]
261
+ bright?: number
262
+ temp?: number
263
+ colors?: string[]
264
+ colorDiskActiveKey?: number
265
+ }
266
+
267
+ export function drawToolFormat(data: PaintData) {
268
+ const { version = 0, daubType = 0, effect = 0, num = 6, adjustCode = 1 } = data
269
+ const commonStr = `${nToSH(version)}${nToSH(adjustCode)}${nToSH(effect)}${nToSH(num)}`
270
+ let colorStr = '' // 彩光,色卡
271
+ let whiteStr = '' // 白光模式
272
+ let combinationStr = '' // 组合模式
273
+ if (adjustCode === 0) {
274
+ const whiteData = data
275
+ whiteStr = `${nToSH(daubType)}${nToSH(whiteData.bright!! * 10, 4)}${nToSH(whiteData.temp!! * 10, 4)}`
276
+ } else if (adjustCode === 3) {
277
+ // 组控没有这个模式
278
+ combinationStr = '00' + data?.colors?.reduce((pre, cur) =>{
279
+ const color = ColorUtils.hex2hsv(cur)
280
+ const colorStr = `${nToSH(Math.round(color[0]),4)}${nToSH(Math.round(color[1] * 10),4)}${nToSH(Math.round(color[2] * 10),4)}`
281
+ pre += colorStr
282
+ return pre
283
+ }, '')
284
+ } else {
285
+ const colorData = data
286
+ const selectedStr = colorData?.selected && colorData?.selected.reduce((pre, cur) => {
287
+ pre += nToSH(Number(cur + 1))
288
+ return pre
289
+ }, '')
290
+ const v = adjustCode === 0 ? '' : colorData.selected ? (parseInt('80', 16) + colorData.selected.length).toString(16) + selectedStr : ''
291
+ colorStr = `${nToSH(daubType)}${nToSH(colorData?.h || 0, 4)}${nToSH(colorData?.s!! * 10 || 0, 4)}${nToSH(colorData?.v!! * 10 || 0, 4)}${v}`
292
+ }
293
+ const extraStr = adjustCode === 0 ? whiteStr : adjustCode === 3 ? combinationStr : colorStr
294
+ return commonStr + extraStr
174
295
  }
175
296
 
@@ -1,11 +1,11 @@
1
- import React, { useCallback, useEffect, useMemo } from 'react'
1
+ import React, { useCallback, useMemo } from 'react'
2
2
  import I18n from '@ledvance/base/src/i18n'
3
3
  import { useNavigation, useRoute } from '@react-navigation/native'
4
4
  import Page from '@ledvance/base/src/components/Page'
5
5
  import res from '@ledvance/base/src/res'
6
6
  import { ScrollView, View, FlatList, StyleSheet, Image, TouchableOpacity, Text } from 'react-native'
7
7
  import Spacer from '@ledvance/base/src/components/Spacer'
8
- import { useReactive } from 'ahooks'
8
+ import { useReactive, useUpdateEffect } from 'ahooks'
9
9
  import { Utils } from 'tuya-panel-kit'
10
10
  import TextField from '@ledvance/base/src/components/TextField'
11
11
  import Card from '@ledvance/base/src/components/Card'
@@ -46,15 +46,6 @@ const FlagEditPage = () => {
46
46
  colorPaintBucketSelected: false,
47
47
  loading: false
48
48
  })
49
- useEffect(() => {
50
- }, [])
51
-
52
- const getButtonStatus = () => {
53
- return (params.mode === 'edit' && isEqual(state.mood, params.currentMood)) ||
54
- !(!!state.mood.name) ||
55
- nameRepeat ||
56
- state.mood.name.length > 32
57
- }
58
49
 
59
50
  const getColorBlockColor = useCallback((isMainLight?: boolean) => {
60
51
  if (isMainLight) {
@@ -64,14 +55,30 @@ const FlagEditPage = () => {
64
55
  return hsv2Hex(h, s, v)
65
56
  }, [state.currentNode, state.currentWhiteNode])
66
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
+
67
70
  const nameRepeat = useMemo(() => {
68
71
  return !!find(params.moods, m => (m.id !== state.mood.id && m.name === state.mood.name && state.mood.name !== ''))
69
72
  }, [state.mood.name])
70
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
+
71
78
  return (
72
79
  <Page
73
80
  backText={I18n.getLang('Feature_devicepanel_flags')}
74
- showBackDialog={true}
81
+ showBackDialog={!checkMoodDataChanged}
75
82
  loading={state.loading}
76
83
  backDialogTitle={
77
84
  I18n.getLang(params.mode === 'add' ?
@@ -82,10 +89,9 @@ const FlagEditPage = () => {
82
89
  I18n.getLang('flag_cancelinfo')
83
90
  }
84
91
  headlineText={I18n.getLang(params.mode === 'add' ? 'flag_addanewflag' : 'flag_edittheflag')}
85
- rightButtonIcon={getButtonStatus() ? res.ic_uncheck : res.ic_check}
86
- rightButtonDisabled={getButtonStatus()}
92
+ rightButtonIcon={canSaveMoodData ? res.ic_check : res.ic_uncheck }
87
93
  rightButtonIconClick={async () => {
88
- if (state.loading) return
94
+ if (state.loading || !canSaveMoodData) return
89
95
  state.loading = true
90
96
  const res = await params.modDeleteFlag(params.mode, state.mood)
91
97
  if (res.success) {
@@ -109,7 +115,7 @@ const FlagEditPage = () => {
109
115
  tipColor={nameRepeat ? '#f00' : undefined}
110
116
  tipIcon={nameRepeat ? res.ic_text_field_input_error : undefined}
111
117
  errorText={I18n.getLang(nameRepeat ? 'string_light_pp_field_sm_add_error1' : 'add_new_dynamic_mood_alert_text')} />
112
- {params.moduleParams.isSupportMixScene && <><Card style={styles.adjustCard}>
118
+ {(params.moduleParams.isMixLight || params.moduleParams.isCeilingLight) && <><Card style={styles.adjustCard}>
113
119
  <Spacer height={cx(16)} />
114
120
  <View style={styles.lightLine}>
115
121
  <Text style={styles.light}>
@@ -138,7 +144,9 @@ const FlagEditPage = () => {
138
144
  return item
139
145
  })
140
146
  }}
141
- onBrightnessChange={() => { }}
147
+ onBrightnessChange={(bright) => {
148
+ state.currentWhiteNode.brightness = bright
149
+ }}
142
150
  onBrightnessChangeComplete={(bright) => {
143
151
  state.currentWhiteNode.brightness = bright
144
152
  state.mood.whiteColors = state.mood.whiteColors.map((item, idx) => {
@@ -160,7 +168,7 @@ const FlagEditPage = () => {
160
168
  <Spacer height={cx(16)} />
161
169
  <View style={styles.lightLine}>
162
170
  <Text style={styles.light}>
163
- {I18n.getLang(params.moduleParams.isSupportMixScene ? 'light_sources_tile_sec_lighting_headline' : 'light_sources_tile_tw_lighting_headline')}
171
+ {I18n.getLang((params.moduleParams.isMixLight || params.moduleParams.isCeilingLight) ? 'light_sources_tile_sec_lighting_headline' : 'light_sources_tile_tw_lighting_headline')}
164
172
  </Text>
165
173
  </View>
166
174
  <Spacer height={cx(10)} />