ordering-ui-react-native 0.22.54 → 0.22.55-release

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 (130) hide show
  1. package/package.json +5 -7
  2. package/src/DeliveryApp.tsx +1 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/Checkout/index.tsx +40 -39
  5. package/src/components/VerifyPhone/styles.tsx +1 -2
  6. package/src/context/OfflineActions/index.tsx +236 -0
  7. package/src/providers/AlertProvider.tsx +3 -1
  8. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
  9. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
  10. package/themes/business/src/components/BusinessController/index.tsx +8 -3
  11. package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
  12. package/themes/business/src/components/Chat/index.tsx +15 -3
  13. package/themes/business/src/components/DriverMap/index.tsx +44 -33
  14. package/themes/business/src/components/FloatingButton/index.tsx +3 -2
  15. package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
  16. package/themes/business/src/components/LoginForm/index.tsx +123 -98
  17. package/themes/business/src/components/LogoutButton/index.tsx +13 -4
  18. package/themes/business/src/components/MapView/index.tsx +22 -17
  19. package/themes/business/src/components/NewOrderNotification/index.tsx +25 -14
  20. package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
  21. package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
  22. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +155 -45
  23. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
  24. package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
  25. package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
  26. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
  27. package/themes/business/src/components/OrderSummary/index.tsx +271 -176
  28. package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
  29. package/themes/business/src/components/OrdersOption/index.tsx +345 -231
  30. package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
  31. package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
  32. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +30 -18
  33. package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
  34. package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
  35. package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
  36. package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
  37. package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
  38. package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
  39. package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
  41. package/themes/business/src/components/StoresList/index.tsx +2 -2
  42. package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
  43. package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
  44. package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
  45. package/themes/business/src/config/currency.tsx +1010 -0
  46. package/themes/business/src/hooks/useLocation.tsx +16 -12
  47. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  48. package/themes/business/src/types/index.tsx +22 -7
  49. package/themes/business/src/utils/index.tsx +28 -3
  50. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  51. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  52. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  53. package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
  54. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  55. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  56. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  57. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  58. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  59. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  60. package/themes/original/index.tsx +9 -1
  61. package/themes/original/src/components/AddressForm/index.tsx +19 -8
  62. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  63. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  64. package/themes/original/src/components/BusinessController/index.tsx +4 -2
  65. package/themes/original/src/components/BusinessItemAccordion/index.tsx +10 -4
  66. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
  68. package/themes/original/src/components/BusinessListingSearch/index.tsx +8 -13
  69. package/themes/original/src/components/BusinessPreorder/index.tsx +34 -15
  70. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  71. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  72. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  73. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  74. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  75. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  76. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  77. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  78. package/themes/original/src/components/Cart/index.tsx +48 -13
  79. package/themes/original/src/components/CartContent/index.tsx +2 -3
  80. package/themes/original/src/components/Checkout/index.tsx +104 -80
  81. package/themes/original/src/components/Favorite/index.tsx +1 -5
  82. package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
  83. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  84. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  85. package/themes/original/src/components/Home/index.tsx +35 -16
  86. package/themes/original/src/components/LoginForm/index.tsx +12 -5
  87. package/themes/original/src/components/MessageListing/index.tsx +1 -1
  88. package/themes/original/src/components/Messages/index.tsx +20 -13
  89. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  90. package/themes/original/src/components/MomentOption/index.tsx +72 -51
  91. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  92. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +1 -0
  93. package/themes/original/src/components/MultiCheckout/index.tsx +55 -26
  94. package/themes/original/src/components/MyOrders/index.tsx +2 -2
  95. package/themes/original/src/components/NavBar/index.tsx +6 -2
  96. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  97. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
  98. package/themes/original/src/components/OrderDetails/index.tsx +44 -19
  99. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  100. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  101. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  102. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
  103. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  104. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  105. package/themes/original/src/components/PaymentOptions/index.tsx +462 -459
  106. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  107. package/themes/original/src/components/ProductForm/ActionButton.tsx +6 -10
  108. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  109. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  110. package/themes/original/src/components/ServiceForm/index.tsx +1 -1
  111. package/themes/original/src/components/SignupForm/index.tsx +41 -24
  112. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
  113. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  114. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  115. package/themes/original/src/components/StripeCardsList/index.tsx +16 -3
  116. package/themes/original/src/components/StripeElementsForm/index.tsx +6 -3
  117. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  118. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  119. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
  120. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  121. package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
  122. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  123. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  124. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  125. package/themes/original/src/components/shared/OButton.tsx +2 -2
  126. package/themes/original/src/components/shared/OInput.tsx +4 -8
  127. package/themes/original/src/components/shared/OModal.tsx +7 -2
  128. package/themes/original/src/types/index.tsx +12 -4
  129. package/themes/original/src/utils/index.tsx +29 -0
  130. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,33 +1,53 @@
