@eohjsc/react-native-smart-city 0.7.15 → 0.7.17

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 (25) hide show
  1. package/assets/images/Sms.svg +9 -0
  2. package/package.json +1 -1
  3. package/src/commons/Automate/ItemConditionScriptDetailStyles.js +1 -0
  4. package/src/commons/Unit/__test__/SharedUnit.test.js +57 -0
  5. package/src/configs/API.js +6 -1
  6. package/src/configs/AccessibilityLabel.js +4 -0
  7. package/src/hooks/Common/useBlockBack.js +10 -2
  8. package/src/navigations/UnitStack.js +24 -0
  9. package/src/screens/Automate/AddNewAction/SetupScriptReceiverSms.js +167 -0
  10. package/src/screens/Automate/AddNewAction/SetupScriptSms.js +73 -0
  11. package/src/screens/Automate/AddNewAction/Styles/SetupScriptEmailStyles.js +5 -0
  12. package/src/screens/Automate/AddNewAction/__test__/SetupScriptReceiverSms.test.js +105 -0
  13. package/src/screens/Automate/AddNewAction/__test__/SetupScriptSms.test.js +70 -0
  14. package/src/screens/Automate/EditActionsList/UpdateReceiverSmsScript.js +178 -0
  15. package/src/screens/Automate/EditActionsList/UpdateSmsScript.js +66 -0
  16. package/src/screens/Automate/EditActionsList/__tests__/UpdateReceiverSmsScript.test.js +82 -0
  17. package/src/screens/Automate/EditActionsList/__tests__/UpdateSmsScript.test.js +71 -0
  18. package/src/screens/Automate/EditActionsList/index.js +50 -1
  19. package/src/screens/Automate/ScriptDetail/Components/AddActionScript.js +52 -19
  20. package/src/screens/Automate/ScriptDetail/Styles/indexStyles.js +39 -2
  21. package/src/screens/Automate/ScriptDetail/__test__/index.test.js +295 -57
  22. package/src/screens/Automate/ScriptDetail/index.js +234 -32
  23. package/src/utils/I18n/translations/en.js +10 -0
  24. package/src/utils/I18n/translations/vi.js +10 -0
  25. package/src/utils/Route/index.js +3 -0
