@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
|
@@ -1,115 +1,66 @@
|
|
|
1
|
-
import React, { useEffect
|
|
1
|
+
import React, { useEffect } from "react";
|
|
2
2
|
import Page from "@ledvance/base/src/components/Page";
|
|
3
|
-
import { useDeviceInfo,
|
|
4
|
-
import { FlatList } from "react-native";
|
|
3
|
+
import { useDeviceInfo, useFlags, useGroupDp, useUAGroupInfo } from "@ledvance/base/src/models/modules/NativePropsSlice";
|
|
4
|
+
import { FlatList, TouchableOpacity, View, Image } from "react-native";
|
|
5
5
|
import Spacer from "@ledvance/base/src/components/Spacer";
|
|
6
6
|
import { Utils } from "tuya-panel-kit";
|
|
7
7
|
import FlagItem from "./FlagItem";
|
|
8
8
|
import { FlagUiInfo, def2Pids, def3Pids } from "./FlagInfo";
|
|
9
|
-
import { getRemoteFlag, saveFlag,
|
|
10
|
-
import {
|
|
9
|
+
import { getRemoteFlag, saveFlag, useFlag, useFlagMode, useWorkMode } from "./FlagActions";
|
|
10
|
+
import { useNavigation } from '@react-navigation/core'
|
|
11
11
|
import I18n from "@ledvance/base/src/i18n";
|
|
12
12
|
import { useReactive, useUpdateEffect } from "ahooks";
|
|
13
|
-
import { cloneDeep, difference,
|
|
13
|
+
import { cloneDeep, difference, last, map, range } from "lodash";
|
|
14
14
|
import { ui_biz_routerKey } from "../../navigation/Routers";
|
|
15
15
|
import res from "@ledvance/base/src/res";
|
|
16
16
|
import { hsv2Hex } from "@ledvance/base/src/utils";
|
|
17
17
|
import { SceneNodeTransitionMode } from "@ledvance/group-ui-biz-bundle/src/modules/mood/SceneInfo";
|
|
18
|
-
import { Result } from "@ledvance/base/src/models/modules/Result";
|
|
19
|
-
import { WorkMode } from "@ledvance/base/src/utils/interface";
|
|
20
18
|
import TextField from "@ledvance/base/src/components/TextField";
|
|
19
|
+
import { useParams } from "@ledvance/base/src/hooks/Hooks";
|
|
20
|
+
import { WorkMode } from "@ledvance/base/src/utils/interface";
|
|
21
|
+
import { getGlobalParamsDp, showDialog } from "@ledvance/base/src/utils/common";
|
|
21
22
|
const cx = Utils.RatioUtils.convertX
|
|
22
23
|
|
|
23
24
|
export interface FlagPageProps {
|
|
24
|
-
|
|
25
|
+
isMixLight?: boolean
|
|
25
26
|
isStripLight?: boolean
|
|
26
27
|
isStringLight?: boolean
|
|
28
|
+
isCeilingLight?: boolean
|
|
27
29
|
isSupportTemperature?: boolean
|
|
28
30
|
isSupportBrightness?: boolean
|
|
29
|
-
drawToolLight?: {
|
|
30
|
-
drawToolCode: string
|
|
31
|
-
drawToolObj2dp: (colors: string[]) => string
|
|
32
|
-
}
|
|
33
|
-
getRemoteMoodList?: (groupId: string) => Promise<Result<any>>
|
|
34
|
-
sceneDataCode?: string
|
|
35
|
-
workModeCode: string
|
|
36
|
-
switchLedCode: string
|
|
37
31
|
}
|
|
38
32
|
|
|
39
33
|
const FlagPage = () => {
|
|
40
|
-
const params =
|
|
34
|
+
const params = useParams<FlagPageProps>()
|
|
41
35
|
const devInfo = useDeviceInfo()
|
|
42
36
|
const uaGroupInfo = useUAGroupInfo()
|
|
43
37
|
const navigation = useNavigation()
|
|
44
|
-
const [
|
|
38
|
+
const [switch_led] = useGroupDp<boolean>(getGlobalParamsDp('switch_led'))
|
|
39
|
+
const [, setWorkMode] = useWorkMode()
|
|
45
40
|
const [flags, setFlags] = useFlags()
|
|
46
41
|
const [flagMode, setFlagMode] = useFlagMode()
|
|
47
|
-
const [
|
|
48
|
-
isStripLight: params.isStripLight,
|
|
49
|
-
isStringLight: params.isStringLight,
|
|
50
|
-
isMixLight: params.isSupportMixScene
|
|
51
|
-
})
|
|
42
|
+
const [, setFlag] = useFlag(params)
|
|
52
43
|
const state = useReactive({
|
|
53
|
-
loading:
|
|
44
|
+
loading: false,
|
|
54
45
|
flags: cloneDeep(flags) as FlagUiInfo[],
|
|
55
|
-
moods: params.isStripLight ? [] : cloneDeep(moods),
|
|
56
46
|
searchText: ''
|
|
57
47
|
})
|
|
58
|
-
const defParams = {
|
|
59
|
-
workModeDpCode: params.workModeCode,
|
|
60
|
-
switchLedDpCode: params.switchLedCode,
|
|
61
|
-
workMode: params.isStripLight ? WorkMode.Colour : WorkMode.Scene,
|
|
62
|
-
sceneStatus: !params.isStripLight && params.sceneDataCode ? {
|
|
63
|
-
sceneDataDpCode: params.sceneDataCode
|
|
64
|
-
} : undefined,
|
|
65
|
-
drawToolStatus: params.isStripLight && params.drawToolLight ? {
|
|
66
|
-
drawToolCode: params.drawToolLight.drawToolCode,
|
|
67
|
-
drawToolObj2dp: params.drawToolLight.drawToolObj2dp
|
|
68
|
-
} : undefined
|
|
69
|
-
}
|
|
70
|
-
const flagId = useMemo(() => {
|
|
71
|
-
if (flagState && state.flags?.length) {
|
|
72
|
-
const { flag } = flagState
|
|
73
|
-
if(params.isStripLight && flag?.colors !== undefined){
|
|
74
|
-
if(flagMode?.flagId !== undefined) return flagMode.flagId
|
|
75
|
-
const v = state.flags.find(item => {
|
|
76
|
-
return isEqual(item.colors, flag?.colors)
|
|
77
|
-
})
|
|
78
|
-
return v?.id
|
|
79
|
-
}
|
|
80
|
-
if (flag?.id !== undefined) {
|
|
81
|
-
return flag.id
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return -1
|
|
86
|
-
}, [JSON.stringify(flagState), JSON.stringify(state.flags), flagMode])
|
|
87
48
|
|
|
88
49
|
useEffect(() => {
|
|
89
|
-
|
|
90
|
-
getRemoteFlagInfo().then()
|
|
91
|
-
}
|
|
92
|
-
if (params.getRemoteMoodList && !params.isStripLight && !moods?.length) {
|
|
93
|
-
params.getRemoteMoodList(uaGroupInfo.tyGroupId.toString()).then(res => {
|
|
94
|
-
if (res.success && Array.isArray(res.data)) {
|
|
95
|
-
state.moods = res.data
|
|
96
|
-
setMoods(cloneDeep(res.data))
|
|
97
|
-
}
|
|
98
|
-
})
|
|
99
|
-
}
|
|
50
|
+
getRemoteFlagInfo().then()
|
|
100
51
|
}, [])
|
|
101
52
|
|
|
102
|
-
useUpdateEffect(() =>{
|
|
103
|
-
state.flags = state.searchText !== '' ? cloneDeep(flags).filter(flag => flag.name.includes(state.searchText)) : cloneDeep(flags)
|
|
53
|
+
useUpdateEffect(() => {
|
|
54
|
+
state.flags = state.searchText !== '' ? cloneDeep(flags).filter(flag => (flag.name ?? '').toLowerCase().includes(state.searchText.toLowerCase())) : cloneDeep(flags)
|
|
104
55
|
}, [state.searchText, flags])
|
|
105
56
|
|
|
106
|
-
const getRemoteFlagInfo = async () => {
|
|
57
|
+
const getRemoteFlagInfo = async (isRefresh?: boolean) => {
|
|
107
58
|
const defNum = uaGroupInfo.groupDevices.filter(device => !(def2Pids.includes(device.tyPid) || def3Pids.includes(device.tyPid))).length
|
|
108
59
|
const def2Num = uaGroupInfo.groupDevices.filter(device => def2Pids.includes(device.tyPid)).length
|
|
109
60
|
const def3Num = uaGroupInfo.groupDevices.filter(device => def3Pids.includes(device.tyPid)).length
|
|
110
61
|
const isDef2 = def2Num > def3Num && def2Num > defNum
|
|
111
62
|
const isDef3 = def3Num > def2Num && def3Num > defNum
|
|
112
|
-
const res = await getRemoteFlag(uaGroupInfo.tyGroupId.toString(), {isDef2, isDef3})
|
|
63
|
+
const res = await getRemoteFlag(uaGroupInfo.tyGroupId.toString(), { isDef2, isDef3, isRefresh })
|
|
113
64
|
if (res.success) {
|
|
114
65
|
let cloneFlag: FlagUiInfo[] = cloneDeep(res.data) || []
|
|
115
66
|
state.flags = cloneFlag
|
|
@@ -135,8 +86,8 @@ const FlagPage = () => {
|
|
|
135
86
|
let newScene: FlagUiInfo[] = []
|
|
136
87
|
if (mode === 'add') {
|
|
137
88
|
newScene = [
|
|
138
|
-
checkedMood,
|
|
139
89
|
...state.flags,
|
|
90
|
+
checkedMood,
|
|
140
91
|
]
|
|
141
92
|
} else if (mode === 'del') {
|
|
142
93
|
newScene = state.flags.filter(item => item.id !== checkedMood.id)
|
|
@@ -153,22 +104,21 @@ const FlagPage = () => {
|
|
|
153
104
|
if (res.success) {
|
|
154
105
|
state.flags = cloneDeep(newScene)
|
|
155
106
|
setFlags(cloneDeep(newScene))
|
|
156
|
-
if
|
|
157
|
-
|
|
158
|
-
|
|
107
|
+
if (mood) {
|
|
108
|
+
if (mode === 'del' && (checkedMood.id !== flagMode?.flagId || !flagMode?.flagMode || !switch_led)) {
|
|
109
|
+
return {
|
|
110
|
+
success: true
|
|
111
|
+
}
|
|
159
112
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
return {
|
|
171
|
-
success: true
|
|
113
|
+
return setFlag({ flag: cloneDeep(mood) })
|
|
114
|
+
} else {
|
|
115
|
+
if (flagMode?.flagMode) {
|
|
116
|
+
setWorkMode(params.isCeilingLight ? WorkMode.White : WorkMode.Colour)
|
|
117
|
+
}
|
|
118
|
+
return setFlagMode({
|
|
119
|
+
flagMode: false,
|
|
120
|
+
flagId: undefined
|
|
121
|
+
})
|
|
172
122
|
}
|
|
173
123
|
}
|
|
174
124
|
return {
|
|
@@ -176,16 +126,6 @@ const FlagPage = () => {
|
|
|
176
126
|
}
|
|
177
127
|
}
|
|
178
128
|
|
|
179
|
-
const updateFlagMode = (flagMode: boolean, flag?:FlagUiInfo) =>{
|
|
180
|
-
saveFlagMode(uaGroupInfo.tyGroupId.toString(), JSON.stringify({
|
|
181
|
-
flagMode,
|
|
182
|
-
flagId: flag?.id
|
|
183
|
-
})).then()
|
|
184
|
-
setFlagMode({
|
|
185
|
-
flagMode,
|
|
186
|
-
flagId: flag?.id
|
|
187
|
-
})
|
|
188
|
-
}
|
|
189
129
|
return (
|
|
190
130
|
<Page
|
|
191
131
|
headlineText={I18n.getLang('Feature_devicepanel_flags')}
|
|
@@ -194,7 +134,6 @@ const FlagPage = () => {
|
|
|
194
134
|
onHeadlineIconClick={() => {
|
|
195
135
|
const useIds = map([
|
|
196
136
|
...state.flags,
|
|
197
|
-
...state.moods
|
|
198
137
|
], 'id')
|
|
199
138
|
const idRange = range(0, 256)
|
|
200
139
|
const unuseId = last(difference(idRange, useIds))
|
|
@@ -202,29 +141,49 @@ const FlagPage = () => {
|
|
|
202
141
|
navigationRoute('add', newFlag(unuseId))
|
|
203
142
|
}
|
|
204
143
|
}}
|
|
144
|
+
loading={state.loading}
|
|
205
145
|
>
|
|
206
|
-
<
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
146
|
+
<View style={{flexDirection: 'row', display: 'flex', alignItems: 'center'}}>
|
|
147
|
+
<TextField
|
|
148
|
+
value={state.searchText}
|
|
149
|
+
onChangeText={text => {
|
|
150
|
+
state.searchText = text
|
|
151
|
+
}}
|
|
152
|
+
placeholder={I18n.getLang('country_selection_textfield_headline_search')}
|
|
153
|
+
style={{ marginHorizontal: cx(24), flex: 1 }}
|
|
154
|
+
/>
|
|
155
|
+
<TouchableOpacity style={{paddingRight: cx(24)}}
|
|
156
|
+
onPress={() =>{
|
|
157
|
+
showDialog({
|
|
158
|
+
method: 'confirm',
|
|
159
|
+
title: I18n.getLang('flag_resetbutton'),
|
|
160
|
+
subTitle: I18n.getLang('flag_resetdescription'),
|
|
161
|
+
onConfirm: async (_, {close}) =>{
|
|
162
|
+
close()
|
|
163
|
+
state.loading = true
|
|
164
|
+
await getRemoteFlagInfo(true)
|
|
165
|
+
state.loading = false
|
|
166
|
+
}
|
|
167
|
+
})
|
|
168
|
+
}}
|
|
169
|
+
>
|
|
170
|
+
<Image source={res.ic_refresh} style={{width: cx(24), height: cx(24)}}/>
|
|
171
|
+
</TouchableOpacity>
|
|
172
|
+
</View>
|
|
214
173
|
<FlatList
|
|
215
174
|
data={state.flags}
|
|
216
175
|
renderItem={({ item }) => <FlagItem
|
|
217
|
-
enable={
|
|
176
|
+
enable={flagMode?.flagId === item.id && flagMode?.flagMode && switch_led}
|
|
218
177
|
title={item.name}
|
|
219
178
|
icon={item.icon}
|
|
220
179
|
colors={item.colors.map(item => hsv2Hex(item.h, item.s, item.v)).reverse()}
|
|
221
180
|
onSwitch={async (enable) => {
|
|
222
181
|
if (enable) {
|
|
182
|
+
state.loading = true
|
|
223
183
|
await setFlag({
|
|
224
|
-
...defParams,
|
|
225
184
|
flag: cloneDeep(item),
|
|
226
185
|
})
|
|
227
|
-
|
|
186
|
+
state.loading = false
|
|
228
187
|
}
|
|
229
188
|
}}
|
|
230
189
|
onPress={() => {
|