1
- import React, { useEffect } from 'react';
2
- import { useLanguage, useOrder, useConfig } from 'ordering-components/native';
1
+ import React from 'react';
2
+ import { useLanguage, useOrder, useConfig, useSession, useApi, ToastType, useToast } from 'ordering-components/native';
3
3
  import { useTheme } from 'styled-components/native';
4
4
  import { StyleSheet, View } from 'react-native';
5
5
  import { OButton, OIcon, OText } from '../shared';
6
6
  import { LanguageSelector } from '../LanguageSelector';
7
7
  import { TouchableOpacity } from 'react-native-gesture-handler';
8
8
  import { useWindowDimensions, Platform } from 'react-native';
9
+ import uuid from 'react-native-uuid';
9
10
 
10
11
  export const Home = (props: any) => {
11
12
  const { onNavigationRedirect, businessSlug } = props;
12
13
  const { width, height } = useWindowDimensions();
13
14
  const [, t] = useLanguage();
14
- const [orderState] = useOrder();
15
+ const [orderState, { handleOrderStateLoading, setStateInitialValues }] = useOrder();
15
16
  const [{ configs }] = useConfig()
17
+ const [, { login }] = useSession()
18
+ const [ordering] = useApi()
19
+ const [, { showToast }] = useToast()
16
20
 
17
21
  const theme = useTheme();
18
- const unaddressedTypes = configs?.unaddressed_order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
19
- const isAllowUnaddressOrderType = unaddressedTypes.includes(orderState?.options?.type)
20
22
 
21
- useEffect(() => {
22
- if (isAllowUnaddressOrderType) {
23
- onNavigationRedirect(!!businessSlug ? 'Business' : 'BusinessList')
23
+ const handleCreateGuestUser = async (values: any) => {
24
+ try {
25
+ await handleOrderStateLoading(true)
26
+ const { content: { error, result } } = await ordering.users().save(values)
27
+ if (!error) {
28
+ await login({
29
+ user: result,
30
+ token: result.session?.access_token
31
+ })
32
+ } else {
33
+ showToast(ToastType.Error, t('ERROR_CREATING_GUEST_USER', 'Error creating guest users'))
34
+ }
35
+ await handleOrderStateLoading(false)
36
+ } catch (err) {
37
+ await handleOrderStateLoading(false)
38
+ showToast(ToastType.Error, t('ERROR_CREATING_GUEST_USER', 'Error creating guest users'))
24
39
  }
25
- }, [isAllowUnaddressOrderType])
40
+ }
41
+
42
+ const handleUpdateGuest = async () => {
43
+ const guestToken = uuid.v4()
44
+ if (guestToken) await handleCreateGuestUser({ guest_token: guestToken })
45
+ }
26
46
 
27
47
  return (
28
48
  <View style={styles.container}>
29
49
  <View>
30
- <View style={{ paddingTop: (height <= 756 && Platform.OS !== 'ios') ? (height * 0.05) : 0 }}>
50
+ <View style={{paddingTop: (height <= 756 && Platform.OS !== 'ios') ? (height * 0.05) : 0 }}>
31
51
  <LanguageSelector />
32
52
  </View>
33
53
  <OIcon
@@ -53,6 +73,7 @@ export const Home = (props: any) => {
53
73
  isCircle={false}
54
74
  onClick={() => onNavigationRedirect('Login')}
55
75
  imgRightSrc={null}
76
+ isDisabled={orderState?.loading}
56
77
  />
57
78
  <OButton
58
79
  text={t('SIGNUP', 'Signup')}
@@ -62,15 +83,13 @@ export const Home = (props: any) => {
62
83
  textStyle={{ color: 'black' }}
63
84
  onClick={() => onNavigationRedirect('Signup')}
64
85
  imgRightSrc={null}
86
+ isDisabled={orderState?.loading}
65
87
  />
66
88
  <TouchableOpacity
89
+ disabled={orderState?.loading}
67
90
  style={{ ...styles.textLink, marginTop: 12 }}
68
- onPress={() =>
69
- orderState?.options?.address?.address
70
- ? onNavigationRedirect(!!businessSlug ? 'Business' : 'BusinessList', { isGuestUser: true })
71
- : onNavigationRedirect('AddressForm', { isGuestUser: true })
72
- }>
73
- <OText weight="normal" size={18} color={theme.colors.white}>
91
+ onPress={() => handleUpdateGuest()}>
92
+ <OText weight="normal" size={18} color={orderState?.loading ? '#ccc' : theme.colors.white}>
74
93
  {t('CONTINUE_AS_GUEST', 'Continue as guest')}
75
94
  </OText>
76
95
  </TouchableOpacity>
@@ -73,7 +73,8 @@ const LoginFormUI = (props: LoginParams) => {
73
73
  generateOtpCode,
74
74
  useLoginOtpEmail,
75
75
  useLoginOtpCellphone,
76
- isGuest
76
+ isGuest,
77
+ setCellphoneStartZero
77
78
  } = props;
78
79
 
79
80
  const [, { showToast }] = useToast();
@@ -106,9 +107,9 @@ const LoginFormUI = (props: LoginParams) => {
106
107
 
107
108
  const [isCheckingCode, setCheckingCode] = useState(false)
108
109
 
109
- const googleLoginEnabled = configs?.google_login_enabled?.value === '1' || !configs?.google_login_enabled?.enabled
110
- const facebookLoginEnabled = configs?.facebook_login_enabled?.value === '1' || !configs?.facebook_login_enabled?.enabled
111
- const appleLoginEnabled = Platform.OS === 'ios' && (configs?.apple_login_enabled?.value === '1' || !configs?.apple_login_enabled?.enabled)
110
+ const googleLoginEnabled = configs?.google_login_enabled?.value === '1'
111
+ const facebookLoginEnabled = configs?.facebook_login_enabled?.value === '1'
112
+ const appleLoginEnabled = Platform.OS === 'ios' && (configs?.apple_login_enabled?.value === '1')
112
113
 
113
114
  const loginStyle = StyleSheet.create({
114
115
  btnOutline: {
@@ -300,6 +301,11 @@ const LoginFormUI = (props: LoginParams) => {
300
301
  setTabLayouts(_tabLayouts)
301
302
  }
302
303
 
304
+ const handleChangePhoneNumber = (number: any, rawNumber: any) => {
305
+ setPhoneInputData(number)
306
+ setCellphoneStartZero && setCellphoneStartZero(rawNumber?.number && rawNumber?.countryCallingCode ? rawNumber?.number : null)
307
+ }
308
+
303
309
  useEffect(() => {
304
310
  if (configs && Object.keys(configs).length > 0 && enableReCaptcha) {
305
311
  if (configs?.security_recaptcha_type?.value === 'v3' &&
@@ -586,7 +592,7 @@ const LoginFormUI = (props: LoginParams) => {
586
592
  <View style={{ marginBottom: 28 }}>
587
593
  <PhoneInputNumber
588
594
  data={phoneInputData}
589
- handleData={(val: any) => setPhoneInputData(val)}
595
+ handleData={handleChangePhoneNumber}
590
596
  textInputProps={{
591
597
  returnKeyType: 'next',
592
598
  onSubmitEditing: () => passwordRef?.current?.focus?.(),
@@ -630,6 +636,7 @@ const LoginFormUI = (props: LoginParams) => {
630
636
  />
631
637
  )
632
638
  }
639
+ autoCapitalize='none'
633
640
  value={value}
634
641
  forwardRef={passwordRef}
635
642
  onChange={(val: any) => onChange(val)}
@@ -200,7 +200,7 @@ export const OrderListing = (props: OrdersOptionParams) => {
200
200
  const OrderListingProps = {
201
201
  ...props,
202
202
  UIComponent: OrdersOptionUI,
203
- orderStatus: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
203
+ orderStatus: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
204
204
  useDefualtSessionManager: true,
205
205
  paginationSettings: {
206
206
  initialPage: 1,
@@ -1,6 +1,6 @@
1
1
  import React, { useEffect, useState } from 'react'
2
2
  import Clipboard from '@react-native-clipboard/clipboard';
3
- import { Messages as MessagesController, useSession, useUtils, useLanguage, ToastType, useToast } from 'ordering-components/native'
3
+ import { Messages as MessagesController, useSession, useUtils, useLanguage, ToastType, useToast, useConfig } from 'ordering-components/native'
4
4
  import { useTheme } from 'styled-components/native';
5
5
  import { launchImageLibrary } from 'react-native-image-picker'
6
6
  import { GiftedChat, Actions, ActionsProps, InputToolbar, Composer, Send, Bubble, MessageImage, InputToolbarProps, ComposerProps } from 'react-native-gifted-chat'
@@ -39,7 +39,10 @@ const ORDER_STATUS: any = {
39
39
  20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
40
40
  21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
41
41
  22: 'ORDER_LOOKING_FOR_DRIVER',
42
- 23: 'ORDER_DRIVER_ON_WAY'
42
+ 23: 'ORDER_DRIVER_ON_WAY',
43
+ 24: 'ORDER_DRIVER_WAITING_FOR_ORDER',
44
+ 25: 'ORDER_ACCEPTED_BY_DRIVER_COMPANY',
45
+ 26: 'ORDER_DRIVER_ARRIVED_CUSTOMER'
43
46
  }
44
47
 
45
48
  const filterSpecialStatus = ['prepared_in', 'delivered_in', 'delivery_datetime']
@@ -52,7 +55,6 @@ const MessagesUI = (props: MessagesParams) => {
52
55
  messages,
53
56
  image,
54
57
  message,
55
- messagesToShow,
56
58
  sendMessage,
57
59
  setCanRead,
58
60
  setMessage,
@@ -67,13 +69,14 @@ const MessagesUI = (props: MessagesParams) => {
67
69
  } = props
68
70
 
69
71
  const [{ user }] = useSession()
72
+ const [{ configs }] = useConfig()
70
73
  const [{ parseDate }] = useUtils()
71
74
  const [, t] = useLanguage()
72
75
  const [, { showToast }] = useToast();
73
76
 
74
77
  const [formattedMessages, setFormattedMessages] = useState<Array<any>>([])
75
78
  const [isKeyboardShow, setIsKeyboardShow] = useState(false)
76
- const previousStatus = [1, 2, 5, 6, 10, 11, 12, 16, 17]
79
+ const previousStatus = [1, 2, 5, 6, 10, 11, 12, 15, 16, 17]
77
80
  const chatDisabled = previousStatus.includes(order?.status)
78
81
  const { height } = useWindowDimensions();
79
82
  const { top, bottom } = useSafeAreaInsets();
@@ -142,23 +145,24 @@ const MessagesUI = (props: MessagesParams) => {
142
145
  }
143
146
 
144
147
  useEffect(() => {
145
- let newMessages: Array<any> = []
148
+ const newMessages: Array<any> = []
146
149
  const _console = `${t('ORDER_PLACED_FOR', 'Order placed for')} ${parseDate(order?.created_at)} ${t('VIA', 'Via')} ${order?.app_id ? t(order?.app_id.toUpperCase(), order?.app_id) : t('OTHER', 'Other')}`
147
150
  const firstMessage = {
148
151
  _id: 0,
152
+ type: 0,
149
153
  text: _console,
150
154
  createdAt: parseDate(order?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
151
155
  system: true
152
156
  }
153
- const newMessage: any = [];
154
157
  messages.messages.map((message: any) => {
155
158
  if (message.change?.attribute === 'driver_group_id') return
156
- if (business && message.type !== 0 && (messagesToShow?.messages?.length || message?.can_see?.includes('2'))) {
157
- newMessage.push({
159
+ if (business && message.type !== 0 && (props?.messagesToShow?.messages?.length || message?.can_see?.includes('2'))) {
160
+ newMessages.push({
158
161
  _id: message?.id,
159
162
  text: message.type === 1 ? messageConsole(message) : message.comment,
160
163
  createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
161
164
  image: message.source,
165
+ type: message.type,
162
166
  system: message.type === 1,
163
167
  user: {
164
168
  _id: message.author && message.author.id,
@@ -168,12 +172,13 @@ const MessagesUI = (props: MessagesParams) => {
168
172
  });
169
173
  }
170
174
 
171
- if (driver && message.type !== 0 && (messagesToShow?.messages?.length || message?.can_see?.includes('4'))) {
172
- newMessage.push({
175
+ if (driver && message.type !== 0 && (props?.messagesToShow?.messages?.length || message?.can_see?.includes('4'))) {
176
+ newMessages.push({
173
177
  _id: message?.id,
174
178
  text: message.type === 1 ? messageConsole(message) : message.comment,
175
179
  createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
176
180
  image: message.source,
181
+ type: message.type,
177
182
  system: message.type === 1,
178
183
  user: {
179
184
  _id: message.author && message.author.id,
@@ -184,10 +189,12 @@ const MessagesUI = (props: MessagesParams) => {
184
189
  }
185
190
 
186
191
  if (message.type === 0) {
187
- newMessage.push(firstMessage);
192
+ newMessages.push(firstMessage);
188
193
  }
189
194
  })
190
- setFormattedMessages(newMessage.reverse())
195
+ let _arrayMessages = [...newMessages.reverse()]
196
+
197
+ setFormattedMessages(_arrayMessages);
191
198
  }, [messages.messages.length, business, driver])
192
199
 
193
200
  useEffect(() => {
@@ -461,7 +468,7 @@ const MessagesUI = (props: MessagesParams) => {
461
468
  active={business}
462
469
  >
463
470
  <OIcon
464
- url={order?.business?.logo || theme.images.dummies.businessLogo}
471
+ url={order?.business?.logo}
465
472
  width={32}
466
473
  height={32}
467
474
  style={{ borderRadius: 32 }}
@@ -0,0 +1,56 @@
1
+ import React from 'react'
2
+ import { Pressable } from 'react-native'
3
+ import {
4
+ TimeItem,
5
+ } from './styles'
6
+ import { OIcon, OText } from '../shared'
7
+ import { useTheme } from 'styled-components/native'
8
+
9
+ const timeListItemPropsAreEqual = (prevProps: any, nextProps: any) => {
10
+ return JSON.stringify(prevProps.time) === JSON.stringify(nextProps.time) &&
11
+ JSON.stringify(prevProps.selectedTime) === JSON.stringify(nextProps.selectedTime) &&
12
+ JSON.stringify(prevProps.cateringPreorder) === JSON.stringify(nextProps.cateringPreorder)
13
+ }
14
+ export const TimeListItem = React.memo((props : any) => {
15
+ const {
16
+ time,
17
+ selectedTime,
18
+ handleChangeTimeSelected,
19
+ cateringPreorder
20
+ } = props
21
+ const theme = useTheme()
22
+
23
+ return (
24
+ <Pressable onPress={() => handleChangeTimeSelected(time.value)}>
25
+ <TimeItem
26
+ active={selectedTime === time.value}
27
+ cateringPreorder={cateringPreorder}
28
+ >
29
+ {cateringPreorder && (
30
+ <>
31
+ {selectedTime === time.value ? (
32
+ <OIcon
33
+ src={theme.images.general.option_checked}
34
+ width={18}
35
+ style={{ marginEnd: 24, bottom: 2 }}
36
+ />
37
+ ) : (
38
+ <OIcon
39
+ src={theme.images.general.option_normal}
40
+ width={18}
41
+ style={{ marginEnd: 24, bottom: 2 }}
42
+ />
43
+ )}
44
+ </>
45
+ )}
46
+ <OText
47
+ size={cateringPreorder ? 18 : 16}
48
+ color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
49
+ style={{
50
+ lineHeight: 24
51
+ }}
52
+ >{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
53
+ </TimeItem>
54
+ </Pressable>
55
+ )
56
+ }, timeListItemPropsAreEqual)
@@ -29,7 +29,8 @@ import {
29
29
  TimeItem
30
30
  } from './styles';
31
31
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
32
- import { locale, monthsEnum } from '../../utils';
32
+ import { monthsEnum, setLocalMoment } from '../../utils';
33
+ import { TimeListItem } from './TimeListItem';
33
34
 
34
35
  const MomentOptionUI = (props: MomentOptionParams) => {
35
36
  const {
@@ -161,6 +162,8 @@ const MomentOptionUI = (props: MomentOptionParams) => {
161
162
  const [datesWhitelist, setDateWhitelist] = useState<any>([{ start: null, end: null }])
162
163
  const [selectDate, setSelectedDate] = useState<any>(dateSelected)
163
164
  const [timeList, setTimeList] = useState<any>(hoursList)
165
+ const [nextTime, setNextTime] = useState(null)
166
+
164
167
  const goToBack = () => navigation?.canGoBack() && navigation.goBack();
165
168
 
166
169
  const _handleAsap = () => {
@@ -256,7 +259,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
256
259
  setDateWhitelist([{ start: _minDate, end: _maxDate }])
257
260
  }
258
261
  }
259
- }, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays, cateringPreorder])
262
+ }, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays])
260
263
 
261
264
  useEffect(() => {
262
265
  if (dateSelected) {
@@ -278,13 +281,21 @@ const MomentOptionUI = (props: MomentOptionParams) => {
278
281
  let _timeLists = []
279
282
  const schedule = business && getActualSchedule()
280
283
  if (!schedule && business) {
284
+ setTimeList([])
281
285
  return
282
286
  }
283
287
  _timeLists = hoursList
284
- .filter(hour => (!business || schedule?.lapses?.some((lapse: any) =>
285
- moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${lapse.open.hour}:${lapse.open.minute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${lapse.close.hour}:${lapse.close.minute}`))) &&
286
- moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`) &&
287
- (moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder))
288
+ .filter(hour => {
289
+ return (Object.keys(business || {})?.length === 0 || schedule?.lapses?.some((lapse: any) => {
290
+ const openHour = lapse.open.hour < 10 ? `0${lapse.open.hour}` : lapse.open.hour
291
+ const openMinute = lapse.open.minute < 10 ? `0${lapse.open.minute}` : lapse.open.minute
292
+ const closeHour = lapse.close.hour < 10 ? `0${lapse.close.hour}` : lapse.close.hour
293
+ const closeMinute = lapse.close.minute < 10 ? `0${lapse.close.minute}` : lapse.close.minute
294
+ return moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${openHour}:${openMinute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${closeHour}:${closeMinute}`)
295
+ })) &&
296
+ (moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`)) &&
297
+ (moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder)
298
+ })
288
299
  .map(hour => {
289
300
  return {
290
301
  value: hour.startTime,
@@ -321,7 +332,28 @@ const MomentOptionUI = (props: MomentOptionParams) => {
321
332
  }
322
333
  }))
323
334
  }
324
- }, [dateSelected, JSON.stringify(hoursList), JSON.stringify(datesWhitelist), cateringPreorder, JSON.stringify(business)])
335
+ }, [dateSelected, hoursList?.length, JSON.stringify(datesWhitelist), JSON.stringify(business)])
336
+
337
+ useEffect(() => {
338
+ setLocalMoment(moment, t)
339
+ }, [])
340
+
341
+ useEffect(() => {
342
+ if (preorderMinimumDays === 0 && preorderLeadTime === 0) return
343
+ const isToday = dateSelected === moment().format('YYYY-MM-DD')
344
+ if (isCart && isToday && !orderState?.loading && timeList?.length > 0) {
345
+ setNextTime(timeList?.[0] ?? null)
346
+ }
347
+ }, [timeList?.length])
348
+
349
+ useEffect(() => {
350
+ if (nextTime?.value && timeList?.length > 0 && isCart && !orderState?.loading && !(preorderMinimumDays === 0 && preorderLeadTime === 0)) {
351
+ const notime = timeList?.filter((_: any, i: number) => i !== 0)?.find?.((time: any) => time?.value === timeSelected)
352
+ if (!notime) {
353
+ handleChangeTime(nextTime?.value)
354
+ }
355
+ }
356
+ }, [nextTime?.value])
325
357
 
326
358
  return (
327
359
  <>
@@ -345,7 +377,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
345
377
  titleWrapStyle={{ paddingHorizontal: 0 }}
346
378
  />
347
379
  )}
348
- {(preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder && (
380
+ {((preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder) && (
349
381
  <WrapSelectOption
350
382
  onPress={() => _handleAsap()}
351
383
  disabled={orderState.loading} style={{ alignItems: 'flex-start' }}>
@@ -394,28 +426,27 @@ const MomentOptionUI = (props: MomentOptionParams) => {
394
426
  <View style={{ flex: 1 }}>
395
427
  {selectDate && datesWhitelist[0]?.start !== null && (
396
428
  <CalendarStrip
397
- locale={locale}
398
429
  scrollable
399
430
  style={styles.calendar}
400
431
  calendarHeaderContainerStyle={styles.calendarHeaderContainer}
401
432
  calendarHeaderStyle={styles.calendarHeader}
402
- dateNumberStyle={styles.dateNumber}
403
- dateNameStyle={styles.dateName}
404
433
  iconContainer={{ flex: 0.1 }}
405
- highlightDateNameStyle={styles.highlightDateName}
406
- highlightDateNumberStyle={styles.highlightDateNumber}
407
434
  dayContainerStyle={{ height: '100%' }}
408
435
  highlightDateContainerStyle={{ height: '100%' }}
409
436
  calendarHeaderFormat='MMMM, YYYY'
410
437
  iconStyle={{ borderWidth: 1 }}
411
438
  selectedDate={dateSelected}
412
439
  datesWhitelist={datesWhitelist}
440
+ highlightDateNumberStyle={styles.highlightDateNumber}
441
+ highlightDateNameStyle={styles.highlightDateName}
413
442
  minDate={moment()}
414
443
  maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
415
444
  disabledDateNameStyle={styles.disabledDateName}
416
445
  disabledDateNumberStyle={styles.disabledDateNumber}
417
446
  disabledDateOpacity={0.6}
418
- onDateSelected={(date) => onSelectDate(date)}
447
+ dateNumberStyle={styles.dateNumber}
448
+ dateNameStyle={styles.dateName}
449
+ onDateSelected={(date: any) => onSelectDate(date)}
419
450
  leftSelector={<LeftSelector />}
420
451
  rightSelector={<RightSelector />}
421
452
  />
@@ -423,44 +454,34 @@ const MomentOptionUI = (props: MomentOptionParams) => {
423
454
  </View>
424
455
  )}
425
456
  <TimeListWrapper nestedScrollEnabled={true} cateringPreorder={cateringPreorder}>
426
- <TimeContentWrapper>
427
- {timeList.map((time: any, i: number) => (
428
- <Pressable key={i} onPress={() => handleChangeTimeSelected(time.value)}>
429
- <TimeItem
430
- active={selectedTime === time.value}
457
+ {timeList?.length > 0 ? (
458
+ <TimeContentWrapper>
459
+ {timeList.map((time: any, i: number) => (
460
+ <TimeListItem
461
+ key={i}
462
+ time={time}
463
+ selectedTime={selectedTime}
464
+ handleChangeTimeSelected={handleChangeTimeSelected}
431
465
  cateringPreorder={cateringPreorder}
432
- >
433
- {cateringPreorder && (
434
- <>
435
- {selectedTime === time.value ? (
436
- <OIcon
437
- src={theme.images.general.option_checked}
438
- width={18}
439
- style={{ marginEnd: 24, bottom: 2 }}
440
- />
441
- ) : (
442
- <OIcon
443
- src={theme.images.general.option_normal}
444
- width={18}
445
- style={{ marginEnd: 24, bottom: 2 }}
446
- />
447
- )}
448
- </>
449
- )}
450
- <OText
451
- size={cateringPreorder ? 18 : 16}
452
- color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
453
- style={{
454
- lineHeight: 24
455
- }}
456
- >{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
457
- </TimeItem>
458
- </Pressable>
459
- ))}
460
- {timeList.length % 3 === 2 && (
461
- <TimeItem style={{ backgroundColor: 'transparent' }} />
462
- )}
463
- </TimeContentWrapper>
466
+ />
467
+ ))}
468
+ {timeList.length % 3 === 2 && (
469
+ <TimeItem style={{ backgroundColor: 'transparent' }} />
470
+ )}
471
+ </TimeContentWrapper>
472
+ ) : (
473
+ <OText
474
+ size={16}
475
+ style={{
476
+ fontWeight: '600',
477
+ lineHeight: 24,
478
+ marginBottom: 12,
479
+ textAlign: 'center'
480
+ }}
481
+ >
482
+ {t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment')}
483
+ </OText>
484
+ )}
464
485
  </TimeListWrapper>
465
486
  </OrderTimeWrapper>
466
487
  )}
@@ -5,7 +5,8 @@ import { useTheme } from 'styled-components/native'
5
5
  import {
6
6
  MomentOption as MomentOptionController,
7
7
  useConfig,
8
- useUtils
8
+ useUtils,
9
+ useLanguage
9
10
  } from 'ordering-components/native'
10
11
  import { useSafeAreaInsets } from 'react-native-safe-area-context'
11
12
  import IconAntDesign from 'react-native-vector-icons/AntDesign'
@@ -26,6 +27,7 @@ const MomentSelectorUI = (props: any) => {
26
27
  const { top } = useSafeAreaInsets()
27
28
  const [{ configs }] = useConfig()
28
29
  const [{ parseTime }] = useUtils()
30
+ const [, t] = useLanguage()
29
31
 
30
32
  const [customizedDateList, setCustomizedDateList] = useState([])
31
33
  const [customizedTimeList, setCustomizedTimeList] = useState([])
@@ -130,6 +132,7 @@ const MomentSelectorUI = (props: any) => {
130
132
  <View style={styles.selectWrapper}>
131
133
  <SelectDropdown
132
134
  defaultValue={customizedTimeList?.find((item: any) => item.key === timeSelected)}
135
+ defaultButtonText={t('SELECT_A_TIME_OPTION', 'Select an option')}
133
136
  data={customizedTimeList}
134
137
  onSelect={(selectedItem, index) => {
135
138
  handleChangeTime(selectedItem.key)
@@ -194,4 +197,4 @@ export const MomentSelector = (props: any) => {
194
197
  maxDate: currentDate
195
198
  }
196
199
  return <MomentOptionController {...businessPreorderProps} />
197
- }
200
+ }
@@ -224,6 +224,7 @@ const MultiCartsPaymethodsAndWalletsUI = (props: any) => {
224
224
  clientSecret={props.clientSecret}
225
225
  onPaymentChange={handlePaymethodDataChange}
226
226
  newCardAdded={newCardAdded}
227
+ addNewCardAsDefault
227
228
  />
228
229
  </View>
229
230
  )}