@@ -0,0 +1,178 @@
1
+ import React, { useCallback, useMemo, useState, useEffect, memo } from 'react';
2
+ import { FlatList, View } from 'react-native';
3
+ import { useNavigation } from '@react-navigation/native';
4
+ import styles from './Styles/UpdateReceiverEmailScriptStyles.js';
5
+ import { CircleView, HeaderCustom, Text } from '../../../commons/index.js';
6
+ import { useTranslations } from '../../../hooks/Common/useTranslations';
7
+
8
+ import BottomButtonView from '../../../commons/BottomButtonView/index.js';
9
+ import { axiosPut, axiosGet } from '../../../utils/Apis/axios.js';
10
+ import { API, Colors } from '../../../configs/index.js';
11
+ import { ToastBottomHelper } from '../../../utils/Utils.js';
12
+ import Routes from '../../../utils/Route/index.js';
13
+ import moment from 'moment';
14
+ import CheckBox from '@react-native-community/checkbox';
15
+ import { useSCContextSelector } from '../../../context';
16
+ import { Image } from 'react-native';
17
+
18
+ const UpdateReceiverSmsScript = ({ route }) => {
19
+ const t = useTranslations();
20
+ const { goBack, navigate } = useNavigation();
21
+ const { automateId, scriptItemId, formData } = route.params;
22
+ const [members, setMembers] = useState([]);
23
+ const [listUser, setListUser] = useState(formData.receiver_ids);
24
+ const currentUserId = useSCContextSelector(
25
+ (state) => state.auth.account.user.id
26
+ );
27
+
28
+ const loadMembers = useCallback(async () => {
29
+ const { success, data } = await axiosGet(
30
+ API.SHARE.UNITS_MEMBERS(formData.unit_id)
31
+ );
32
+ if (success) {
33
+ setMembers(data);
34
+ }
35
+ }, [formData.unit_id]);
36
+
37
+ useEffect(() => {
38
+ loadMembers();
39
+ }, [loadMembers]);
40
+
41
+ const onNext = useCallback(async () => {
42
+ const { success } = await axiosPut(
43
+ API.AUTOMATE.UPDATE_SCRIPT_SMS(automateId),
44
+ {
45
+ id: scriptItemId,
46
+ unit: formData.unit_id,
47
+ message: formData.newMessage,
48
+ receiver: listUser,
49
+ }
50
+ );
51
+ if (success) {
52
+ ToastBottomHelper.success(t('update_successfully'));
53
+ navigate({
54
+ name: Routes.ScriptDetail,
55
+ merge: true,
56
+ params: { saveAt: moment().valueOf() },
57
+ });
58
+ }
59
+ }, [
60
+ automateId,
61
+ formData.newMessage,
62
+ formData.unit_id,
63
+ listUser,
64
+ navigate,
65
+ scriptItemId,
66
+ t,
67
+ ]);
68
+
69
+ const canSave = useMemo(() => {
70
+ const { newMessage } = formData;
71
+ return !!newMessage && !!listUser.length;
72
+ }, [formData, listUser.length]);
73
+
74
+ const arrColor = useMemo(
75
+ () => [
76
+ Colors.GeekBlue3,
77
+ Colors.Purple3,
78
+ Colors.Orange3,
79
+ Colors.Volcano3,
80
+ Colors.Blue9,
81
+ Colors.Green3,
82
+ Colors.Cyan2,
83
+ ],
84
+ []
85
+ );
86
+
87
+ const onChecked = useCallback(
88
+ (id) => (checked) => {
89
+ setListUser((prevListUser) =>
90
+ checked
91
+ ? [...prevListUser, id]
92
+ : prevListUser.filter((userId) => userId !== id)
93
+ );
94
+ },
95
+ []
96
+ );
97
+
98
+ const RowMember = memo(({ member, index, onValueChange }) => {
99
+ const { id, name, avatar, share_id, phone_number } = member;
100
+ const [role, roleColor] = useMemo(() => {
101
+ if (!share_id) {
102
+ return [t('owner'), Colors.Primary];
103
+ }
104
+ if (id === currentUserId) {
105
+ return [t('me'), Colors.Primary];
106
+ }
107
+ return [t('member'), Colors.Gray6];
108
+ }, [share_id, id]);
109
+
110
+ const firstWordsInName = useMemo(() => {
111
+ return name.charAt();
112
+ }, [name]);
113
+
114
+ const circleColor = arrColor[index % arrColor.length];
115
+
116
+ return (
117
+ <View style={styles.rowContainer}>
118
+ <View style={styles.border}>
119
+ <CheckBox
120
+ disabled={!phone_number}
121
+ lineWidth={4}
122
+ value={listUser.includes(id)}
123
+ onValueChange={onValueChange(id)}
124
+ style={styles.checkbox}
125
+ />
126
+ <View style={styles.paddingLeft16}>
127
+ {avatar ? (
128
+ <Image source={{ uri: avatar }} style={styles.avatar} />
129
+ ) : (
130
+ <CircleView size={40} backgroundColor={circleColor} center>
131
+ <Text color={Colors.White}>{firstWordsInName}</Text>
132
+ </CircleView>
133
+ )}
134
+ </View>
135
+ <View style={styles.paddingLeft16}>
136
+ <Text style={styles.titleName}>{name}</Text>
137
+ {phone_number ? (
138
+ <Text style={styles.status}>{phone_number}</Text>
139
+ ) : (
140
+ <Text style={styles.invalid}>{t('no_phone_number')}</Text>
141
+ )}
142
+ </View>
143
+ <View style={styles.endFlex}>
144
+ <Text style={[styles.textRole, { color: roleColor }]}>{role}</Text>
145
+ </View>
146
+ </View>
147
+ </View>
148
+ );
149
+ });
150
+
151
+ return (
152
+ <View style={styles.wrap}>
153
+ <HeaderCustom isShowClose onClose={goBack} title={t('sms_to')} />
154
+ <FlatList
155
+ data={members}
156
+ renderItem={({ item, index }) => (
157
+ <RowMember member={item} index={index} onValueChange={onChecked} />
158
+ )}
159
+ keyExtractor={(item) => item.id.toString()}
160
+ ListEmptyComponent={
161
+ <View style={styles.viewEmpty}>
162
+ <Text style={styles.textCenter}>{t('no_member')}</Text>
163
+ </View>
164
+ }
165
+ />
166
+ <View style={styles.container}>
167
+ <BottomButtonView
168
+ style={styles.bottomButtonView}
169
+ mainTitle={t('done')}
170
+ onPressMain={onNext}
171
+ typeMain={canSave ? 'primary' : 'disabled'}
172
+ />
173
+ </View>
174
+ </View>
175
+ );
176
+ };
177
+
178
+ export default UpdateReceiverSmsScript;
@@ -0,0 +1,66 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import _TextInput from '../../../commons/Form/TextInput';
3
+ import styles from './Styles/indexStyles';
4
+ import AccessibilityLabel from '../../../configs/AccessibilityLabel';
5
+ import { Keyboard, TouchableWithoutFeedback, View } from 'react-native';
6
+ import BottomButtonView from '../../../commons/BottomButtonView';
7
+ import { useNavigation } from '@react-navigation/native';
8
+ import Routes from '../../../utils/Route';
9
+
10
+ const UpdateSmsScript = ({
11
+ automateId,
12
+ scriptItemId,
13
+ sms_script,
14
+ t,
15
+ onClosePopup,
16
+ }) => {
17
+ const { navigate } = useNavigation();
18
+ const { message, unit_id, str_phone_numbers, receiver_ids } = sms_script;
19
+ const [formData, setFormData] = useState({
20
+ newMessage: message,
21
+ unit_id,
22
+ str_phone_numbers,
23
+ receiver_ids,
24
+ });
25
+
26
+ const onPressNext = useCallback(async () => {
27
+ onClosePopup();
28
+ navigate(Routes.UpdateReceiverSmsScript, {
29
+ automateId,
30
+ scriptItemId,
31
+ formData,
32
+ });
33
+ }, [automateId, formData, navigate, onClosePopup, scriptItemId]);
34
+
35
+ const onChangeMessage = (value) => {
36
+ setFormData((prev) => ({ ...prev, newMessage: value }));
37
+ };
38
+
39
+ return (
40
+ <TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>
41
+ <View>
42
+ <_TextInput
43
+ label={t('update_message_email')}
44
+ placeholder={t('message_notification')}
45
+ onChange={onChangeMessage}
46
+ textInputStyle={styles.textMessage}
47
+ value={formData.newMessage}
48
+ accessibilityLabel={AccessibilityLabel.AUTOMATE_MESSAGE_NOTIFY}
49
+ multiline={true}
50
+ maxLength={255}
51
+ />
52
+ <View style={styles.wrapBottom}>
53
+ <BottomButtonView
54
+ mainTitle={t('next')}
55
+ onPressMain={onPressNext}
56
+ typeMain={'primary'}
57
+ accessibilityLabel={AccessibilityLabel.BUTTON_SAVE_EDIT_ACTION_LIST}
58
+ disableKeyBoardAnimated
59
+ />
60
+ </View>
61
+ </View>
62
+ </TouchableWithoutFeedback>
63
+ );
64
+ };
65
+
66
+ export default UpdateSmsScript;
@@ -0,0 +1,82 @@
1
+ import MockAdapter from 'axios-mock-adapter';
2
+ import React from 'react';
3
+ import renderer, { act } from 'react-test-renderer';
4
+
5
+ import API from '../../../../configs/API';
6
+ import { SCProvider } from '../../../../context';
7
+ import { mockSCStore } from '../../../../context/mockStore';
8
+
9
+ import BottomButtonView from '../../../../commons/BottomButtonView';
10
+ import api from '../../../../utils/Apis/axios';
11
+ import Routes from '../../../../utils/Route';
12
+ import UpdateReceiverSmsScript from '../UpdateReceiverSmsScript';
13
+ import CheckBox from '@react-native-community/checkbox';
14
+ import { ToastBottomHelper } from '../../../../utils/Utils';
15
+
16
+ const mock = new MockAdapter(api.axiosInstance);
17
+
18
+ const listUser = [
19
+ {
20
+ avatar: 'https://xxx',
21
+ phone_number: '0902xxx',
22
+ id: 140,
23
+ name: 'User 1',
24
+ },
25
+ {
26
+ avatar: null,
27
+ phone_number: null,
28
+ id: 56,
29
+ name: 'User 2',
30
+ share_id: 5386,
31
+ },
32
+ ];
33
+ const wrapComponent = () => (
34
+ <SCProvider initState={mockSCStore({})}>
35
+ <UpdateReceiverSmsScript
36
+ route={{
37
+ params: {
38
+ automateId: 1,
39
+ scriptItemId: 1,
40
+ automate: {
41
+ id: 1,
42
+ sensor_id: 1,
43
+ },
44
+ closeScreen: Routes.ScriptDetail,
45
+ formData: {
46
+ message: 'Contend',
47
+ unit_id: 1,
48
+ str_phone_numbers: '0902xxx',
49
+ receiver_ids: [],
50
+ },
51
+ },
52
+ }}
53
+ />
54
+ </SCProvider>
55
+ );
56
+
57
+ describe('Test UpdateReceiverSmsScript', () => {
58
+ let tree;
59
+
60
+ it('test update message', async () => {
61
+ const spyToast = jest.spyOn(ToastBottomHelper, 'success');
62
+ mock.onGet(API.SHARE.UNITS_MEMBERS(1)).reply(200, listUser);
63
+ mock.onPut(API.AUTOMATE.UPDATE_SCRIPT_SMS(1)).reply(200);
64
+ await act(async () => {
65
+ tree = await renderer.create(wrapComponent());
66
+ });
67
+ const instance = tree.root;
68
+ const checkboxs = instance.findAllByType(CheckBox);
69
+ expect(checkboxs).toHaveLength(2);
70
+ expect(checkboxs[0].props.disabled).toBeFalsy();
71
+ expect(checkboxs[1].props.disabled).toBeTruthy();
72
+ await act(async () => {
73
+ checkboxs[0].props.onValueChange(true);
74
+ });
75
+
76
+ const button = instance.findByType(BottomButtonView);
77
+ await act(async () => {
78
+ button.props.onPressMain();
79
+ });
80
+ expect(spyToast).toHaveBeenCalled();
81
+ });
82
+ });
@@ -0,0 +1,71 @@
1
+ import MockAdapter from 'axios-mock-adapter';
2
+ import React from 'react';
3
+ import renderer, { act } from 'react-test-renderer';
4
+
5
+ import API from '../../../../configs/API';
6
+ import { AccessibilityLabel } from '../../../../configs/Constants';
7
+ import { SCProvider } from '../../../../context';
8
+ import { mockSCStore } from '../../../../context/mockStore';
9
+
10
+ import BottomButtonView from '../../../../commons/BottomButtonView';
11
+ import _TextInput from '../../../../commons/Form/TextInput';
12
+ import api from '../../../../utils/Apis/axios';
13
+ import UpdateSmsScript from '../UpdateSmsScript';
14
+ import Routes from '../../../../utils/Route';
15
+
16
+ const mock = new MockAdapter(api.axiosInstance);
17
+ const mockerOnClosePopup = jest.fn();
18
+
19
+ const wrapComponent = () => (
20
+ <SCProvider initState={mockSCStore({})}>
21
+ <UpdateSmsScript
22
+ automateId={1}
23
+ scriptItemId={1}
24
+ sms_script={{
25
+ message: 'Contend',
26
+ unit_id: 60,
27
+ str_phone_numbers: '0902xxx',
28
+ }}
29
+ t={jest.fn()}
30
+ onClosePopup={mockerOnClosePopup}
31
+ />
32
+ </SCProvider>
33
+ );
34
+
35
+ describe('Test UpdateSmsScript', () => {
36
+ let tree;
37
+
38
+ it('test update message', async () => {
39
+ mock.onPut(API.AUTOMATE.UPDATE_SCRIPT_SMS(1)).reply(200);
40
+ await act(async () => {
41
+ tree = await renderer.create(wrapComponent());
42
+ });
43
+ const instance = tree.root;
44
+
45
+ const message = instance.find(
46
+ (el) =>
47
+ el.props.accessibilityLabel ===
48
+ AccessibilityLabel.AUTOMATE_MESSAGE_NOTIFY && el.type === _TextInput
49
+ );
50
+ await act(async () => {
51
+ message.props.onChange('2');
52
+ });
53
+ const button = instance.findByType(BottomButtonView);
54
+ expect(button.props.typeMain).toEqual('primary');
55
+ await act(async () => {
56
+ button.props.onPressMain();
57
+ });
58
+ expect(global.mockedNavigate).toHaveBeenCalledWith(
59
+ Routes.UpdateReceiverSmsScript,
60
+ {
61
+ automateId: 1,
62
+ formData: {
63
+ newMessage: '2',
64
+ str_phone_numbers: '0902xxx',
65
+ unit_id: 60,
66
+ },
67
+ scriptItemId: 1,
68
+ }
69
+ );
70
+ });
71
+ });
@@ -9,6 +9,7 @@ import Close from '../../../../assets/images/Close.svg';
9
9
  import Delay from '../../../../assets/images/Delay.svg';
