@ledvance/group-ui-biz-bundle 1.0.39 → 1.0.41
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/fixedTimeForPlug/FixedTimeForPlugActon.ts +114 -0
- package/src/modules/fixedTimeForPlug/FixedTimeForPlugDetailPage.tsx +350 -0
- package/src/modules/fixedTimeForPlug/FixedTimeForPlugPage.tsx +194 -0
- package/src/modules/fixedTimeForPlug/ItemCard.tsx +71 -0
- package/src/modules/fixedTimeForPlug/Summary.tsx +123 -0
- package/src/modules/fixedTimingForLight/FixedTimingForLightAction.ts +45 -0
- package/src/modules/fixedTimingForLight/FixedTimingForLightDetailPage.tsx +426 -0
- package/src/modules/fixedTimingForLight/FixedTimingForLightPage.tsx +192 -0
- package/src/modules/fixedTimingForLight/ItemCard.tsx +71 -0
- package/src/modules/fixedTimingForLight/Summary.tsx +123 -0
- package/src/modules/mood/MoodPage.tsx +33 -15
- package/src/modules/mood/SceneAction.ts +22 -3
- package/src/modules/music/MusicActions.ts +0 -3
- package/src/modules/music/MusicPage.tsx +8 -12
- package/src/navigation/Routers.ts +47 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import Page from "@ledvance/base/src/components/Page";
|
|
2
|
+
import {useDeviceInfo} from "@ledvance/base/src/models/modules/NativePropsSlice";
|
|
3
|
+
import {useNavigation, useRoute} from '@react-navigation/native'
|
|
4
|
+
import I18n from "@ledvance/base/src/i18n/index";
|
|
5
|
+
import res from "@ledvance/base/src/res/index";
|
|
6
|
+
import {useReactive} from "ahooks";
|
|
7
|
+
import React, {useCallback, useMemo} from "react";
|
|
8
|
+
import {FlatList, Image, ScrollView, StyleSheet, Text, TouchableOpacity, View} from "react-native";
|
|
9
|
+
import {Utils} from "tuya-panel-kit";
|
|
10
|
+
import {ui_biz_routerKey} from "../../navigation/Routers";
|
|
11
|
+
import {FixedTimingItem, FixedTimingParam, useFixedTiming} from "./FixedTimingForLightAction";
|
|
12
|
+
import Spacer from "@ledvance/base/src/components/Spacer";
|
|
13
|
+
import ItemCard from "./ItemCard";
|
|
14
|
+
import {cloneDeep} from "lodash";
|
|
15
|
+
|
|
16
|
+
const {convertX: cx, topBarHeight} = Utils.RatioUtils;
|
|
17
|
+
const MAX_NUM = 16
|
|
18
|
+
|
|
19
|
+
const FixedTimeForLightPage = () => {
|
|
20
|
+
const devInfo = useDeviceInfo()
|
|
21
|
+
const navigation = useNavigation()
|
|
22
|
+
const params = useRoute().params as FixedTimingParam
|
|
23
|
+
const [fixedTimingList, setFixedTimingList] = useFixedTiming()
|
|
24
|
+
const state = useReactive({
|
|
25
|
+
loading: false
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
const isMaxNum = useMemo(() => {
|
|
29
|
+
return fixedTimingList.length >= MAX_NUM
|
|
30
|
+
}, [fixedTimingList])
|
|
31
|
+
|
|
32
|
+
const onAddOrEditItem = (mode: 'add' | 'edit', item?: FixedTimingItem) => {
|
|
33
|
+
const path = ui_biz_routerKey.group_ui_biz_fixed_timing_light_detail
|
|
34
|
+
navigation.navigate(path, {
|
|
35
|
+
...params,
|
|
36
|
+
mode,
|
|
37
|
+
item,
|
|
38
|
+
onPost
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const onPost = useCallback(async (mode: 'add' | 'edit' | 'del', fixedTiming: FixedTimingItem, goBack?: boolean) => {
|
|
43
|
+
state.loading = true
|
|
44
|
+
const cloneFixedTimingList = cloneDeep(fixedTimingList)
|
|
45
|
+
const idx = fixedTimingList.findIndex(it => it.index === fixedTiming.index)
|
|
46
|
+
if (mode === 'edit') {
|
|
47
|
+
cloneFixedTimingList.splice(idx, 1, fixedTiming)
|
|
48
|
+
}
|
|
49
|
+
if (mode === 'del') cloneFixedTimingList.splice(idx, 1)
|
|
50
|
+
const newFixedTimingList = mode === 'add' ? [...fixedTimingList, {
|
|
51
|
+
...fixedTiming,
|
|
52
|
+
index: fixedTimingList.length
|
|
53
|
+
}] : cloneFixedTimingList
|
|
54
|
+
const res = await setFixedTimingList(newFixedTimingList)
|
|
55
|
+
state.loading = false
|
|
56
|
+
if (res.success && goBack) {
|
|
57
|
+
navigation.goBack()
|
|
58
|
+
}
|
|
59
|
+
}, [fixedTimingList])
|
|
60
|
+
|
|
61
|
+
const renderList = () => {
|
|
62
|
+
return (
|
|
63
|
+
<ScrollView nestedScrollEnabled={true}>
|
|
64
|
+
<Text style={{
|
|
65
|
+
color: '#000',
|
|
66
|
+
marginLeft: cx(24),
|
|
67
|
+
}}>{I18n.getLang('timeschedule_overview_description_text')}</Text>
|
|
68
|
+
<Spacer height={cx(10)}/>
|
|
69
|
+
{isMaxNum && <View style={{marginHorizontal: cx(24), flexDirection: 'row'}}>
|
|
70
|
+
<Image style={{width: cx(16), height: cx(16), tintColor: '#ff9500'}} source={res.ic_warning_amber}/>
|
|
71
|
+
<Text>{I18n.getLang('fixedtimecycle_warning_max_number_text')}</Text>
|
|
72
|
+
</View>}
|
|
73
|
+
<FlatList
|
|
74
|
+
data={fixedTimingList}
|
|
75
|
+
renderItem={({item}) => (
|
|
76
|
+
<ItemCard
|
|
77
|
+
item={item}
|
|
78
|
+
is24Hour={params.is24Hour}
|
|
79
|
+
onSwitch={async (v) => {
|
|
80
|
+
await onPost('edit', {
|
|
81
|
+
...item,
|
|
82
|
+
power: v,
|
|
83
|
+
})
|
|
84
|
+
}}
|
|
85
|
+
onPress={() => {
|
|
86
|
+
onAddOrEditItem('edit', item)
|
|
87
|
+
}}
|
|
88
|
+
/>
|
|
89
|
+
)}
|
|
90
|
+
keyExtractor={(item: any) => `${item?.index}`}
|
|
91
|
+
ItemSeparatorComponent={() => <Spacer/>}
|
|
92
|
+
ListHeaderComponent={<Spacer height={cx(10)}/>}
|
|
93
|
+
ListFooterComponent={<Spacer/>}
|
|
94
|
+
/>
|
|
95
|
+
</ScrollView>
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
const renderEmpty = () => {
|
|
99
|
+
return (
|
|
100
|
+
<View style={styles.emptyListCon}>
|
|
101
|
+
<Image
|
|
102
|
+
style={styles.emptyImage}
|
|
103
|
+
source={{uri: res.ldv_timer_empty}}
|
|
104
|
+
resizeMode="contain"/>
|
|
105
|
+
<View
|
|
106
|
+
style={{
|
|
107
|
+
marginHorizontal: cx(24),
|
|
108
|
+
marginTop: cx(30),
|
|
109
|
+
flexDirection: 'row',
|
|
110
|
+
alignItems: 'center',
|
|
111
|
+
}}
|
|
112
|
+
>
|
|
113
|
+
<Image
|
|
114
|
+
source={{uri: res.device_panel_schedule_alert}}
|
|
115
|
+
style={{width: cx(16), height: cx(16)}}
|
|
116
|
+
/>
|
|
117
|
+
<Text style={styles.emptyNoTime}>{I18n.getLang('fixedTimeCycle_information_text')}</Text>
|
|
118
|
+
</View>
|
|
119
|
+
<View
|
|
120
|
+
style={{
|
|
121
|
+
height: cx(36),
|
|
122
|
+
width: cx(150),
|
|
123
|
+
marginVertical: cx(25),
|
|
124
|
+
marginHorizontal: cx(24),
|
|
125
|
+
borderRadius: cx(6),
|
|
126
|
+
backgroundColor: '#f60',
|
|
127
|
+
}}
|
|
128
|
+
>
|
|
129
|
+
<TouchableOpacity
|
|
130
|
+
style={{
|
|
131
|
+
flex: 1,
|
|
132
|
+
justifyContent: 'center',
|
|
133
|
+
alignItems: 'center',
|
|
134
|
+
}}
|
|
135
|
+
onPress={() => onAddOrEditItem('add')}
|
|
136
|
+
>
|
|
137
|
+
<Text style={{fontSize: cx(12), fontWeight: 'bold', color: '#fff', textAlign: 'center'}}>
|
|
138
|
+
{I18n.getLang('fixedTimeCycle_bttn_text')}
|
|
139
|
+
</Text>
|
|
140
|
+
</TouchableOpacity>
|
|
141
|
+
</View>
|
|
142
|
+
</View>
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
return (
|
|
146
|
+
<Page
|
|
147
|
+
backText={devInfo.name}
|
|
148
|
+
headlineText={I18n.getLang('fixedTimeCycle_socket_headline')}
|
|
149
|
+
headlineIcon={!isMaxNum && res.device_panel_schedule_add || undefined}
|
|
150
|
+
onHeadlineIconClick={() => onAddOrEditItem('add')}
|
|
151
|
+
loading={state.loading}
|
|
152
|
+
>
|
|
153
|
+
{fixedTimingList.length > 0 ? renderList() : renderEmpty()}
|
|
154
|
+
</Page>
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const styles = StyleSheet.create({
|
|
159
|
+
bg: {
|
|
160
|
+
marginTop: topBarHeight,
|
|
161
|
+
flex: 1,
|
|
162
|
+
},
|
|
163
|
+
emptyListCon: {
|
|
164
|
+
justifyContent: 'center',
|
|
165
|
+
alignItems: 'center',
|
|
166
|
+
marginTop: cx(30),
|
|
167
|
+
},
|
|
168
|
+
emptyImage: {
|
|
169
|
+
width: cx(225),
|
|
170
|
+
height: cx(198)
|
|
171
|
+
},
|
|
172
|
+
emptyNoTime: {
|
|
173
|
+
fontSize: cx(12),
|
|
174
|
+
color: '#000'
|
|
175
|
+
},
|
|
176
|
+
emptyTimeTip: {
|
|
177
|
+
fontSize: cx(12),
|
|
178
|
+
lineHeight: cx(17),
|
|
179
|
+
marginTop: cx(6),
|
|
180
|
+
width: '76%',
|
|
181
|
+
textAlign: 'center'
|
|
182
|
+
},
|
|
183
|
+
listContainer: {
|
|
184
|
+
bottom: cx(74)
|
|
185
|
+
},
|
|
186
|
+
categoryList: {
|
|
187
|
+
marginHorizontal: cx(24),
|
|
188
|
+
marginBottom: cx(12),
|
|
189
|
+
},
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
export default FixedTimeForLightPage
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import Card from "@ledvance/base/src/components/Card";
|
|
3
|
+
import Spacer from "@ledvance/base/src/components/Spacer";
|
|
4
|
+
import {StyleSheet, Text, View} from "react-native";
|
|
5
|
+
import {SwitchButton, Utils} from "tuya-panel-kit";
|
|
6
|
+
import {loopText} from "@ledvance/base/src/utils/common";
|
|
7
|
+
import {parseHour12} from "@tuya/tuya-panel-lamp-sdk/lib/utils";
|
|
8
|
+
import {FixedTimingItem} from "./FixedTimingForLightAction";
|
|
9
|
+
|
|
10
|
+
const {convertX: cx} = Utils.RatioUtils
|
|
11
|
+
const {parseTimer} = Utils.TimeUtils
|
|
12
|
+
|
|
13
|
+
export interface ItemCardProps {
|
|
14
|
+
item: FixedTimingItem,
|
|
15
|
+
is24Hour?: boolean,
|
|
16
|
+
onSwitch: (enable: boolean) => void
|
|
17
|
+
onPress: () => void
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const ItemCard = (props: ItemCardProps) => {
|
|
21
|
+
const {item, is24Hour, onSwitch, onPress} = props
|
|
22
|
+
return (
|
|
23
|
+
<Card style={styles.itemCard} onPress={onPress}>
|
|
24
|
+
<Spacer height={cx(16)}/>
|
|
25
|
+
<View style={styles.switchLine}>
|
|
26
|
+
<Text style={styles.time}>
|
|
27
|
+
{is24Hour ?
|
|
28
|
+
`${parseTimer(item.startTime * 60)} - ${parseTimer(item.endTime * 60)}`
|
|
29
|
+
:
|
|
30
|
+
`${parseHour12(item.startTime * 60)} - ${parseHour12(item.endTime * 60)}`
|
|
31
|
+
}
|
|
32
|
+
</Text>
|
|
33
|
+
<SwitchButton
|
|
34
|
+
style={styles.switchBtn}
|
|
35
|
+
value={item.power}
|
|
36
|
+
thumbStyle={{elevation: 0}}
|
|
37
|
+
onValueChange={onSwitch}/>
|
|
38
|
+
</View>
|
|
39
|
+
<Text style={styles.loopText}>{loopText(item.weeks, parseTimer(item.startTime * 60))}</Text>
|
|
40
|
+
<Spacer height={cx(5)}/>
|
|
41
|
+
<Text style={styles.loopText}>{item.name}</Text>
|
|
42
|
+
<Spacer/>
|
|
43
|
+
</Card>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const styles = StyleSheet.create({
|
|
48
|
+
itemCard: {
|
|
49
|
+
marginHorizontal: cx(24),
|
|
50
|
+
paddingHorizontal: cx(16),
|
|
51
|
+
},
|
|
52
|
+
switchLine: {
|
|
53
|
+
flexDirection: 'row',
|
|
54
|
+
alignItems: 'center',
|
|
55
|
+
},
|
|
56
|
+
time: {
|
|
57
|
+
flex: 1,
|
|
58
|
+
color: '#000',
|
|
59
|
+
fontSize: cx(16),
|
|
60
|
+
fontWeight: 'bold',
|
|
61
|
+
fontFamily: 'helvetica_neue_lt_std_bd',
|
|
62
|
+
},
|
|
63
|
+
switchBtn: {},
|
|
64
|
+
loopText: {
|
|
65
|
+
color: '#000',
|
|
66
|
+
fontSize: cx(14),
|
|
67
|
+
fontFamily: 'helvetica_neue_lt_std_roman',
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
export default ItemCard
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import React, { ReactElement, memo } from "react";
|
|
2
|
+
import { Text, Image, ViewStyle, View, StyleSheet } from 'react-native'
|
|
3
|
+
import res from "@ledvance/base/src/res"
|
|
4
|
+
import I18n from "@ledvance/base/src/i18n";
|
|
5
|
+
import { Utils } from "tuya-panel-kit";
|
|
6
|
+
import Spacer from "@ledvance/base/src/components/Spacer";
|
|
7
|
+
|
|
8
|
+
const { convertX: cx } = Utils.RatioUtils;
|
|
9
|
+
|
|
10
|
+
interface SummaryProps {
|
|
11
|
+
style?: ViewStyle
|
|
12
|
+
frequency?: string | ReactElement
|
|
13
|
+
time?: string | ReactElement
|
|
14
|
+
actions?: ReactElement
|
|
15
|
+
hideActions?: boolean
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const Summary = (props: SummaryProps) => {
|
|
19
|
+
return (
|
|
20
|
+
<View style={styles.cardContainer}>
|
|
21
|
+
<Text style={styles.itemTitle}>{I18n.getLang('add_randomtimecycle_subheadline_text')}</Text>
|
|
22
|
+
<Spacer height={cx(10)} />
|
|
23
|
+
<View style={{}}>
|
|
24
|
+
<View style={styles.summaryContainer}>
|
|
25
|
+
<View style={styles.summaryLeft}>
|
|
26
|
+
<Image
|
|
27
|
+
source={res.summary_icon1}
|
|
28
|
+
resizeMode="contain"
|
|
29
|
+
style={styles.summaryImg}
|
|
30
|
+
/>
|
|
31
|
+
<View>
|
|
32
|
+
<Text style={styles.leftTitle}>{I18n.getLang('feature_summary_frequency_headline')}</Text>
|
|
33
|
+
</View>
|
|
34
|
+
</View>
|
|
35
|
+
<View style={styles.summaryRight}>
|
|
36
|
+
<View style={styles.rightWrap}>
|
|
37
|
+
<Text style={styles.rightItem}>{props.frequency}</Text>
|
|
38
|
+
</View>
|
|
39
|
+
</View>
|
|
40
|
+
</View>
|
|
41
|
+
<View style={styles.summaryContainer}>
|
|
42
|
+
<View style={styles.summaryLeft}>
|
|
43
|
+
<Image
|
|
44
|
+
source={res.summary_icon2}
|
|
45
|
+
resizeMode="contain"
|
|
46
|
+
style={styles.summaryImg}
|
|
47
|
+
/>
|
|
48
|
+
<View>
|
|
49
|
+
<Text style={styles.leftTitle}>{I18n.getLang('feature_summary_time_headline')}</Text>
|
|
50
|
+
</View>
|
|
51
|
+
</View>
|
|
52
|
+
<View style={styles.summaryRight}>
|
|
53
|
+
<View style={styles.rightWrap}>
|
|
54
|
+
<Text style={styles.rightItem}>{props.time}</Text>
|
|
55
|
+
</View>
|
|
56
|
+
</View>
|
|
57
|
+
</View>
|
|
58
|
+
{!props.hideActions && <View style={[styles.summaryContainer, { alignItems: 'flex-start' }]}>
|
|
59
|
+
<View style={styles.summaryLeft}>
|
|
60
|
+
<Image
|
|
61
|
+
source={res.summary_icon3}
|
|
62
|
+
resizeMode="contain"
|
|
63
|
+
style={styles.summaryImg}
|
|
64
|
+
/>
|
|
65
|
+
<View>
|
|
66
|
+
<Text style={styles.leftTitle}>{I18n.getLang('motion_detection_add_time_schedule_actions_text1')}</Text>
|
|
67
|
+
</View>
|
|
68
|
+
</View>
|
|
69
|
+
<View style={styles.summaryRight}>
|
|
70
|
+
{props.actions}
|
|
71
|
+
</View>
|
|
72
|
+
</View>}
|
|
73
|
+
</View>
|
|
74
|
+
</View>
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const styles = StyleSheet.create({
|
|
79
|
+
cardContainer: {
|
|
80
|
+
marginHorizontal: cx(24),
|
|
81
|
+
},
|
|
82
|
+
itemTitle: {
|
|
83
|
+
color: '#000',
|
|
84
|
+
fontSize: cx(16),
|
|
85
|
+
fontWeight: 'bold',
|
|
86
|
+
fontFamily: 'helvetica_neue_lt_std_bd',
|
|
87
|
+
},
|
|
88
|
+
summaryContainer: {
|
|
89
|
+
flex: 1,
|
|
90
|
+
flexDirection: 'row',
|
|
91
|
+
marginBottom: cx(10),
|
|
92
|
+
},
|
|
93
|
+
summaryLeft: {
|
|
94
|
+
flexDirection: 'row',
|
|
95
|
+
alignItems: 'center',
|
|
96
|
+
minWidth: cx(100)
|
|
97
|
+
},
|
|
98
|
+
summaryImg: {
|
|
99
|
+
width: cx(12),
|
|
100
|
+
height: cx(12),
|
|
101
|
+
marginRight: cx(6)
|
|
102
|
+
},
|
|
103
|
+
leftTitle: {
|
|
104
|
+
fontSize: cx(14),
|
|
105
|
+
color: '#000'
|
|
106
|
+
},
|
|
107
|
+
summaryRight: {
|
|
108
|
+
flex: 1,
|
|
109
|
+
flexDirection: 'column',
|
|
110
|
+
marginLeft: cx(15),
|
|
111
|
+
},
|
|
112
|
+
rightWrap: {
|
|
113
|
+
borderRadius: cx(16),
|
|
114
|
+
paddingHorizontal: cx(12),
|
|
115
|
+
alignSelf: 'flex-start',
|
|
116
|
+
backgroundColor: '#cbcbcb',
|
|
117
|
+
},
|
|
118
|
+
rightItem: {
|
|
119
|
+
color: '#000',
|
|
120
|
+
},
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
export default memo(Summary)
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, {useCallback, useEffect, useMemo} from 'react'
|
|
2
2
|
import Page from '@ledvance/base/src/components/Page'
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import {Utils} from 'tuya-panel-kit'
|
|
4
|
+
import {SceneMode, ScenePageUIState, SceneUIState, StripSceneUIState} from './SceneInfo'
|
|
5
|
+
import {getRemoteSceneList, saveScene, useGroupDpScene, useScene, useSwitchLed, useWorkMode} from './SceneAction'
|
|
6
|
+
import {WorkMode} from '@ledvance/base/src/utils/interface'
|
|
7
|
+
import {useDeviceInfo, useFlagMode, useMoods, useUAGroupInfo} from '@ledvance/base/src/models/modules/NativePropsSlice'
|
|
8
|
+
import {useReactive} from 'ahooks'
|
|
9
9
|
import Strings from '@ledvance/base/src/i18n'
|
|
10
10
|
import res from '@ledvance/base/src/res'
|
|
11
|
-
import {
|
|
11
|
+
import {FlatList, Platform, StyleSheet, View} from 'react-native'
|
|
12
12
|
import Tag from '@ledvance/base/src/components/Tag'
|
|
13
13
|
import Spacer from '@ledvance/base/src/components/Spacer'
|
|
14
14
|
import InfoText from '@ledvance/base/src/components/InfoText'
|
|
15
15
|
import CustomListDialog from '@ledvance/base/src/components/CustomListDialog'
|
|
16
16
|
import MoodItem from './MoodItem'
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
17
|
+
import {useNavigation, useRoute} from '@react-navigation/core'
|
|
18
|
+
import {cloneDeep} from 'lodash'
|
|
19
|
+
import {ui_biz_routerKey} from '../../navigation/Routers'
|
|
20
|
+
import {saveFlagMode} from '../flags/FlagActions'
|
|
21
21
|
|
|
22
22
|
const cx = Utils.RatioUtils.convertX
|
|
23
23
|
|
|
@@ -27,7 +27,8 @@ interface MoodPageUIState extends ScenePageUIState {
|
|
|
27
27
|
showAddMoodPopover: boolean
|
|
28
28
|
originScene: SceneUIState[] | StripSceneUIState[]
|
|
29
29
|
filteredMoods: SceneUIState[] | StripSceneUIState[]
|
|
30
|
-
loading: boolean
|
|
30
|
+
loading: boolean,
|
|
31
|
+
workMode: WorkMode
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
export interface MoodPageProps {
|
|
@@ -54,6 +55,13 @@ const MoodPage = () => {
|
|
|
54
55
|
const deviceInfo = useDeviceInfo()
|
|
55
56
|
const uaGroupInfo = useUAGroupInfo()
|
|
56
57
|
const navigation = useNavigation()
|
|
58
|
+
const groupDpScene = useGroupDpScene({
|
|
59
|
+
isStringLight: params.isStringLight,
|
|
60
|
+
isStripLight: params.isStripLight,
|
|
61
|
+
isSupportFan: params.isSupportFan,
|
|
62
|
+
isSupportUVC: params.isSupportUVC,
|
|
63
|
+
sceneDataDpCode: params.sceneDataDpCode
|
|
64
|
+
})
|
|
57
65
|
const [scene, setScene] = useScene({
|
|
58
66
|
isStringLight: params.isStringLight,
|
|
59
67
|
isStripLight: params.isStripLight,
|
|
@@ -62,7 +70,7 @@ const MoodPage = () => {
|
|
|
62
70
|
})
|
|
63
71
|
const [moods, setMoods] = useMoods()
|
|
64
72
|
const [workMode] = useWorkMode()
|
|
65
|
-
const [switchLed] = useSwitchLed()
|
|
73
|
+
const [switchLed] = useSwitchLed(params.switchLedDpCode)
|
|
66
74
|
const [flagMode, setFlagMode] = useFlagMode()
|
|
67
75
|
const state = useReactive<MoodPageUIState>({
|
|
68
76
|
currentScene: undefined,
|
|
@@ -74,8 +82,13 @@ const MoodPage = () => {
|
|
|
74
82
|
originScene: [],
|
|
75
83
|
filteredMoods: [],
|
|
76
84
|
loading: false,
|
|
85
|
+
workMode: workMode
|
|
77
86
|
})
|
|
78
87
|
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
state.workMode = workMode
|
|
90
|
+
}, [workMode]);
|
|
91
|
+
|
|
79
92
|
useEffect(() => {
|
|
80
93
|
if (!(moods && moods.length)) {
|
|
81
94
|
getRemoteSceneList(uaGroupInfo.tyGroupId.toString(), {
|
|
@@ -235,6 +248,11 @@ const MoodPage = () => {
|
|
|
235
248
|
params.isStringLight ? SceneMode.StringGradient : params.isStripLight ? SceneMode.StripGradient : SceneMode.SourceGradient
|
|
236
249
|
), [params.isStringLight, params.isStripLight, SceneMode])
|
|
237
250
|
|
|
251
|
+
const itemEnable = useCallback((item: SceneUIState) => {
|
|
252
|
+
const sceneId = groupDpScene?.id ?? scene?.scene?.id
|
|
253
|
+
return switchLed && state.workMode === WorkMode.Scene && sceneId === item.id && !flagMode?.flagMode;
|
|
254
|
+
}, [switchLed, state.workMode, groupDpScene, scene, flagMode?.flagMode])
|
|
255
|
+
|
|
238
256
|
return (
|
|
239
257
|
<>
|
|
240
258
|
<Page
|
|
@@ -282,7 +300,7 @@ const MoodPage = () => {
|
|
|
282
300
|
renderItem={({ item }) => {
|
|
283
301
|
return (
|
|
284
302
|
<MoodItem
|
|
285
|
-
enable={
|
|
303
|
+
enable={itemEnable(item)}
|
|
286
304
|
mood={item}
|
|
287
305
|
onPress={() => {
|
|
288
306
|
navigationRoute(item.nodes.length === 1, 'edit', item)
|
|
@@ -19,15 +19,19 @@ import res from '@ledvance/base/src/res'
|
|
|
19
19
|
import {Utils} from '@tuya/tuya-panel-lamp-sdk'
|
|
20
20
|
import {parseJSON} from '@tuya/tuya-panel-lamp-sdk/lib/utils'
|
|
21
21
|
import {WorkMode} from "@ledvance/base/src/utils/interface"
|
|
22
|
+
import {useGroupDp} from "@ledvance/base/src/models/modules/NativePropsSlice";
|
|
23
|
+
import {GlobalParams} from "@ledvance/base/src/models/GlobalParams";
|
|
22
24
|
|
|
23
25
|
const { nToHS, toFixed, sToN } = Utils
|
|
24
26
|
|
|
25
27
|
export function useWorkMode(): [WorkMode, (value: WorkMode) => Promise<Result<any>>] {
|
|
26
|
-
|
|
28
|
+
const [workMode] = useGroupDp<WorkMode>(getGlobalParamsDp('work_mode'))
|
|
29
|
+
const [config, setConfig] = useFeatureHook<SceneDataConfigType, WorkMode>('workMode', WorkMode.White);
|
|
30
|
+
return [workMode ?? config, setConfig]
|
|
27
31
|
}
|
|
28
32
|
|
|
29
|
-
export function useSwitchLed(): [boolean
|
|
30
|
-
return
|
|
33
|
+
export function useSwitchLed(dpCode: string): [boolean] {
|
|
34
|
+
return useGroupDp<boolean>(dpCode)
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
interface SceneDataType {
|
|
@@ -49,6 +53,20 @@ interface LightType {
|
|
|
49
53
|
isStripLight?: boolean
|
|
50
54
|
isSupportFan?: boolean
|
|
51
55
|
isSupportUVC?: boolean
|
|
56
|
+
sceneDataDpCode?: string
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function getGlobalParamsDp(key: string) {
|
|
60
|
+
return GlobalParams.dpSchemaMap[key] && GlobalParams.dpSchemaMap[key].dp.toString()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function useGroupDpScene(params: LightType) {
|
|
64
|
+
const [sceneData] = useGroupDp<string>(params.sceneDataDpCode || getGlobalParamsDp('scene_data'))
|
|
65
|
+
if (sceneData) {
|
|
66
|
+
const isFantasy = params.isStringLight || params.isStripLight;
|
|
67
|
+
return isFantasy ? stripDp2Obj(sceneData, params.isStringLight) : dp2Obj(sceneData, params.isSupportFan, params.isSupportUVC)
|
|
68
|
+
}
|
|
69
|
+
return undefined
|
|
52
70
|
}
|
|
53
71
|
|
|
54
72
|
export function useScene(params: LightType): [SceneDataType | undefined, (scene?: SceneDataType) => Promise<Result<any>>] {
|
|
@@ -304,6 +322,7 @@ export function saveScene(
|
|
|
304
322
|
) {
|
|
305
323
|
console.log(scenes, '< --- save new Scenes')
|
|
306
324
|
const isFantasy = sceneParams.isStringLight || sceneParams.isStripLight
|
|
325
|
+
// @ts-ignore
|
|
307
326
|
const newScenes = scenes.map(s => {
|
|
308
327
|
return {
|
|
309
328
|
n: s.name,
|
|
@@ -2,10 +2,10 @@ import React from 'react'
|
|
|
2
2
|
import { StyleSheet, View, Text, Image } from 'react-native'
|
|
3
3
|
import { useNavigation } from '@react-navigation/core'
|
|
4
4
|
import Page from '@ledvance/base/src/components/Page'
|
|
5
|
-
import { useDeviceInfo, useGroupConfig } from '@ledvance/base/src/models/modules/NativePropsSlice'
|
|
5
|
+
import { useDeviceInfo, useGroupConfig, putGroupTYDps, useUAGroupInfo } from '@ledvance/base/src/models/modules/NativePropsSlice'
|
|
6
6
|
import I18n from '@ledvance/base/src/i18n'
|
|
7
7
|
import Img from './res'
|
|
8
|
-
import { useDreamMusicData
|
|
8
|
+
import { useDreamMusicData } from './MusicActions'
|
|
9
9
|
import { useReactive, useUpdateEffect } from 'ahooks'
|
|
10
10
|
import { musicTabs } from './MusicDataBean'
|
|
11
11
|
import { SwitchButton, TabBar, Utils } from 'tuya-panel-kit'
|
|
@@ -31,10 +31,10 @@ export interface MusicPageParams {
|
|
|
31
31
|
|
|
32
32
|
const MusicPage = () => {
|
|
33
33
|
const deviceInfo = useDeviceInfo()
|
|
34
|
+
const tyGroupId = useUAGroupInfo().tyGroupId
|
|
34
35
|
const parmas = useParams<MusicPageParams>()
|
|
35
36
|
const navigation = useNavigation()
|
|
36
37
|
const [musicData, setMusicData] = useDreamMusicData(parmas)
|
|
37
|
-
const [, setMusic] = useMusciData()
|
|
38
38
|
const [config] = useGroupConfig<any>()
|
|
39
39
|
const state = useReactive({
|
|
40
40
|
musicData: cloneDeep(musicData),
|
|
@@ -50,10 +50,10 @@ const MusicPage = () => {
|
|
|
50
50
|
if (parmas.dreamMusicDp && state.musicData.musicType === 0){
|
|
51
51
|
setMusicData(cloneDeep(state.musicData))
|
|
52
52
|
}else{
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
setMusicData({
|
|
54
|
+
...cloneDeep(state.musicData),
|
|
55
|
+
phoneDpData: ''
|
|
56
|
+
}).then()
|
|
57
57
|
MusicManager.open(
|
|
58
58
|
state.musicData.phoneMusicData[state.musicData.phoneGenreMode],
|
|
59
59
|
() => {},
|
|
@@ -66,11 +66,7 @@ const MusicPage = () => {
|
|
|
66
66
|
v.brightness,
|
|
67
67
|
v.temperature
|
|
68
68
|
);
|
|
69
|
-
|
|
70
|
-
await setMusicData({
|
|
71
|
-
...cloneDeep(state.musicData),
|
|
72
|
-
phoneDpData: musicDpData
|
|
73
|
-
})
|
|
69
|
+
putGroupTYDps(tyGroupId, {[parmas.musicDataDp]: musicDpData}).then()
|
|
74
70
|
},
|
|
75
71
|
{ isColourExist: true, isTempExist: true }
|
|
76
72
|
)
|
|
@@ -19,6 +19,10 @@ import BiorhythmPage from '../modules/biorhythm/BiorhythmPage'
|
|
|
19
19
|
import BiorhythmEditPage from '../modules/biorhythm/BiorhythmDetailPage'
|
|
20
20
|
import IconSelectPage from '../modules/biorhythm/IconSelect'
|
|
21
21
|
import MusicPage from '../modules/music/MusicPage'
|
|
22
|
+
import FixedTimeForPlugPage from "../modules/fixedTimeForPlug/FixedTimeForPlugPage";
|
|
23
|
+
import FixedTimeForPlugDetailPage from "../modules/fixedTimeForPlug/FixedTimeForPlugDetailPage";
|
|
24
|
+
import FixedTimingForLightPage from "../modules/fixedTimingForLight/FixedTimingForLightPage";
|
|
25
|
+
import FixedTimingForLightDetailPage from "../modules/fixedTimingForLight/FixedTimingForLightDetailPage";
|
|
22
26
|
|
|
23
27
|
export const ui_biz_routerKey = {
|
|
24
28
|
'group_ui_biz_timer': 'group_ui_biz_timer',
|
|
@@ -40,7 +44,11 @@ export const ui_biz_routerKey = {
|
|
|
40
44
|
'group_ui_biz_biological': 'group_ui_biz_biological',
|
|
41
45
|
'group_ui_biz_biological_detail': 'group_ui_biz_biological_detail',
|
|
42
46
|
'group_ui_biz_biological_icon_select': 'group_ui_biz_biological_icon_select',
|
|
43
|
-
'group_ui_biz_music': 'group_ui_biz_music'
|
|
47
|
+
'group_ui_biz_music': 'group_ui_biz_music',
|
|
48
|
+
'group_ui_biz_fixed_time_plug': 'group_ui_biz_fixed_time_plug',
|
|
49
|
+
'group_ui_biz_fixed_time_plug_detail': 'group_ui_biz_fixed_time_plug_detail',
|
|
50
|
+
'group_ui_biz_fixed_timing_light': 'group_ui_biz_fixed_timing_light',
|
|
51
|
+
'group_ui_biz_fixed_timing_light_detail': 'group_ui_biz_fixed_timing_light_detail',
|
|
44
52
|
}
|
|
45
53
|
|
|
46
54
|
export const TimerRouters: NavigationRoute[] = [
|
|
@@ -236,3 +244,41 @@ export const MusicPageRouters: NavigationRoute[] = [
|
|
|
236
244
|
},
|
|
237
245
|
},
|
|
238
246
|
]
|
|
247
|
+
|
|
248
|
+
export const FixedTimeForPlugRouters: NavigationRoute[] = [
|
|
249
|
+
{
|
|
250
|
+
name: ui_biz_routerKey.group_ui_biz_fixed_time_plug,
|
|
251
|
+
component: FixedTimeForPlugPage,
|
|
252
|
+
options: {
|
|
253
|
+
hideTopbar: true,
|
|
254
|
+
showOfflineView: false,
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
name: ui_biz_routerKey.group_ui_biz_fixed_time_plug_detail,
|
|
259
|
+
component: FixedTimeForPlugDetailPage,
|
|
260
|
+
options: {
|
|
261
|
+
hideTopbar: true,
|
|
262
|
+
showOfflineView: false,
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
]
|
|
266
|
+
|
|
267
|
+
export const FixedTimingForLightRouters: NavigationRoute[] = [
|
|
268
|
+
{
|
|
269
|
+
name: ui_biz_routerKey.group_ui_biz_fixed_timing_light,
|
|
270
|
+
component: FixedTimingForLightPage,
|
|
271
|
+
options: {
|
|
272
|
+
hideTopbar: true,
|
|
273
|
+
showOfflineView: false,
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
name: ui_biz_routerKey.group_ui_biz_fixed_timing_light_detail,
|
|
278
|
+
component: FixedTimingForLightDetailPage,
|
|
279
|
+
options: {
|
|
280
|
+
hideTopbar: true,
|
|
281
|
+
showOfflineView: false,
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
]
|