ordering-ui-react-native 0.21.86 → 0.21.88

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ordering-ui-react-native",
3
- "version": "0.21.86",
3
+ "version": "0.21.88",
4
4
  "description": "Reusable components made in react native",
5
5
  "main": "src/index.tsx",
6
6
  "author": "ordering.inc",
@@ -11,6 +11,7 @@ import {
11
11
  useToast,
12
12
  useLanguage,
13
13
  useUtils,
14
+ useConfig
14
15
  } from 'ordering-components/native';
15
16
  import {
16
17
  CenterView,
@@ -55,6 +56,7 @@ const ProfileUI = (props: ProfileParams) => {
55
56
  const [, t] = useLanguage();
56
57
  const [, { showToast }] = useToast();
57
58
  const [{ optimizeImage }] = useUtils();
59
+ const [{ configs }] = useConfig()
58
60
  const { errors } = useForm();
59
61
  const theme = useTheme();
60
62
 
@@ -70,7 +72,7 @@ const ProfileUI = (props: ProfileParams) => {
70
72
  const [userPhoneNumber, setUserPhoneNumber] = useState<any>(null);
71
73
  const [phoneToShow, setPhoneToShow] = useState('');
72
74
  const [openModal, setOpenModal] = useState(false)
73
-
75
+ const allowDriverUpdateData = user?.level !== 4 || configs?.allow_driver_update_data?.value === "1"
74
76
  useEffect(() => {
75
77
  if (phoneInputData.phone.cellphone) {
76
78
  const codeNumberPhone = phoneInputData.phone.cellphone.slice(0, 3);
@@ -352,14 +354,15 @@ const ProfileUI = (props: ProfileParams) => {
352
354
  height={150}
353
355
  style={{ borderRadius: 7.2 }}
354
356
  />
355
-
356
- <OIconButton
357
- icon={theme.images.general.camera}
358
- borderColor={theme.colors.clear}
359
- iconStyle={{ width: 21, height: 21 }}
360
- style={{ maxWidth: 40 }}
361
- onClick={() => handleImagePicker()}
362
- />
357
+ {allowDriverUpdateData && (
358
+ <OIconButton
359
+ icon={theme.images.general.camera}
360
+ borderColor={theme.colors.clear}
361
+ iconStyle={{ width: 21, height: 21 }}
362
+ style={{ maxWidth: 40 }}
363
+ onClick={() => handleImagePicker()}
364
+ />
365
+ )}
363
366
  </CenterView>
364
367
 
365
368
  {user?.level === 4 && (
@@ -485,7 +488,7 @@ const ProfileUI = (props: ProfileParams) => {
485
488
  />
486
489
  </View>
487
490
  )}
488
- {!validationFields.loading && !isEdit && (
491
+ {!validationFields.loading && !isEdit && allowDriverUpdateData && (
489
492
  <EditButton>
490
493
  <OButton
491
494
  text={t('EDIT', 'Edit')}
@@ -100,7 +100,7 @@ import { PageBanner } from './src/components/PageBanner'
100
100
  import { MultiCart } from './src/components/MultiCart'
101
101
  import { USER_TYPE, ORDER_TYPES } from './src/config/constants'
102
102
  import { DatePickerUI } from './src/components/DatePicker'
103
-
103
+ import { WebsocketStatus } from './src/components/WebsocketStatus';
104
104
  import { OSBill, OSTable, OSCoupon, OSTotal, OSRow } from './src/components/OrderSummary/styles';
105
105
 
106
106
  import { FormInput, FormSide, ButtonsWrapper, LoginWith, OTab, OTabs } from './src/components/LoginForm/styles';
@@ -265,6 +265,7 @@ export {
265
265
  PageBanner,
266
266
  MyOrders,
267
267
  MultiCart,
268
+ WebsocketStatus,
268
269
  ORDER_TYPES,
269
270
  USER_TYPE,
270
271
 
@@ -24,7 +24,7 @@ const AddressDetailsUI = (props: any) => {
24
24
 
25
25
  const styles = StyleSheet.create({
26
26
  productStyle: {
27
- width: width,
27
+ width,
28
28
  height: 151,
29
29
  marginVertical: 10
30
30
  }
@@ -45,7 +45,7 @@ const AddressDetailsUI = (props: any) => {
45
45
  </ADHeader>
46
46
  {!!apiKey && googleMapsUrl && (
47
47
  <ADMap
48
- style={{ marginStart: -40, marginEnd: -40, width: width, flex: 1 }}>
48
+ style={{ width, flex: 1, marginStart: -20, marginEnd: -20, }}>
49
49
  <FastImage
50
50
  style={styles.productStyle}
51
51
  source={{
@@ -5,6 +5,7 @@ import NativeStripeSdk from '@stripe/stripe-react-native/src/NativeStripeSdk'
5
5
  import Picker from 'react-native-country-picker-modal';
6
6
  import MaterialIcons from 'react-native-vector-icons/MaterialIcons'
7
7
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
8
+ import { useIsFocused } from '@react-navigation/native';
8
9
 
9
10
  import ReactNativeHapticFeedback from "react-native-haptic-feedback";
10
11
  import {
@@ -104,6 +105,7 @@ const CheckoutUI = (props: any) => {
104
105
  } = props
105
106
 
106
107
  const theme = useTheme();
108
+ const isFocused = useIsFocused();
107
109
 
108
110
  const styles = StyleSheet.create({
109
111
  btnBackArrow: {
@@ -413,6 +415,7 @@ const CheckoutUI = (props: any) => {
413
415
  }, [])
414
416
 
415
417
  useEffect(() => {
418
+ if (!isFocused) return
416
419
  if (!cartState?.loading && (cartState?.error || typeof cartState?.cart === 'string')) {
417
420
  const error = cartState?.error || typeof cartState.cart === 'string' && cartState.cart
418
421
  if (error) {
@@ -420,7 +423,7 @@ const CheckoutUI = (props: any) => {
420
423
  navigation.navigate('BusinessList')
421
424
  }
422
425
  }
423
- }, [cartState?.error, cartState?.cart, cartState?.loading])
426
+ }, [cartState?.error, cartState?.cart, cartState?.loading, isFocused])
424
427
 
425
428
  useEffect(() => {
426
429
  const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', () => {
@@ -471,7 +474,7 @@ const CheckoutUI = (props: any) => {
471
474
  </TopHeader>
472
475
  </View>
473
476
  </SafeAreaView>
474
- <Container pt={0} forwardRef={containerRef} noPadding onScroll={handleScroll}>
477
+ <Container pt={0} forwardRef={containerRef} showsVerticalScrollIndicator={false} noPadding onScroll={handleScroll}>
475
478
  <View style={styles.wrapperNavbar}>
476
479
  <NavBar
477
480
  hideArrowLeft
@@ -0,0 +1,64 @@
1
+ import React, { useState } from 'react';
2
+ import { useLanguage } from 'ordering-components/native';
3
+ import { useTheme } from 'styled-components/native';
4
+ import { View } from 'react-native';
5
+ import { OText } from '../../shared'
6
+ import { VerticalGiftCardOrdersLayout } from '../VerticalGiftCardOrdersLayout'
7
+
8
+ import {
9
+ Container,
10
+ NoOrdersWrapper
11
+ } from './styles'
12
+
13
+ export const GiftCardOrdersList = (props: any) => {
14
+ const {
15
+ onNavigationRedirect
16
+ } = props;
17
+
18
+ const theme = useTheme();
19
+ const [, t] = useLanguage();
20
+ const [isEmptyPending, setIsEmptyPending] = useState(false);
21
+ const [isEmptySent, setIsEmptySent] = useState(false);
22
+ const [isEmptyRedeemed, setIsEmptyRedeemed] = useState(false);
23
+
24
+ return (
25
+ <Container>
26
+ <VerticalGiftCardOrdersLayout
27
+ title={t('PENDING', 'Pending')}
28
+ defaultStatus='pending'
29
+ setIsEmpty={setIsEmptyPending}
30
+ onNavigationRedirect={onNavigationRedirect}
31
+ />
32
+
33
+ {!isEmptyPending && (
34
+ <View
35
+ style={{
36
+ height: 8,
37
+ backgroundColor: theme.colors.backgroundGray100,
38
+ marginHorizontal: -40,
39
+ }}
40
+ />
41
+ )}
42
+
43
+ <VerticalGiftCardOrdersLayout
44
+ title={t('SENT', 'Sent')}
45
+ defaultStatus='sent'
46
+ setIsEmpty={setIsEmptySent}
47
+ onNavigationRedirect={onNavigationRedirect}
48
+ />
49
+
50
+ <VerticalGiftCardOrdersLayout
51
+ title={t('REDEEMED', 'Redeemed')}
52
+ defaultStatus='activated'
53
+ setIsEmpty={setIsEmptyRedeemed}
54
+ onNavigationRedirect={onNavigationRedirect}
55
+ />
56
+
57
+ {isEmptyPending && isEmptySent && isEmptyRedeemed && (
58
+ <NoOrdersWrapper>
59
+ <OText size={16} color={theme.colors.textNormal}>{t('YOU_DONT_HAVE_CARDS', 'You don\'t have cards')}</OText>
60
+ </NoOrdersWrapper>
61
+ )}
62
+ </Container>
63
+ )
64
+ }
@@ -0,0 +1,8 @@
1
+ import styled from 'styled-components/native';
2
+
3
+ export const Container = styled.View`
4
+ `
5
+
6
+ export const NoOrdersWrapper = styled.View`
7
+ margin-vertical: 20px;
8
+ `
@@ -0,0 +1,101 @@
1
+ import React from 'react';
2
+ import { useLanguage, useUtils, useEvent } from 'ordering-components/native';
3
+ import { useTheme } from 'styled-components/native';
4
+ import { View, StyleSheet } from 'react-native';
5
+ import {
6
+ Placeholder,
7
+ PlaceholderLine,
8
+ Fade
9
+ } from 'rn-placeholder';
10
+ import FastImage from 'react-native-fast-image';
11
+ import { OText } from '../../shared'
12
+
13
+ import {
14
+ CardContainer
15
+ } from './styles'
16
+
17
+ export const SingleGiftCard = (props: any) => {
18
+ const {
19
+ card,
20
+ isSkeleton,
21
+ onNavigationRedirect
22
+ } = props
23
+
24
+ const theme = useTheme()
25
+ const [, t] = useLanguage()
26
+ const [events] = useEvent()
27
+ const [{ parsePrice, optimizeImage, parseDate }] = useUtils()
28
+
29
+ const styles = StyleSheet.create({
30
+ logo: {
31
+ borderRadius: 8,
32
+ width: 64,
33
+ height: 64
34
+ },
35
+ innerContainer: {
36
+ flexDirection: 'row',
37
+ marginBottom: 24
38
+ }
39
+ });
40
+
41
+ const getGiftCardStatus = (status: string) => {
42
+ switch (status) {
43
+ case 'pending':
44
+ return t('PENDING', 'Pending')
45
+ case 'activated':
46
+ return t('REDEEMED', 'Redeemed')
47
+ default:
48
+ return status
49
+ }
50
+ }
51
+
52
+ const handleClickGiftCardOrder = (card: any) => {
53
+ onNavigationRedirect?.('OrderDetails', { orderId: card.order_product?.order_id });
54
+ }
55
+
56
+ return (
57
+ <CardContainer
58
+ activeOpacity={0.8}
59
+ onPress={() => handleClickGiftCardOrder(card)}
60
+ >
61
+ {isSkeleton ? (
62
+ <Placeholder style={{ marginBottom: 10 }} Animation={Fade}>
63
+ <View style={{ flexDirection: 'row' }}>
64
+ <View style={{ width: 64, marginRight: 14 }}>
65
+ <PlaceholderLine
66
+ width={100}
67
+ height={64}
68
+ style={{ marginRight: 10, marginBottom: 10 }}
69
+ />
70
+ </View>
71
+ <Placeholder style={{ paddingTop: 5 }}>
72
+ <PlaceholderLine width={60} style={{ marginBottom: 6}} />
73
+ <PlaceholderLine width={40} style={{ marginBottom: 6 }} />
74
+ <PlaceholderLine width={20} style={{ marginBottom: 0 }} />
75
+ </Placeholder>
76
+ </View>
77
+ </Placeholder>
78
+ ) : (
79
+ <View style={styles.innerContainer}>
80
+ <View>
81
+ <FastImage
82
+ style={styles.logo}
83
+ source={card?.order_product?.images ? {
84
+ uri: optimizeImage(card?.order_product?.images, 'h_86,c_limit')
85
+ } : theme?.images?.dummies?.businessLogo}
86
+ resizeMode={FastImage.resizeMode.cover}
87
+ />
88
+ </View>
89
+ <View style={{ flex: 1, marginLeft: 14 }}>
90
+ <View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
91
+ <OText size={12} lineHeight={18}>{card?.order_product?.name}</OText>
92
+ <OText size={12} lineHeight={18}>{parsePrice(card?.order_product?.price)}</OText>
93
+ </View>
94
+ <OText size={10} color={theme.colors.textSecondary} lineHeight={15}>{parseDate(card?.created_at)}</OText>
95
+ <OText size={10} color={theme.colors.primary}>{getGiftCardStatus(card?.status)}</OText>
96
+ </View>
97
+ </View>
98
+ )}
99
+ </CardContainer>
100
+ )
101
+ }
@@ -0,0 +1,4 @@
1
+ import styled from 'styled-components/native';
2
+
3
+ export const CardContainer = styled.TouchableOpacity`
4
+ `
@@ -0,0 +1,83 @@
1
+ import React, { useEffect } from 'react';
2
+ import { useLanguage, GiftCardOrdersList as GiftCardOrdersListController } from 'ordering-components/native';
3
+ import { useTheme } from 'styled-components/native';
4
+ import {
5
+ Placeholder,
6
+ PlaceholderLine,
7
+ Fade
8
+ } from 'rn-placeholder';
9
+ import { SingleGiftCard } from '../SingleGiftCard';
10
+ import { OButton, OText } from '../../shared';
11
+ import {
12
+ ProductsListContainer,
13
+ SingleGiftCardWrapper,
14
+ WrappButton
15
+ } from './styles'
16
+
17
+ const VerticalGiftCardOrdersLayoutUI = (props: any) => {
18
+ const {
19
+ giftCards,
20
+ paginationProps,
21
+ loadMoreOrders,
22
+ title,
23
+ setIsEmpty,
24
+ onNavigationRedirect
25
+ } = props
26
+
27
+ const theme = useTheme();
28
+ const [, t] = useLanguage()
29
+
30
+ useEffect(() => {
31
+ if (giftCards.loading) return
32
+ if (giftCards.list?.length === 0) setIsEmpty(true)
33
+ }, [giftCards])
34
+
35
+ return (
36
+ <ProductsListContainer>
37
+ {
38
+ giftCards.loading ? (
39
+ <Placeholder Animation={Fade} style={{ marginVertical: 16 }}>
40
+ <PlaceholderLine width={30} height={16} />
41
+ </Placeholder>
42
+ ) : giftCards.list?.length > 0 && (
43
+ <OText size={16} lineHeight={24} weight={'500'} color={theme.colors.textNormal} mBottom={24} style={{ marginTop: 24 }}>{title}</OText>
44
+ )}
45
+ {giftCards.list.map(card => (
46
+ <SingleGiftCardWrapper key={card.id}>
47
+ <SingleGiftCard
48
+ card={card}
49
+ onNavigationRedirect={onNavigationRedirect}
50
+ />
51
+ </SingleGiftCardWrapper>
52
+ ))}
53
+ {giftCards.loading && (
54
+ [...Array(10).keys()].map(i => (
55
+ <SingleGiftCardWrapper key={i}>
56
+ <SingleGiftCard
57
+ isSkeleton
58
+ />
59
+ </SingleGiftCardWrapper>
60
+ ))
61
+ )}
62
+ {paginationProps.totalPages && paginationProps.currentPage < paginationProps.totalPages && (
63
+ <WrappButton>
64
+ <OButton
65
+ onClick={loadMoreOrders}
66
+ text={t('LOAD_MORE_ORDERS', 'Load more orders')}
67
+ imgRightSrc={null}
68
+ textStyle={{ color: theme.colors.white }}
69
+ style={{ borderRadius: 7.6, shadowOpacity: 0 }}
70
+ />
71
+ </WrappButton>
72
+ )}
73
+ </ProductsListContainer>
74
+ )
75
+ }
76
+
77
+ export const VerticalGiftCardOrdersLayout = (props: any) => {
78
+ const giftCardsProps = {
79
+ ...props,
80
+ UIComponent: VerticalGiftCardOrdersLayoutUI
81
+ }
82
+ return <GiftCardOrdersListController {...giftCardsProps} />
83
+ }
@@ -0,0 +1,9 @@
1
+ import styled from 'styled-components/native';
2
+
3
+ export const ProductsListContainer = styled.View`
4
+ `
5
+ export const WrappButton = styled.View`
6
+ margin-bottom: 24px;
7
+ `
8
+ export const SingleGiftCardWrapper = styled.View`
9
+ `
@@ -245,6 +245,14 @@ const MultiCheckoutUI = (props: any) => {
245
245
  setShowTitle(contentOffset.y > 30)
246
246
  }
247
247
 
248
+ const handleGoBack = () => {
249
+ if (navigation?.canGoBack()) {
250
+ navigation.goBack()
251
+ } else {
252
+ navigation.navigate('BottomTab', { screen: 'Cart' })
253
+ }
254
+ }
255
+
248
256
  useEffect(() => {
249
257
  if (validationFields && validationFields?.fields?.checkout) {
250
258
  checkValidationFields()
@@ -289,7 +297,7 @@ const MultiCheckoutUI = (props: any) => {
289
297
  <View style={styles.wrapperNavbar}>
290
298
  <TopHeader>
291
299
  <>
292
- <TopActions onPress={() => navigation?.canGoBack() && navigation.goBack()}>
300
+ <TopActions onPress={() => handleGoBack()}>
293
301
  <IconAntDesign
294
302
  name='arrowleft'
295
303
  size={26}
@@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'
2
2
  import { useLanguage } from 'ordering-components/native';
3
3
  import { View, StyleSheet, RefreshControl, Platform } from 'react-native';
4
4
  import AntDesignIcon from 'react-native-vector-icons/AntDesign'
5
-
5
+ import { GiftCardOrdersList } from '../GiftCard/GiftCardOrdersList'
6
6
  import { OrdersOption } from '../OrdersOption'
7
7
  import { HeaderTitle, OButton, OText } from '../shared'
8
8
  import { ScrollView } from 'react-native-gesture-handler';
@@ -40,7 +40,8 @@ export const MyOrders = (props: any) => {
40
40
  const MyOrdersMenu = [
41
41
  { key: 'orders', value: t('ORDERS', 'Orders'), disabled: false },
42
42
  { key: 'business', value: t('BUSINESS', 'Business'), disabled: hideBusinessTab },
43
- { key: 'products', value: t('PRODUCTS', 'Products'), disabled: hideProductsTab }
43
+ { key: 'products', value: t('PRODUCTS', 'Products'), disabled: hideProductsTab },
44
+ { key: 'giftCards', value: t('GIFT_CARD', 'Gift card'), disabled: false }
44
45
  ]
45
46
  const goToBack = () => navigation?.canGoBack() && navigation.goBack()
46
47
 
@@ -215,7 +216,14 @@ export const MyOrders = (props: any) => {
215
216
  setOrdersLength={setOrdersLength}
216
217
  />
217
218
  )}
219
+
220
+ {selectedOption === 'giftCards' && (
221
+ <View style={{ paddingHorizontal: 20 }}>
222
+ <GiftCardOrdersList
223
+ onNavigationRedirect={props?.onNavigationRedirect}
224
+ />
225
+ </View>
226
+ )}
218
227
  </Container>
219
-
220
228
  )
221
229
  }
@@ -110,7 +110,7 @@ const OrderProgressUI = (props: any) => {
110
110
  setInitialLoaded(true)
111
111
  }, [orderList.loading, initialLoaded])
112
112
 
113
- const progressBarObjt = lastOrder?.delivery_type && lastOrder?.delivery_type === 2 ? getOrderStatuPickUp : getOrderStatus
113
+ const progressBarObjt = (s: any) => lastOrder?.delivery_type && lastOrder?.delivery_type === 2 ? getOrderStatuPickUp(s) : getOrderStatus(s)
114
114
 
115
115
  return (
116
116
  <>
@@ -130,7 +130,7 @@ const OrderProgressUI = (props: any) => {
130
130
  <View style={styles.logoWrapper}>
131
131
  <FastImage
132
132
  style={{ width: 50, height: 50 }}
133
- source={orderList?.orders.length === 1 ? {
133
+ source={orderList?.orders.length === 1 && lastOrder?.business?.logo.includes('http') ? {
134
134
  uri: optimizeImage(lastOrder?.business?.logo, 'h_50,c_limit'),
135
135
  priority: FastImage.priority.normal,
136
136
  } : theme.images.logos.logotype}
@@ -209,6 +209,16 @@ export const OrderProgress = (props: any) => {
209
209
  pageSize: 10,
210
210
  controlType: 'infinity'
211
211
  },
212
+ propsToFetch: [
213
+ 'id',
214
+ 'name',
215
+ 'business',
216
+ 'status',
217
+ 'delivery_type',
218
+ 'delivery_datetime_utc',
219
+ 'delivery_datetime',
220
+ 'reporting_data'
221
+ ],
212
222
  noGiftCardOrders: true
213
223
  }
214
224
 
@@ -353,6 +353,7 @@ export const OrdersOption = (props: OrdersOptionParams) => {
353
353
  const MyOrdersProps = {
354
354
  ...props,
355
355
  UIComponent: OrdersOptionUI,
356
+ noGiftCardOrders: true,
356
357
  orderStatus: getAllOrders
357
358
  ? [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
358
359
  : props.preOrders ? [13] : props.activeOrders
@@ -285,7 +285,7 @@ const SingleOrderCardUI = (props: SingleOrderCardParams) => {
285
285
  ) : (
286
286
  <Price>
287
287
  <OText size={12} lineHeight={18}>
288
- {parsePrice(order?.summary?.total || order?.total)}
288
+ {parsePrice(order?.total)}
289
289
  </OText>
290
290
  </Price>
291
291
  )}
@@ -20,7 +20,7 @@ import MaterialIcons from 'react-native-vector-icons/MaterialIcons'
20
20
  import FontAwesome from 'react-native-vector-icons/FontAwesome'
21
21
  import FastImage from 'react-native-fast-image'
22
22
  import { OAlert } from '../../../../../src/components/shared'
23
-
23
+ import { WebsocketStatus } from '../WebsocketStatus'
24
24
  import {
25
25
  OIcon,
26
26
  OText,
@@ -270,6 +270,7 @@ const ProfileListUI = (props: ProfileParams) => {
270
270
  <View style={{ height: 17 }} />
271
271
  </Actions>
272
272
  </ListWrap>
273
+ <WebsocketStatus />
273
274
  <OAlert
274
275
  open={confirm.open}
275
276
  title={confirm.title}
@@ -0,0 +1,172 @@
1
+ import React, { useState } from 'react'
2
+ import { useLanguage, useUtils, WebsocketStatus as WebsocketStatusController } from 'ordering-components/native'
3
+ import { TouchableOpacity, View, StyleSheet } from 'react-native'
4
+ import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons';
5
+ import { useTheme } from 'styled-components/native'
6
+ import RNRestart from 'react-native-restart'
7
+ import { OModal, OButton, OText, OIcon } from '../shared'
8
+
9
+ import {
10
+ Container,
11
+ ModalContainer,
12
+ ModalTitle,
13
+ StatusItemWrapper,
14
+ StatusText
15
+ } from './styles'
16
+
17
+ const SocketStatusUI = (props: any) => {
18
+ const {
19
+ socketStatus,
20
+ connectedDate
21
+ } = props
22
+
23
+ const theme = useTheme()
24
+ const [, t] = useLanguage()
25
+ const [{ parseDate }] = useUtils()
26
+ const [openModal, setOpenModal] = useState(false)
27
+
28
+ const styles = StyleSheet.create({
29
+ btnBackArrow: {
30
+ borderWidth: 0,
31
+ width: 32,
32
+ height: 32,
33
+ tintColor: theme.colors.textGray,
34
+ backgroundColor: theme.colors.clear,
35
+ borderColor: theme.colors.clear,
36
+ shadowColor: theme.colors.clear,
37
+ paddingLeft: 0,
38
+ paddingRight: 0,
39
+ marginBottom: 30,
40
+ marginTop: 30
41
+ },
42
+ })
43
+
44
+ const getStatusColor = (status: number) => {
45
+ switch (status) {
46
+ case 0:
47
+ return '#FF9922';
48
+ case 1:
49
+ return '#00D27A';
50
+ case 2:
51
+ return '#E63757';
52
+ default:
53
+ return '#FF9922';
54
+ }
55
+ }
56
+
57
+ return (
58
+ <Container>
59
+ <TouchableOpacity
60
+ style={{
61
+ flexDirection: 'row',
62
+ alignItems: 'center',
63
+ justifyContent: 'center',
64
+ backgroundColor: theme.colors.inputChat,
65
+ borderRadius: 7.6,
66
+ marginVertical: 10,
67
+ paddingVertical: 10,
68
+ paddingHorizontal: 15,
69
+ marginHorizontal: 15
70
+ }}
71
+ activeOpacity={0.6}
72
+ onPress={() => setOpenModal(true)}
73
+ >
74
+ <OText
75
+ style={{ color: theme.colors.backArrow, fontSize: 16, marginBottom: 0, lineHeight: 16 }}
76
+ >
77
+ {t('CONNECTION_STATUS', 'Status')}
78
+ </OText>
79
+ <MaterialIcon
80
+ name='circle'
81
+ size={12}
82
+ color={getStatusColor(socketStatus)}
83
+ style={{ marginLeft: 8 }}
84
+ />
85
+ </TouchableOpacity>
86
+
87
+ <OModal
88
+ open={openModal}
89
+ onClose={() => setOpenModal(false)}
90
+ entireModal
91
+ customClose
92
+ >
93
+ <ModalContainer nestedScrollEnabled={true}>
94
+ <TouchableOpacity
95
+ onPress={() => setOpenModal(false)}
96
+ style={styles.btnBackArrow}
97
+ >
98
+ <OIcon src={theme.images.general.arrow_left} color={theme.colors.textGray} />
99
+ </TouchableOpacity>
100
+ <View>
101
+ <ModalTitle>{t('CONNECTION_STATUS', 'Connection status')}</ModalTitle>
102
+ <OText style={{ marginBottom: 20 }}>
103
+ {t('LAST_UPDATE', 'Last update')}: {parseDate(connectedDate)}
104
+ </OText>
105
+ <StatusItemWrapper>
106
+ <MaterialIcon
107
+ name='circle'
108
+ size={12}
109
+ color={getStatusColor(1)}
110
+ style={{ marginTop: 10, marginHorizontal: 8 }}
111
+ />
112
+ <View style={{ marginLeft: 16 }}>
113
+ <StatusText>{t('OK', 'Ok')}</StatusText>
114
+ <OText style={{ color: theme.colors.backArrow, fontSize: 14 }}>{t('WEBSOCKET_OK', 'The websocket works normally.')}</OText>
115
+ </View>
116
+ </StatusItemWrapper>
117
+ <StatusItemWrapper>
118
+ <MaterialIcon
119
+ name='circle'
120
+ size={12}
121
+ color={getStatusColor(0)}
122
+ style={{ marginTop: 10, marginHorizontal: 8 }}
123
+ />
124
+ <View style={{ marginLeft: 16 }}>
125
+ <StatusText>{t('CONNECTING', 'Connecting')}</StatusText>
126
+ <OText style={{ color: theme.colors.backArrow, fontSize: 14 }}>{t('WEBSOCKET_CONNECTING', 'The websocket is connecting.')}</OText>
127
+ </View>
128
+ </StatusItemWrapper>
129
+ <StatusItemWrapper>
130
+ <MaterialIcon
131
+ name='circle'
132
+ size={12}
133
+ color={getStatusColor(2)}
134
+ style={{ marginTop: 10, marginHorizontal: 8 }}
135
+ />
136
+ <View style={{ marginLeft: 16 }}>
137
+ <StatusText>{t('DISCONNECTED', 'Disconnected')}</StatusText>
138
+ <OText style={{ color: theme.colors.backArrow, fontSize: 14 }}>{t('WEBSOCKET_DISCONNECTED', 'The server is slow, please reload.')}</OText>
139
+ </View>
140
+ </StatusItemWrapper>
141
+
142
+ <View style={{ flexDirection: 'row', marginTop: 50 }}>
143
+ <OButton
144
+ onClick={() => setOpenModal(false)}
145
+ bgColor={theme.colors.white}
146
+ borderColor={theme.colors.primary}
147
+ textStyle={{ color: theme.colors.primary }}
148
+ style={{ borderRadius: 8, height: 48 }}
149
+ text={t('CLOSE', 'Close')}
150
+ />
151
+ <OButton
152
+ onClick={() => RNRestart.Restart()}
153
+ borderColor={theme.colors.primary}
154
+ textStyle={{ color: theme.colors.white }}
155
+ style={{ borderRadius: 8, marginLeft: 16, height: 48 }}
156
+ text={t('UPDATE', 'Update')}
157
+ />
158
+ </View>
159
+ </View>
160
+ </ModalContainer>
161
+ </OModal>
162
+ </Container>
163
+ )
164
+ }
165
+
166
+ export const WebsocketStatus = (props: any) => {
167
+ const socketProps = {
168
+ ...props,
169
+ UIComponent: SocketStatusUI
170
+ }
171
+ return <WebsocketStatusController {...socketProps} />
172
+ }
@@ -0,0 +1,28 @@
1
+ import styled from 'styled-components/native'
2
+
3
+ export const Container = styled.View`
4
+ display: flex;
5
+ flex-direction: column;
6
+ `
7
+ export const ModalContainer = styled.ScrollView`
8
+ padding: 0px 30px;
9
+ `
10
+ export const ModalTitle = styled.Text`
11
+ font-family: Poppins;
12
+ font-style: normal;
13
+ font-weight: bold;
14
+ font-size: 20px;
15
+ color: ${(props: any) => props.theme.colors.textGray};
16
+ margin-bottom: 10px;
17
+ `
18
+ export const StatusItemWrapper = styled.View`
19
+ flex-direction: row;
20
+ margin-bottom: 16px;
21
+ `
22
+ export const StatusText = styled.Text`
23
+ font-family: Poppins;
24
+ font-style: normal;
25
+ font-weight: 500;
26
+ font-size: 18px;
27
+ color: ${(props: any) => props.theme.colors.textGray};
28
+ `