@ledvance/ui-biz-bundle 1.1.56 → 1.1.58

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.
Files changed (70) hide show
  1. package/package.json +2 -1
  2. package/src/modules/biorhythm/Router.ts +34 -0
  3. package/src/modules/fixedTime/Router.ts +26 -0
  4. package/src/modules/flags/FlagInfo.tsx +25 -25
  5. package/src/modules/flags/FlagPage.tsx +1 -1
  6. package/src/modules/flags/Router.ts +25 -0
  7. package/src/modules/history/Router.ts +16 -0
  8. package/src/modules/mood/FantasyRouter.ts +35 -0
  9. package/src/modules/mood/MixMood/Router.ts +44 -0
  10. package/src/modules/mood/Router.ts +53 -0
  11. package/src/modules/music/Router.ts +16 -0
  12. package/src/modules/powerOnBehavior/Router.ts +16 -0
  13. package/src/modules/randomTime/Router.ts +25 -0
  14. package/src/modules/sleepWakeup/Router.ts +25 -0
  15. package/src/modules/timeSchedule/Router.ts +25 -0
  16. package/src/modules/timer/Router.ts +16 -0
  17. package/src/navigation/Routers.d.ts +0 -7
  18. package/src/navigation/Routers.ts +15 -304
  19. package/src/newModules/childLock/ChildLockPage.tsx +97 -0
  20. package/src/newModules/childLock/Router.ts +16 -0
  21. package/src/newModules/energyConsumption/EnergyConsumptionActions.ts +23 -0
  22. package/src/newModules/energyConsumption/EnergyConsumptionChart.tsx +84 -0
  23. package/src/newModules/energyConsumption/EnergyConsumptionDetail.tsx +321 -0
  24. package/src/newModules/energyConsumption/EnergyConsumptionPage.tsx +392 -0
  25. package/src/newModules/energyConsumption/Router.ts +34 -0
  26. package/src/newModules/energyConsumption/co2Data.ts +23655 -0
  27. package/src/newModules/energyConsumption/component/BarChart.tsx +93 -0
  28. package/src/newModules/energyConsumption/component/EnergyModal.tsx +282 -0
  29. package/src/newModules/energyConsumption/component/Overview.tsx +116 -0
  30. package/src/newModules/fixedTime/FixedTimeActions.ts +234 -0
  31. package/src/newModules/fixedTime/FixedTimeDetailPage.tsx +341 -0
  32. package/src/newModules/fixedTime/FixedTimePage.tsx +231 -0
  33. package/src/newModules/fixedTime/Router.ts +25 -0
  34. package/src/newModules/lightMode/LightModePage.tsx +204 -0
  35. package/src/newModules/lightMode/Router.ts +16 -0
  36. package/src/newModules/mood/AddMoodPage.tsx +178 -0
  37. package/src/newModules/mood/DynamicMoodEditorPage.tsx +653 -0
  38. package/src/newModules/mood/Interface.ts +219 -0
  39. package/src/newModules/mood/MixDynamicMoodEditor.tsx +781 -0
  40. package/src/newModules/mood/MoodActions.ts +235 -0
  41. package/src/newModules/mood/MoodInfo.ts +2151 -0
  42. package/src/newModules/mood/MoodItem.tsx +148 -0
  43. package/src/newModules/mood/MoodPage.tsx +385 -0
  44. package/src/newModules/mood/MoodParse.ts +442 -0
  45. package/src/newModules/mood/RecommendMoodItem.tsx +68 -0
  46. package/src/newModules/mood/Router.ts +53 -0
  47. package/src/newModules/mood/StaticMoodEditorPage.tsx +343 -0
  48. package/src/newModules/mood/tools.ts +12 -0
  49. package/src/newModules/overchargeSwitch/OverchargeSwitchPage.tsx +96 -0
  50. package/src/newModules/overchargeSwitch/Router.ts +16 -0
  51. package/src/newModules/powerOnBehavior/LightBehaviorPage.tsx +266 -0
  52. package/src/newModules/powerOnBehavior/PlugBehaviorPage.tsx +173 -0
  53. package/src/newModules/powerOnBehavior/PowerOnBehaviorActions.ts +106 -0
  54. package/src/newModules/powerOnBehavior/Router.ts +16 -0
  55. package/src/newModules/randomTime/RandomTimeActions.ts +232 -0
  56. package/src/newModules/randomTime/RandomTimeDetailPage.tsx +322 -0
  57. package/src/newModules/randomTime/RandomTimePage.tsx +230 -0
  58. package/src/newModules/randomTime/Router.ts +25 -0
  59. package/src/newModules/randomTime/Summary.tsx +116 -0
  60. package/src/newModules/swithInching/Router.ts +16 -0
  61. package/src/newModules/swithInching/SwithInching.tsx +231 -0
  62. package/src/newModules/swithInching/SwithInchingAction.ts +55 -0
  63. package/src/newModules/swithInching/pickerView.tsx +91 -0
  64. package/src/newModules/timeSchedule/Interface.ts +111 -0
  65. package/src/newModules/timeSchedule/Router.ts +25 -0
  66. package/src/newModules/timeSchedule/TimeScheduleActions.ts +53 -0
  67. package/src/newModules/timeSchedule/TimeScheduleDetailPage.tsx +662 -0
  68. package/src/newModules/timeSchedule/TimeSchedulePage.tsx +222 -0
  69. package/src/newModules/timeSchedule/components/ManuaSettings.tsx +259 -0
  70. package/src/newModules/timeSchedule/components/ScheduleCard.tsx +109 -0