10
10
  import Notify from '../../../../assets/images/Notify.svg';
11
11
  import Email from '../../../../assets/images/Email.svg';
12
+ import Sms from '../../../../assets/images/Sms.svg';
12
13
  import Rearrange from '../../../../assets/images/Rearrange.svg';
13
14
  import { FullLoading } from '../../../commons';
14
15
  import FImage from '../../../commons/FImage';
@@ -25,6 +26,7 @@ import styles from './Styles/indexStyles';
25
26
  import UpdateDelayScript from './UpdateDelayScript';
26
27
  import UpdateNotifyScript from './UpdateNotifyScript';
27
28
  import UpdateEmailScript from './UpdateEmailScript';
29
+ import UpdateSmsScript from './UpdateSmsScript';
28
30
 
29
31
  const EditActionsList = () => {
30
32
  const t = useTranslations();
@@ -140,7 +142,13 @@ const EditActionsList = () => {
140
142
  ({ item, getIndex, drag, isActive }) => {
141
143
  const index = getIndex();
142
144
  const paddedIndex = (index + 1).toString().padStart(2, '0');
143
- const { action_script, notify_script, delay_script, email_script } = item;
145
+ const {
146
+ action_script,
147
+ notify_script,
148
+ delay_script,
149
+ email_script,
150
+ sms_script,
151
+ } = item;
144
152
  if (action_script) {
145
153
  const {
146
154
  sensor_icon_kit,
@@ -272,6 +280,34 @@ const EditActionsList = () => {
272
280
  />
273
281
  );
274
282
  }
283
+ if (sms_script) {
284
+ const { message, str_phone_numbers } = sms_script;
285
+
286
+ return (
287
+ <CommonItem
288
+ paddedIndex={paddedIndex}
289
+ icon={
290
+ <View style={styles.iconItem}>
291
+ <Sms />
292
+ </View>
293
+ }
294
+ content={
295
+ <>
296
+ <Text numberOfLines={1} type="H4" color={Colors.Gray9}>
297
+ {message}
298
+ </Text>
299
+ <Text numberOfLines={1} type="H4" color={Colors.Gray9}>
300
+ {str_phone_numbers}
301
+ </Text>
302
+ </>
303
+ }
304
+ onPress={() => onPressRemove(item)}
305
+ onPressUpdate={() => onShowPopupUpdate(item, index)}
306
+ isActive={isActive}
307
+ drag={drag}
308
+ />
309
+ );
310
+ }
275
311
  },
276
312
  // eslint-disable-next-line react-hooks/exhaustive-deps
277
313
  [needRefresh]
@@ -283,6 +319,7 @@ const EditActionsList = () => {
283
319
  notify_script,
284
320
  delay_script,
285
321
  email_script,
322
+ sms_script,
286
323
  id: scriptItemId,
287
324
  } = scriptItem;
288
325
 
@@ -343,6 +380,18 @@ const EditActionsList = () => {
343
380
  />
344
381
  );
345
382
  }
383
+ if (sms_script) {
384
+ return (
385
+ <UpdateSmsScript
386
+ unitId={unitId}
387
+ automateId={id}
388
+ scriptItemId={scriptItemId}
389
+ sms_script={sms_script}
390
+ t={t}
391
+ onClosePopup={onClosePopup}
392
+ />
393
+ );
394
+ }
346
395
  }, [actionsList, id, navigate, scriptItem, t, unitId, updateIndex]);
