ordering-ui-react-native 0.22.51-test1 → 0.22.52-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 (164) 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 +42 -25
  19. package/themes/business/src/components/NewOrderNotification/index.tsx +37 -18
  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/components/shared/OTextarea.tsx +8 -9
  46. package/themes/business/src/config/currency.tsx +1010 -0
  47. package/themes/business/src/hooks/useLocation.tsx +16 -12
  48. package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
  49. package/themes/business/src/types/index.tsx +22 -7
  50. package/themes/business/src/utils/index.tsx +28 -3
  51. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  52. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  53. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
  55. package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
  56. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  57. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  58. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  59. package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
  60. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  61. package/themes/original/index.tsx +9 -1
  62. package/themes/original/src/components/AddressForm/index.tsx +19 -19
  63. package/themes/original/src/components/AddressList/index.tsx +0 -13
  64. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  65. package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
  66. package/themes/original/src/components/BusinessItemAccordion/index.tsx +14 -6
  67. package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
  68. package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +8 -6
  69. package/themes/original/src/components/BusinessListingSearch/index.tsx +1 -2
  70. package/themes/original/src/components/BusinessPreorder/index.tsx +46 -30
  71. package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
  72. package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
  73. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  74. package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
  75. package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
  76. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
  77. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
  78. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  79. package/themes/original/src/components/Cart/index.tsx +49 -15
  80. package/themes/original/src/components/CartContent/index.tsx +2 -4
  81. package/themes/original/src/components/Checkout/index.tsx +109 -88
  82. package/themes/original/src/components/CitiesControl/index.tsx +0 -3
  83. package/themes/original/src/components/CouponControl/index.tsx +1 -3
  84. package/themes/original/src/components/DriverTips/index.tsx +1 -3
  85. package/themes/original/src/components/Favorite/index.tsx +1 -10
  86. package/themes/original/src/components/FavoriteList/index.tsx +0 -1
  87. package/themes/original/src/components/ForgotPasswordForm/index.tsx +5 -12
  88. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +15 -17
  89. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +3 -7
  90. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +24 -32
  91. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +7 -9
  92. package/themes/original/src/components/GiftCard/VerticalGiftCardOrdersLayout/index.tsx +11 -12
  93. package/themes/original/src/components/GoogleMap/index.tsx +39 -18
  94. package/themes/original/src/components/Help/index.tsx +0 -5
  95. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +0 -5
  96. package/themes/original/src/components/HelpGuide/index.tsx +0 -5
  97. package/themes/original/src/components/HelpOrder/index.tsx +0 -5
  98. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
  99. package/themes/original/src/components/Home/index.tsx +35 -19
  100. package/themes/original/src/components/LoginForm/Otp/index.tsx +0 -3
  101. package/themes/original/src/components/LoginForm/index.tsx +12 -14
  102. package/themes/original/src/components/MessageListing/index.tsx +1 -6
  103. package/themes/original/src/components/Messages/index.tsx +20 -13
  104. package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
  105. package/themes/original/src/components/MomentOption/index.tsx +73 -63
  106. package/themes/original/src/components/MomentSelector/index.tsx +5 -2
  107. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +1 -0
  108. package/themes/original/src/components/MultiCheckout/index.tsx +55 -27
  109. package/themes/original/src/components/MultiOrdersDetails/index.tsx +1 -0
  110. package/themes/original/src/components/MyOrders/index.tsx +2 -7
  111. package/themes/original/src/components/NavBar/index.tsx +7 -6
  112. package/themes/original/src/components/NetworkError/index.tsx +0 -5
  113. package/themes/original/src/components/NotFoundSource/index.tsx +0 -3
  114. package/themes/original/src/components/Notifications/index.tsx +0 -5
  115. package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
  116. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +16 -11
  117. package/themes/original/src/components/OrderDetails/index.tsx +44 -21
  118. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  119. package/themes/original/src/components/OrderProgress/index.tsx +4 -3
  120. package/themes/original/src/components/OrderSummary/index.tsx +32 -11
  121. package/themes/original/src/components/OrderTypeSelector/index.tsx +7 -11
  122. package/themes/original/src/components/OrdersOption/index.tsx +3 -6
  123. package/themes/original/src/components/PaymentOptionStripe/index.tsx +0 -5
  124. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  125. package/themes/original/src/components/PaymentOptions/index.tsx +462 -461
  126. package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
  127. package/themes/original/src/components/PlaceSpot/index.tsx +1 -3
  128. package/themes/original/src/components/PreviousOrders/index.tsx +1 -4
  129. package/themes/original/src/components/ProductForm/ActionButton.tsx +7 -12
  130. package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
  131. package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
  132. package/themes/original/src/components/ProfessionalProfile/index.tsx +4 -5
  133. package/themes/original/src/components/Promotions/index.tsx +2 -7
  134. package/themes/original/src/components/ReviewDriver/index.tsx +1 -6
  135. package/themes/original/src/components/ReviewOrder/index.tsx +2 -7
  136. package/themes/original/src/components/ReviewProducts/index.tsx +1 -6
  137. package/themes/original/src/components/ReviewTrigger/index.tsx +2 -2
  138. package/themes/original/src/components/ServiceForm/index.tsx +53 -55
  139. package/themes/original/src/components/Sessions/index.tsx +3 -8
  140. package/themes/original/src/components/SignupForm/index.tsx +44 -37
  141. package/themes/original/src/components/SingleOrderCard/index.tsx +7 -5
  142. package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
  143. package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
  144. package/themes/original/src/components/StripeCardForm/index.tsx +0 -3
  145. package/themes/original/src/components/StripeCardsList/index.tsx +16 -3
  146. package/themes/original/src/components/StripeElementsForm/index.tsx +6 -4
  147. package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
  148. package/themes/original/src/components/StripeRedirectForm/index.tsx +0 -3
  149. package/themes/original/src/components/TaxInformation/index.tsx +3 -2
  150. package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +8 -5
  151. package/themes/original/src/components/UserDetails/index.tsx +17 -16
  152. package/themes/original/src/components/UserFormDetails/index.tsx +113 -73
  153. package/themes/original/src/components/UserProfile/index.tsx +9 -1
  154. package/themes/original/src/components/UserProfileForm/index.tsx +0 -5
  155. package/themes/original/src/components/UserVerification/index.tsx +18 -5
  156. package/themes/original/src/components/Wallets/index.tsx +1 -3
  157. package/themes/original/src/components/WebsocketStatus/index.tsx +1 -4
  158. package/themes/original/src/components/shared/OAlert.tsx +2 -1
  159. package/themes/original/src/components/shared/OButton.tsx +5 -4
  160. package/themes/original/src/components/shared/OInput.tsx +4 -8
  161. package/themes/original/src/components/shared/OModal.tsx +7 -2
  162. package/themes/original/src/types/index.tsx +12 -4
  163. package/themes/original/src/utils/index.tsx +30 -1
  164. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -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, setLocalMoment } 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 = () => {
@@ -245,10 +248,6 @@ const MomentOptionUI = (props: MomentOptionParams) => {
245
248
  )
246
249
  }