@@ -0,0 +1,148 @@
1
+ import React, { useMemo } from 'react';
2
+ import { StyleSheet, Text, View, ViewProps, ViewStyle, Image } from 'react-native';
3
+ import { SwitchButton, Utils } from 'tuya-panel-kit';
4
+ import { hsv2Hex } from '@ledvance/base/src/utils';
5
+ import { cctToColor } from '@ledvance/base/src/utils/cctUtils';
6
+ import { mapFloatToRange } from '@ledvance/base/src/utils';
7
+ import Card from '@ledvance/base/src/components/Card';
8
+ import Spacer from '@ledvance/base/src/components/Spacer';
9
+ import MoodColorsLine from '@ledvance/base/src/components/MoodColorsLine';
10
+ import { MoodLampInfo, MoodUIInfo } from './Interface';
11
+ import I18n from '@ledvance/base/src/i18n';
12
+ import res from '@ledvance/base/src/res';
13
+
14
+ const cx = Utils.RatioUtils.convertX;
15
+
16
+ interface MoodItemProps extends ViewProps {
17
+ enable: boolean;
18
+ isMix: boolean;
19
+ mood: MoodUIInfo;
20
+ style?: ViewStyle;
21
+ onPress?: () => void;
22
+ onSwitch: (enable: boolean) => void;
23
+ }
24
+
25
+ const MoodItem = (props: MoodItemProps) => {
26
+ const { mood, isMix } = props;
27
+ const isDynamic = useMemo(() => {
28
+ return mood.mainLamp.nodes?.length > 1 || mood.secondaryLamp.nodes?.length > 1;
29
+ }, [mood.mainLamp.nodes, mood.secondaryLamp.nodes]);
30
+
31
+ return (
32
+ <Card style={[styles.card, props.style]} onPress={props.onPress}>
33
+ <View>
34
+ <Spacer height={cx(16)} />
35
+ <View style={styles.headline}>
36
+ <Text style={styles.headText}>{mood.name}</Text>
37
+ <SwitchButton
38
+ thumbStyle={{ elevation: 0 }}
39
+ value={props.enable}
40
+ onValueChange={props.onSwitch}
41
+ />
42
+ </View>
43
+ <Spacer />
44
+ <MixMoodColorsLine mixSubLight={mood.mainLamp} isMix={isMix} />
45
+ {isMix && (
46
+ <>
47
+ <Spacer height={cx(7)} />
48
+ <MixMoodColorsLine mixSubLight={mood.secondaryLamp} isMix={isMix} />
49
+ </>
50
+ )}
51
+ <Spacer height={cx(12)} />
52
+ <View style={styles.moodTypeItem}>
53
+ <View style={styles.moodTypeLabel}>
54
+ <Text style={styles.moodTypeLabelText}>
55
+ {I18n.getLang(
56
+ isDynamic ? 'mood_overview_field_chip_2' : 'mood_overview_field_chip_text'
57
+ )}
58
+ </Text>
59
+ </View>
60
+ </View>
61
+ <Spacer height={cx(16)} />
62
+ </View>
63
+ </Card>
64
+ );
65
+ };
66
+
67
+ export default MoodItem;
68
+
69
+ export function MixMoodColorsLine(props: { mixSubLight: MoodLampInfo; isMix: boolean }) {
70
+ const { mixSubLight, isMix } = props;
71
+ const lightColors = !!(mixSubLight.enable && mixSubLight.nodes.length) ? mixSubLight.nodes?.map(n => {
72
+ return n.isColorNode
73
+ ? hsv2Hex(n.h, Math.round(n.s), Math.round(mapFloatToRange(n.v / 100, 50, 100)))
74
+ : cctToColor(n.colorTemp.toFixed());
75
+ }) : ['#eee'];
76
+ return (
77
+ <View style={styles.gradientItem}>
78
+ <Spacer height={0} width={cx(16)} />
79
+ <MoodColorsLine
80
+ nodeStyle={{ borderColor: '#ccc', borderWidth: 1 }}
81
+ width={isMix ? cx(264) : undefined}
82
+ type={'separate'}
83
+ colors={lightColors}
84
+ />
85
+ {isMix && (
86
+ <>
87
+ <Spacer height={0} width={cx(7)} />
88
+ <View style={styles.gradientItemIconView}>
89
+ <Image style={styles.gradientItemIcon} source={mixSubLight.enable ? res.light_on : res.light_off} />
90
+ </View>
91
+ </>
92
+ )}
93
+ </View>
94
+ );
95
+ }
96
+
97
+ const styles = StyleSheet.create({
98
+ card: {
99
+ marginHorizontal: cx(24),
100
+ },
101
+ headline: {
102
+ flexDirection: 'row',
103
+ marginHorizontal: cx(16),
104
+ },
105
+ headText: {
106
+ flex: 1,
107
+ color: '#000',
108
+ fontSize: cx(16),
109
+ fontFamily: 'helvetica_neue_lt_std_bd',
110
+ lineHeight: cx(20),
111
+ },
112
+ gradientItem: {
113
+ flexDirection: 'row',
114
+ },
115
+ gradientItemIconView: {
116
+ width: cx(24),
117
+ height: cx(24),
118
+ justifyContent: 'center',
119
+ alignItems: 'center',
120
+ backgroundColor: '#aaa',
121
+ borderRadius: cx(8),
122
+ },
123
+ gradientItemIcon: {
124
+ width: cx(16),
125
+ height: cx(16),
126
+ tintColor: '#fff',
127
+ },
128
+ gradient: {
129
+ borderRadius: cx(8),
130
+ },
131
+ moodTypeItem: {
132
+ flexDirection: 'row',
133
+ },
134
+ moodTypeLabel: {
135
+ marginStart: cx(16),
136
+ paddingHorizontal: cx(12.5),
137
+ backgroundColor: '#E6E7E8',
138
+ borderRadius: cx(8),
139
+ },
140
+ moodTypeLabelText: {
141
+ height: cx(16),
142
+ color: '#000000DD',
143
+ fontSize: cx(10),
144
+ textAlignVertical: 'center',
145
+ fontFamily: 'helvetica_neue_lt_std_roman',
146
+ lineHeight: cx(16),
147
+ },
148
+ });
@@ -0,0 +1,385 @@
1
+ import React, { useCallback, useEffect } from 'react';
2
+ import Page from '@ledvance/base/src/components/Page';
3
+ import { Utils } from 'tuya-panel-kit';
4
+ import { saveMoodList, useWorkMode } from './MoodActions';
5
+ import {
6
+ useDeviceId,
7
+ useDeviceInfo,
8
+ useFlagMode,
9
+ useMoods,
10
+ } from '@ledvance/base/src/models/modules/NativePropsSlice';
11
+ import { useReactive } from 'ahooks';
12
+ import Strings from '@ledvance/base/src/i18n';
13
+ import res from '@ledvance/base/src/res';
14
+ import { FlatList, StyleSheet, View, Platform } from 'react-native';
15
+ import Tag from '@ledvance/base/src/components/Tag';
16
+ import Spacer from '@ledvance/base/src/components/Spacer';
17
+ import InfoText from '@ledvance/base/src/components/InfoText';
18
+ import CustomListDialog from '@ledvance/base/src/components/CustomListDialog';
19
+ import MoodItem from './MoodItem';
20
+ import { useNavigation } from '@react-navigation/core';
21
+ import { MoodPageParams, MoodPageState, MoodUIInfo } from './Interface';
22
+ import { getRemoteMoodList, useMoodScene } from './MoodActions';
23
+ import { useParams } from '@ledvance/base/src/hooks/Hooks';
24
+ import { RouterKey } from 'navigation/Router';
25
+ import { cloneDeep } from 'lodash';
26
+ import { saveFlagMode } from '@ledvance/ui-biz-bundle/src/modules/flags/FlagActions';
27
+ import { WorkMode } from '@ledvance/base/src/utils/interface';
28
+
29
+ const cx = Utils.RatioUtils.convertX;
30
+
31
+ const MAX_MOOD_COUNT = 255;
32
+
33
+ const MoodPage = () => {
34
+ const params = useParams<MoodPageParams>();
35
+ const deviceInfo = useDeviceInfo();
36
+ const devId = useDeviceId();
37
+ const navigation = useNavigation();
38
+ const option = {
39
+ isCeilingLight: params.isCeilingLight,
40
+ isStripLight: params.isStripLight,
41
+ isStringLight: params.isStringLight,
42
+ isFanLight: params.isFanLight,
43
+ isMixLight: params.isMixLight,
44
+ isUVCFan: params.isUVCFan,
45
+ isMatterLight: params.isMatterLight,
46
+ };
47
+ const [moodInfo, setMoodInfo] = useMoodScene(params.mainDp, option, params.secondaryDp);
48
+ const [moods, setMoods] = useMoods();
49
+ const [mainWork, setMainWork] = useWorkMode(params.mainWorkMode);
50
+ const [secondaryWork, setSecondaryWork] = useWorkMode(params.secondaryWorkMode!);
51
+ const [flagMode, setFlagMode] = useFlagMode();
52
+ const state = useReactive<MoodPageState>({
53
+ currentMood: undefined,
54
+ staticTagChecked: true,
55
+ dynamicTagChecked: true,
56
+ showAddMoodPopover: false,
57
+ originMoods: cloneDeep(moods),
58
+ filterMoods: [],
59
+ loading: false,
60
+ timerId: undefined as any,
61
+ flag: Symbol(),
62
+ });
63
+ useEffect(() => {
64
+ state.timerId = setTimeout(() => {
65
+ getRemoteMoodList(
66
+ devId,
67
+ {
68
+ ...option,
69
+ isSupportBrightness: params.isSupportBrightness,
70
+ isSupportColor: params.isSupportColor,
71
+ isSupportTemperature: params.isSupportTemperature,
72
+ },
73
+ params.featureId
74
+ ).then(res => {
75
+ if (res.success && Array.isArray(res.data)) {
76
+ state.originMoods = cloneDeep(res.data);
77
+ }
78
+ });
79
+ }, 400);
80
+
81
+ return () => {
82
+ clearTimeout(state.timerId);
83
+ };
84
+ }, []);
85
+
86
+ useEffect(() => {
87
+ state.filterMoods = state.originMoods.filter(item => {
88
+ return (
89
+ (state.staticTagChecked && state.dynamicTagChecked) ||
90
+ (!state.staticTagChecked && !state.dynamicTagChecked) ||
91
+ (state.staticTagChecked && item.mainLamp.nodes.length < 2) ||
92
+ (state.dynamicTagChecked &&
93
+ (item.secondaryLamp.nodes.length > 1 || item.mainLamp.nodes.length > 1))
94
+ );
95
+ });
96
+ }, [state.staticTagChecked, state.dynamicTagChecked, state.originMoods]);
97
+
98
+ const navigationRoute = (isStatic: boolean, mode: 'add' | 'edit', currentMood?: MoodUIInfo) => {
99
+ const path =
100
+ mode === 'add'
101
+ ? RouterKey.ui_biz_mood_add
102
+ : isStatic
103
+ ? RouterKey.ui_biz_static_mood_edit
104
+ : !!(params.isMixLight || params.isCeilingLight)
105
+ ? RouterKey.ui_biz_dynamic_mix_mood_edit
106
+ : RouterKey.ui_biz_dynamic_mood_edit;
107
+ navigation.navigate(path, {
108
+ mode,
109
+ isStatic,
110
+ moods: state.originMoods,
111
+ currentMood,
112
+ moduleParams: params,
113
+ modDeleteMood,
114
+ });
115
+ };
116
+
117
+ const modDeleteMood = async (mode: 'add' | 'edit' | 'del' | 'set', currentMood: MoodUIInfo) => {
118
+ const checkedMood: MoodUIInfo = {
119
+ ...currentMood,
120
+ mainLamp: {
121
+ ...currentMood.mainLamp,
122
+ nodes: currentMood.mainLamp.nodes.map(node => {
123
+ if (mode !== 'del') {
124
+ if (node.isColorNode) {
125
+ node.brightness = 0;
126
+ node.colorTemp = 0;
127
+ } else {
128
+ node.h = 0;
129
+ node.s = 0;
130
+ node.v = 0;
131
+ if (!params.isSupportTemperature) {
132
+ node.colorTemp = 100; // 适配dim灯
133
+ }
134
+ }
135
+ return node;
136
+ }
137
+ return node;
138
+ }),
139
+ },
140
+ secondaryLamp: {
141
+ ...currentMood.secondaryLamp,
142
+ nodes: currentMood.secondaryLamp
143
+ ? currentMood.secondaryLamp.nodes.map(node => {
144
+ if (mode !== 'del') {
145
+ if (node.isColorNode) {
146
+ node.brightness = 0;
147
+ node.colorTemp = 0;
148
+ } else {
149
+ node.h = 0;
150
+ node.s = 0;
151
+ node.v = 0;
152
+ if (!params.isSupportTemperature) {
153
+ node.colorTemp = 100; // 适配dim灯
154
+ }
155
+ }
156
+ return node;
157
+ }
158
+ return node;
159
+ })
160
+ : [],
161
+ },
162
+ };
163
+ if (mode === 'set') {
164
+ return setMoodInfo(checkedMood, params);
165
+ }
166
+ let newScene: MoodUIInfo[] = [];
167
+ if (mode === 'add') {
168
+ newScene = [checkedMood, ...state.originMoods];
169
+ } else if (mode === 'del') {
170
+ newScene = state.originMoods.filter(item => item.id !== checkedMood.id);
171
+ } else {
172
+ newScene = state.originMoods.map(item => {
173
+ if (item.id === checkedMood.id) {
174
+ return checkedMood;
175
+ }
176
+ return item;
177
+ });
178
+ }
179
+ const mood = mode === 'del' ? (newScene.length === 0 ? undefined : newScene[0]) : checkedMood;
180
+ const res = await saveMoodList(devId, newScene, option, params.featureId);
181
+ if (res.success) {
182
+ state.originMoods = cloneDeep(newScene);
183
+ setMoods(cloneDeep(newScene));
184
+ updateFlagMode();
185
+ if (mood) {
186
+ if (mode === 'del') {
187
+ if (
188
+ (mainWork !== WorkMode.Scene && secondaryWork !== WorkMode.Scene) ||
189
+ (params.isCeilingLight
190
+ ? currentMood.mainLamp.id !== moodInfo.mainLamp.id &&
191
+ currentMood.secondaryLamp.id !== moodInfo.secondaryLamp.id
192
+ : currentMood.id !== moodInfo.id)
193
+ ) {
194
+ return {
195
+ success: true,
196
+ };
197
+ }
198
+ }
199
+ setMoodInfo(mood, params).then();
200
+ } else {
201
+ if (mainWork === WorkMode.Scene) {
202
+ if (params.isCeilingLight) {
203
+ setMainWork(WorkMode.White).then();
204
+ } else {
205
+ const work = getWorkMode(undefined, params);
206
+ setMainWork(work).then();
207
+ }
208
+ }
209
+ if (params.isCeilingLight && params.secondaryWorkMode && secondaryWork === WorkMode.Scene) {
210
+ setSecondaryWork(WorkMode.Colour).then();
211
+ }
212
+ }
213
+ return {
214
+ success: true,
215
+ };
216
+ } else {
217
+ return {
218
+ success: false,
219
+ };
220
+ }
221
+ };
222
+
223
+ function getWorkMode(mood: MoodUIInfo | undefined, params: MoodPageParams): WorkMode {
224
+ if (mood) return WorkMode.Scene;
225
+ if (params.isFanLight || params.isUVCFan) return WorkMode.Control;
226
+ if (params.isSupportColor) return WorkMode.Colour;
227
+ return WorkMode.White;
228
+ }
229
+
230
+ const updateFlagMode = () => {
231
+ if (flagMode?.flagMode) {
232
+ saveFlagMode(
233
+ devId,
234
+ JSON.stringify({
235
+ flagMode: false,
236
+ flagId: undefined,
237
+ })
238
+ ).then();
239
+ setFlagMode({
240
+ flagMode: false,
241
+ flagId: undefined,
242
+ });
243
+ }
244
+ };
245
+
246
+ const onAddMoodDialogItemClick = useCallback(
247
+ (isStatic: boolean, _: number) => {
248
+ if (!!state.originMoods) {
249
+ navigationRoute(isStatic, 'add');
250
+ }
251
+ state.showAddMoodPopover = false;
252
+ },
253
+ [state.originMoods]
254
+ );
255
+
256
+ const getItemEnable = useCallback(
257
+ (moodItem: MoodUIInfo) => {
258
+ if (option.isCeilingLight) {
259
+ return (
260
+ moodInfo.mainLamp.id === moodItem.mainLamp.id &&
261
+ moodInfo.secondaryLamp.id === moodItem.secondaryLamp.id &&
262
+ (mainWork === WorkMode.Scene || secondaryWork === WorkMode.Scene)
263
+ );
264
+ } else {
265
+ return moodInfo.id === moodItem.id && mainWork === WorkMode.Scene && !flagMode.flagMode;
266
+ }
267
+ },
268
+ [moodInfo, mainWork]
269
+ );
270
+
271
+ return (
272
+ <>
273
+ <Page
274
+ backText={deviceInfo.name}
275
+ headlineText={Strings.getLang('mood_overview_headline_text')}
276
+ headlineIcon={state.originMoods.length < MAX_MOOD_COUNT ? res.add : undefined}
277
+ onHeadlineIconClick={() => {
278
+ if (params.isStringLight || params.isStripLight) {
279
+ onAddMoodDialogItemClick(false, 1);
280
+ } else {
281
+ state.showAddMoodPopover = !state.showAddMoodPopover;
282
+ }
283
+ }}
284
+ loading={state.loading}
285
+ >
286
+ <View style={styles.tagLine}>
287
+ <Tag
288
+ checked={state.staticTagChecked}
289
+ text={Strings.getLang('mood_overview_filter_name_text1')}
290
+ onCheckedChange={checked => {
291
+ state.staticTagChecked = checked;
292
+ }}
293
+ />
294
+ <Spacer width={cx(8)} height={0} />
295
+ <Tag
296
+ checked={state.dynamicTagChecked}
297
+ text={Strings.getLang('mood_overview_filter_name_text2')}
298
+ onCheckedChange={checked => {
299
+ state.dynamicTagChecked = checked;
300
+ }}
301
+ />
302
+ </View>
303
+ <Spacer height={cx(10)} />
304
+ {state.originMoods.length >= MAX_MOOD_COUNT && (
305
+ <View style={styles.infoLine}>
306
+ <Spacer height={cx(10)} />
307
+ <InfoText
308
+ icon={res.ic_warning_amber}
309
+ text={Strings.getLang('mood_overview_warning_max_number_text')}
310
+ contentColor={'#ff9500'}
311
+ />
312
+ <Spacer height={cx(6)} />
313
+ </View>
314
+ )}
315
+ <FlatList
316
+ data={state.filterMoods}
317
+ renderItem={({ item }) => {
318
+ return (
319
+ <MoodItem
320
+ enable={getItemEnable(item)}
321
+ isMix={!!(params.isMixLight || params.isCeilingLight)}
322
+ mood={item}
323
+ onPress={() => {
324
+ navigationRoute(item.mainLamp.nodes.length === 1, 'edit', item);
325
+ }}
326
+ onSwitch={async _ => {
327
+ state.loading = true;
328
+ await modDeleteMood('set', item);
329
+ updateFlagMode();
330
+ state.loading = false;
331
+ }}
332
+ />
333
+ );
334
+ }}
335
+ ListHeaderComponent={() => <Spacer height={cx(10)} />}
336
+ ItemSeparatorComponent={() => <Spacer />}
337
+ ListFooterComponent={() => <Spacer />}
338
+ keyExtractor={item => `${item.name}`}
339
+ />
340
+ </Page>
341
+ <CustomListDialog
342
+ show={state.showAddMoodPopover}
343
+ style={styles.addMoodPopover}
344
+ itemStyle={styles.popoverItem}
345
+ onDismiss={() => {
346
+ state.showAddMoodPopover = false;
347
+ }}
348
+ data={[
349
+ {
350
+ text: Strings.getLang('mood_overview_add_mood_text'),
351
+ value: true,
352
+ },
353
+ {
354
+ text: Strings.getLang('mood_overview_add_mood_text2'),
355
+ value: false,
356
+ },
357
+ ]}
358
+ onItemPress={onAddMoodDialogItemClick}
359
+ />
360
+ </>
361
+ );
362
+ };
363
+
364
+ const styles = StyleSheet.create({
365
+ tagLine: {
366
+ flexDirection: 'row',
367
+ marginHorizontal: cx(24),
368
+ },
369
+ infoLine: {
370
+ marginHorizontal: cx(24),
371
+ },
372
+ addMoodPopover: {
373
+ position: 'absolute',
374
+ right: cx(60),
375
+ top: Platform.OS === 'android' ? cx(90) : cx(130),
376
+ maxWidth: cx(200),
377
+ backgroundColor: '#fff',
378
+ },
379
+ popoverItem: {
380
+ padding: cx(5),
381
+ alignItems: 'flex-start',
382
+ },
383
+ });
384
+
385
+ export default MoodPage;