347
396
 
348
397
  const onDragEnd = useCallback(
@@ -1,6 +1,6 @@
1
1
  import React, { memo, useMemo } from 'react';
2
2
 
3
- import { useNavigation, useRoute } from '@react-navigation/native';
3
+ import { useRoute } from '@react-navigation/native';
4
4
 
5
5
  import { ModalCustom } from '../../../../commons/Modal';
6
6
  import { StyleSheet, View } from 'react-native';
@@ -11,17 +11,25 @@ import Event from '../../../../../assets/images/Event.svg';
11
11
  import Notify from '../../../../../assets/images/Notify.svg';
12
12
  import Delay from '../../../../../assets/images/Delay.svg';
13
13
  import Email from '../../../../../assets/images/Email.svg';
14
+ import Sms from '../../../../../assets/images/Sms.svg';
14
15
  import { TouchableOpacity } from 'react-native';
15
16
  import { IconOutline } from '@ant-design/icons-react-native';
16
17
  import { Text } from '../../../../commons';
17
18
  import Routes from '../../../../utils/Route';
18
19
  import AccessibilityLabel from '../../../../configs/AccessibilityLabel';
20
+ import { AUTOMATE_TYPE } from '../../../../configs/Constants';
19
21
 
20
22
  const AddActionScript = memo(
21
- ({ automate, isVisible, setIsVisible, numberActionAdded }) => {
23
+ ({
24
+ automate,
25
+ isVisible,
26
+ setIsVisible,
27
+ numberActionAdded,
28
+ type,
29
+ navigate,
30
+ }) => {
22
31
  const t = useTranslations();
23
32
  const { id, unit } = automate;
24
- const { navigate } = useNavigation();
25
33
 
26
34
  const { name: currentScreenName } = useRoute();
27
35
  const permissions = useBackendPermission();
@@ -99,6 +107,26 @@ const AddActionScript = memo(
99
107
  }
100
108
  },
101
109
  },
110
+ {
111
+ id: 'sms_alarm',
112
+ text: t('sms_alarm'),
113
+ image: <Sms />,
114
+ describe: t('only_in_local_control'),
115
+ onClick: () => {
116
+ setIsVisible(false);
117
+ if (unit) {
118
+ navigate(Routes.SetupScriptSms, {
119
+ automate,
120
+ unitId: unit,
121
+ });
122
+ } else {
123
+ navigate(Routes.SelectUnit, {
124
+ automate,
125
+ routeName: Routes.SetupScriptSms,
126
+ });
127
+ }
128
+ },
129
+ },
102
130
  ];
103
131
  }, [
104
132
  automate,
@@ -126,22 +154,27 @@ const AddActionScript = memo(
126
154
  <View style={styles.modalHeader}>
127
155
  <Text style={styles.modalHeaderText}>{t('add_action')}</Text>
128
156
  </View>
129
- {listItem.map((item, index) => (
130
- <View style={styles.rowItem} key={`rowItem-${index}`}>
131
- <TouchableOpacity
132
- onPress={item.onClick}
133
- accessibilityLabel={
134
- AccessibilityLabel.AUTOMATE_LIST_SCRIPT_ACTION
135
- }
136
- >
137
- <View style={styles.wapItem}>
138
- <View style={styles.imageItem}>{item.image}</View>
139
- <Text style={styles.textItem}>{item.text}</Text>
140
- <IconOutline name="right" />
141
- </View>
142
- </TouchableOpacity>
143
- </View>
144
- ))}
157
+ {listItem.map((item, index) => {
158
+ if (item.id === 'sms_alarm' && type === AUTOMATE_TYPE.ONE_TAP) {
159
+ return;
160
+ }
161
+ return (
162
+ <View style={styles.rowItem} key={`rowItem-${index}`}>
163
+ <TouchableOpacity
164
+ onPress={item.onClick}
165
+ accessibilityLabel={
166
+ AccessibilityLabel.AUTOMATE_LIST_SCRIPT_ACTION
167
+ }
168
+ >
169
+ <View style={styles.wapItem}>
170
+ <View style={styles.imageItem}>{item.image}</View>
171
+ <Text style={styles.textItem}>{item.text}</Text>
172
+ <IconOutline name="right" />
173
+ </View>
174
+ </TouchableOpacity>
175
+ </View>
176
+ );
177
+ })}
145
178
  </View>
146
179
  </View>
147
180
  </ModalCustom>
@@ -53,8 +53,7 @@ export default StyleSheet.create({
53
53
  flexDirection: 'row',
54
54
  alignItems: 'center',
55
55
  justifyContent: 'space-between',
56
- marginTop: 16,
57
- marginBottom: 16,
56
+ marginBottom: 7,
58
57
  },
59
58
  editButton: {
60
59
  height: 40,
@@ -184,4 +183,42 @@ export default StyleSheet.create({
184
183
  justifyContent: 'center',
185
184
  alignItems: 'center',
186
185
  },
186
+ width50: {
187
+ width: '50%',
188
+ },
189
+ popoverStyle: {
190
+ width: '100%',
191
+ backgroundColor: Colors.White,
192
+ borderRadius: 5,
193
+ },
194
+ localControl: {
195
+ flexDirection: 'row',
196
+ alignItems: 'center',
197
+ maxWidth: 190,
198
+ marginRight: 5,
199
+ },
200
+ card: {
201
+ marginRight: 0,
202
+ padding: 10,
203
+ },
204
+ marginLeft5: {
205
+ marginLeft: 5,
206
+ },
207
+ textDisable: {
208
+ marginLeft: 15,
209
+ marginTop: 15,
210
+ marginBottom: 15,
211
+ flexDirection: 'row',
212
+ justifyContent: 'space-between',
213
+ },
214
+ listChip: {
215
+ marginLeft: 15,
216
+ marginBottom: 15,
217
+ flexDirection: 'row',
218
+ justifyContent: 'space-between',
219
+ },
220
+ checked: {
221
+ marginRight: 15,
222
+ color: Colors.Primary,
223
+ },
187
224
  });