@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 +1 -1
- package/src/modules/flags/FlagActions.ts +151 -30
- package/src/modules/flags/FlagEditPage.tsx +26 -18
- package/src/modules/flags/FlagInfo.tsx +1188 -481
- package/src/modules/flags/FlagPage.tsx +67 -108
package/package.json
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
33
|
-
|
|
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
|
|
45
|
-
if(params.
|
|
46
|
-
dps[
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
},
|
|
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
|
|
173
|
-
|
|
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,
|
|
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={
|
|
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={
|
|
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.
|
|
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.
|
|
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)} />
|