247
250
 
248
- useEffect(() => {
249
- setLocalMoment(moment, t)
250
- }, [])
251
-
252
251
  useEffect(() => {
253
252
  if (datesList?.length > 0) {
254
253
  const _datesList = datesList.slice((cateringPreorder && preorderMinimumDays) || 0, Number(cateringPreorder ? preorderMaximumDays || configs?.max_days_preorder?.value : configs?.max_days_preorder?.value ?? 6))
@@ -260,7 +259,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
260
259
  setDateWhitelist([{ start: _minDate, end: _maxDate }])
261
260
  }
262
261
  }
263
- }, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays, cateringPreorder])
262
+ }, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays])
264
263
 
265
264
  useEffect(() => {
266
265
  if (dateSelected) {
@@ -282,13 +281,21 @@ const MomentOptionUI = (props: MomentOptionParams) => {
282
281
  let _timeLists = []
283
282
  const schedule = business && getActualSchedule()
284
283
  if (!schedule && business) {
284
+ setTimeList([])
285
285
  return
286
286
  }
287
287
  _timeLists = hoursList
288
- .filter(hour => (!business || schedule?.lapses?.some((lapse: any) =>
289
- 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}`))) &&
290
- moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`) &&
291
- (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
+ })
292
299
  .map(hour => {
293
300
  return {
294
301
  value: hour.startTime,
@@ -325,7 +332,28 @@ const MomentOptionUI = (props: MomentOptionParams) => {
325
332
  }
326
333
  }))
327
334
  }
328
- }, [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])
329
357
 
330
358
  return (
331
359
  <>
@@ -347,14 +375,9 @@ const MomentOptionUI = (props: MomentOptionParams) => {
347
375
  titleAlign={'center'}
348
376
  titleStyle={{ fontSize: 20, marginRight: 0, marginLeft: 0 }}
349
377
  titleWrapStyle={{ paddingHorizontal: 0 }}
350
- buttonProps={{
351
- bgColor: theme.colors.white,
352
- borderColor: theme.colors.white,
353
- textStyle: { color: theme.colors.btnFont }
354
- }}
355
378
  />
356
379
  )}
357
- {(preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder && (
380
+ {((preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder) && (
358
381
  <WrapSelectOption
359
382
  onPress={() => _handleAsap()}
360
383
  disabled={orderState.loading} style={{ alignItems: 'flex-start' }}>
@@ -403,28 +426,27 @@ const MomentOptionUI = (props: MomentOptionParams) => {
403
426
  <View style={{ flex: 1 }}>
404
427
  {selectDate && datesWhitelist[0]?.start !== null && (
405
428
  <CalendarStrip
406
- locale={locale}
407
429
  scrollable
408
430
  style={styles.calendar}
409
431
  calendarHeaderContainerStyle={styles.calendarHeaderContainer}
410
432
  calendarHeaderStyle={styles.calendarHeader}
411
- dateNumberStyle={styles.dateNumber}
412
- dateNameStyle={styles.dateName}
413
433
  iconContainer={{ flex: 0.1 }}
414
- highlightDateNameStyle={styles.highlightDateName}
415
- highlightDateNumberStyle={styles.highlightDateNumber}
416
434
  dayContainerStyle={{ height: '100%' }}
417
435
  highlightDateContainerStyle={{ height: '100%' }}
418
436
  calendarHeaderFormat='MMMM, YYYY'
419
437
  iconStyle={{ borderWidth: 1 }}
420
438
  selectedDate={dateSelected}
421
439
  datesWhitelist={datesWhitelist}
440
+ highlightDateNumberStyle={styles.highlightDateNumber}
441
+ highlightDateNameStyle={styles.highlightDateName}
422
442
  minDate={moment()}
423
443
  maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
424
444
  disabledDateNameStyle={styles.disabledDateName}
425
445
  disabledDateNumberStyle={styles.disabledDateNumber}
426
446
  disabledDateOpacity={0.6}
427
- onDateSelected={(date) => onSelectDate(date)}
447
+ dateNumberStyle={styles.dateNumber}
448
+ dateNameStyle={styles.dateName}
449
+ onDateSelected={(date: any) => onSelectDate(date)}
428
450
  leftSelector={<LeftSelector />}
429
451
  rightSelector={<RightSelector />}
430
452
  />
@@ -432,44 +454,34 @@ const MomentOptionUI = (props: MomentOptionParams) => {
432
454
  </View>
433
455
  )}
434
456
  <TimeListWrapper nestedScrollEnabled={true} cateringPreorder={cateringPreorder}>
435
- <TimeContentWrapper>
436
- {timeList.map((time: any, i: number) => (
437
- <Pressable key={i} onPress={() => handleChangeTimeSelected(time.value)}>
438
- <TimeItem
439
- 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}
440
465
  cateringPreorder={cateringPreorder}
441
- >
442
- {cateringPreorder && (
443
- <>
444
- {selectedTime === time.value ? (
445
- <OIcon
446
- src={theme.images.general.option_checked}
447
- width={18}
448
- style={{ marginEnd: 24, bottom: 2 }}
449
- />
450
- ) : (
451
- <OIcon
452
- src={theme.images.general.option_normal}
453
- width={18}
454
- style={{ marginEnd: 24, bottom: 2 }}
455
- />
456
- )}
457
- </>
458
- )}
459
- <OText
460
- size={cateringPreorder ? 18 : 16}
461
- color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
462
- style={{
463
- lineHeight: 24
464
- }}
465
- >{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
466
- </TimeItem>
467
- </Pressable>
468
- ))}
469
- {timeList.length % 3 === 2 && (
470
- <TimeItem style={{ backgroundColor: 'transparent' }} />
471
- )}
472
- </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
+ )}
473
485
  </TimeListWrapper>
474
486
  </OrderTimeWrapper>
475
487
  )}
@@ -480,12 +492,10 @@ const MomentOptionUI = (props: MomentOptionParams) => {
480
492
  <View style={{ position: 'absolute', bottom: bottom, paddingBottom: 20, paddingHorizontal: 20, backgroundColor: 'white', width: '100%' }}>
481
493
  <OButton
482
494
  onClick={() => handleChangeMoment()}
483
- bgColor={theme.colors.primary}
484
- borderColor={theme.colors.primary}
485
495
  isDisabled={!selectedTime}
486
496
  text={t('CONTINUE', 'Continue')}
487
497
  style={{ borderRadius: 7.6, height: 44, shadowOpacity: 0 }}
488
- textStyle={{ color: 'white', fontSize: 14 }}
498
+ textStyle={{ fontSize: 14 }}
489
499
  showNextIcon
490
500
  />
491
501
  </View>
@@ -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
  )}
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect, useCallback } from 'react'
1
+ import React, { useState, useEffect, useCallback, useMemo } from 'react'
2
2
  import {
3
3
  useLanguage,
4
4
  useConfig,
@@ -70,7 +70,8 @@ const MultiCheckoutUI = (props: any) => {
70
70
  walletState,
71
71
  onNavigationRedirectReplace,
72
72
  merchantId,
73
- cartsInvalid
73
+ cartsInvalid,
74
+ checkoutFieldsState
74
75
  } = props
75
76
 
76
77
  const theme = useTheme();
@@ -96,8 +97,9 @@ const MultiCheckoutUI = (props: any) => {
96
97
  const [{ parsePrice, parseDate }] = useUtils();
97
98
  const [{ options, carts, loading }, { confirmCart }] = useOrder();
98
99
  const [validationFields] = useValidationFields();
99
- const [{ user }, { login }] = useSession()
100
+ const [{ user, loading: userLoading }, { login }] = useSession()
100
101
 
102
+ const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes', 'comments']
101
103
  const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
102
104
  const isPreOrder = configs?.preorder_status_enabled?.value === '1'
103
105
  const isMultiDriverTips = configs?.checkout_multi_business_enabled?.value === '1'
@@ -121,6 +123,7 @@ const MultiCheckoutUI = (props: any) => {
121
123
 
122
124
  const creditPointGeneralPlan = loyaltyPlansState?.result?.find((loyal: any) => loyal.type === 'credit_point')
123
125
  const loyalBusinessAvailable = creditPointGeneralPlan?.businesses?.filter((b: any) => b.accumulates) ?? []
126
+ const checkoutFields = useMemo(() => checkoutFieldsState?.fields?.filter((field : any) => field.order_type_id === options?.type), [checkoutFieldsState, options])
124
127
 
125
128
  const accumulationRateBusiness = (businessId: number) => {
126
129
  const value = loyalBusinessAvailable?.find((loyal: any) => loyal.business_id === businessId)?.accumulation_rate ?? 0
@@ -169,35 +172,55 @@ const MultiCheckoutUI = (props: any) => {
169
172
 
170
173
  const checkValidationFields = () => {
171
174
  setUserErrors([])
172
- const errors = []
173
- const notFields = ['coupon', 'driver_tip', 'mobile_phone', 'address', 'zipcode', 'address_notes']
174
- const _requiredFields: any = []
175
-
176
- Object.values(validationFields?.fields?.checkout).map((field: any) => {
177
- if (field?.required && !notFields.includes(field.code)) {
178
- if (!user[field?.code]) {
179
- _requiredFields.push(field?.code)
175
+ const errors: Array<string> = []
176
+ const userSelected = user
177
+ const _requiredFields: Array<string> = []
178
+ Object.values(checkoutFieldsState?.fields).map((field: any) => {
179
+ if (options?.type === field?.order_type_id &&
180
+ field?.enabled &&
181
+ field?.required &&
182
+ !notFields.includes(field?.validation_field?.code)
183
+ ) {
184
+ if (userSelected && !userSelected[field?.validation_field?.code]) {
185
+ _requiredFields.push(field?.validation_field?.code)
180
186
  }
181
187
  }
182
188
  })
183
-
189
+ const mobilePhoneField: any = Object.values(checkoutFieldsState?.fields)?.find((field: any) => field?.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
184
190
  if (
185
- !user?.cellphone &&
186
- ((validationFields?.fields?.checkout?.cellphone?.enabled &&
187
- validationFields?.fields?.checkout?.cellphone?.required) ||
191
+ userSelected &&
192
+ !userSelected?.cellphone &&
193
+ ((mobilePhoneField?.enabled &&
194
+ mobilePhoneField?.required) ||
188
195
  configs?.verification_phone_required?.value === '1')
189
196
  ) {
190
197
  _requiredFields.push('cellphone')
191
198
  }
192
199
  setRequiredFields(_requiredFields)
193
200
 
194
- if (phoneUpdate) {
195
- errors.push(t('NECESSARY_UPDATE_COUNTRY_PHONE_CODE', 'It is necessary to update your phone number'))
196
- }
197
-
198
201
  setUserErrors(errors)
199
202
  }
200
203
 
204
+ const checkGuestValidationFields = () => {
205
+ const userSelected = user
206
+ const _requiredFields = checkoutFieldsState?.fields
207
+ .filter((field) => (field?.order_type_id === options?.type) && field?.enabled && field?.required_with_guest &&
208
+ !notFields.includes(field?.validation_field?.code) &&
209
+ userSelected && !userSelected[field?.validation_field?.code])
210
+ const requiredFieldsCode = _requiredFields.map((item) => item?.validation_field?.code)
211
+ const guestCheckoutCellPhone = checkoutFieldsState?.fields?.find((field) => field.order_type_id === options?.type && field?.validation_field?.code === 'mobile_phone')
212
+ if (
213
+ userSelected &&
214
+ !userSelected?.cellphone &&
215
+ ((guestCheckoutCellPhone?.enabled &&
216
+ guestCheckoutCellPhone?.required_with_guest) ||
217
+ configs?.verification_phone_required?.value === '1')
218
+ ) {
219
+ requiredFieldsCode.push('cellphone')
220
+ }
221
+ setRequiredFields(requiredFieldsCode)
222
+ }
223
+
201
224
  const togglePhoneUpdate = (val: boolean) => {
202
225
  setPhoneUpdate(val)
203
226
  }
@@ -208,7 +231,7 @@ const MultiCheckoutUI = (props: any) => {
208
231
  return
209
232
  }
210
233
 
211
- if (!userErrors.length && (!requiredFields?.length || allowedGuest)) {
234
+ if (!userErrors.length && !requiredFields?.length) {
212
235
  handleGroupPlaceOrder && handleGroupPlaceOrder(confirmPayment)
213
236
  return
214
237
  }
@@ -255,10 +278,13 @@ const MultiCheckoutUI = (props: any) => {
255
278
  }
256
279
 
257
280
  useEffect(() => {
258
- if (validationFields && validationFields?.fields?.checkout) {
281
+ if (checkoutFieldsState?.loading || userLoading) return
282
+ if (user?.guest_id) {
283
+ checkGuestValidationFields()
284
+ } else {
259
285
  checkValidationFields()
260
286
  }
261
- }, [validationFields, user])
287
+ }, [checkoutFieldsState, user, options?.type])
262
288
 
263
289
  useEffect(() => {
264
290
  if (cartsToShow?.length === 1) {
@@ -394,15 +420,11 @@ const MultiCheckoutUI = (props: any) => {
394
420
  </OText>
395
421
  <OButton
396
422
  text={t('SIGN_UP', 'Sign up')}
397
- textStyle={{ color: theme.colors.white }}
398
423
  style={{ borderRadius: 7.6, marginTop: 20 }}
399
424
  onClick={() => setOpenModal({ ...openModal, signup: true })}
400
425
  />
401
426
  <OButton
402
427
  text={t('LOGIN', 'Login')}
403
- textStyle={{ color: theme.colors.primary }}
404
- bgColor={theme.colors.white}
405
- borderColor={theme.colors.primary}
406
428
  style={{ borderRadius: 7.6, marginTop: 20 }}
407
429
  onClick={() => setOpenModal({ ...openModal, login: true })}
408
430
  />
@@ -424,6 +446,9 @@ const MultiCheckoutUI = (props: any) => {
424
446
  isCheckout
425
447
  phoneUpdate={phoneUpdate}
426
448
  togglePhoneUpdate={togglePhoneUpdate}
449
+ isOrderTypeValidationField
450
+ requiredFields={requiredFields}
451
+ checkoutFields={checkoutFields}
427
452
  />
428
453
  )}
429
454
  </ChUserDetails>
@@ -660,9 +685,12 @@ const MultiCheckoutUI = (props: any) => {
660
685
  isEdit
661
686
  phoneUpdate={phoneUpdate}
662
687
  togglePhoneUpdate={togglePhoneUpdate}
663
- requiredFields={requiredFields}
664
688
  hideUpdateButton
665
689
  handlePlaceOrderAsGuest={handlePlaceOrderAsGuest}
690
+ isCheckoutPlace
691
+ isOrderTypeValidationField
692
+ requiredFields={requiredFields}
693
+ checkoutFields={checkoutFields}
666
694
  onClose={() => {
667
695
  setIsOpen(false)
668
696
  handlePlaceOrder()
@@ -101,6 +101,7 @@ export const MultiOrdersDetailsUI = (props: any) => {
101
101
  style={styles.btnBackArrow}
102
102
  onClick={() => handleArrowBack()}
103
103
  icon={AntDesignIcon}
104
+ useArrow
104
105
  iconProps={{
105
106
  name: 'arrowleft',
106
107
  size: 26
@@ -101,11 +101,6 @@ export const MyOrders = (props: any) => {
101
101
  showCall={false}
102
102
  paddingTop={30}
103
103
  btnStyle={{ paddingLeft: 0 }}
104
- buttonProps={{
105
- bgColor: theme.colors.white,
106
- borderColor: theme.colors.white,
107
- textStyle: { color: theme.colors.btnFont }
108
- }}
109
104
  />
110
105
  )}
111
106
  </View>
@@ -208,9 +203,9 @@ export const MyOrders = (props: any) => {
208
203
  setOrdersLength={setOrdersLength}
209
204
  />
210
205
  )}
211
-
206
+
212
207
  {selectedOption === 'giftCards' && (
213
- <View style={{ paddingHorizontal: 20 }}>
208
+ <View style={{ paddingHorizontal: 20 }}>
214
209
  <GiftCardOrdersList
215
210
  onNavigationRedirect={props?.onNavigationRedirect}
216
211
  />