ordering-ui-react-native 0.15.57 → 0.15.58-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 (182) hide show
  1. package/package.json +5 -3
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/AddressForm/index.tsx +18 -2
  4. package/src/components/BusinessController/index.tsx +16 -8
  5. package/src/components/BusinessTypeFilter/index.tsx +3 -1
  6. package/src/components/BusinessesListing/index.tsx +1 -1
  7. package/src/components/Checkout/index.tsx +23 -2
  8. package/src/components/DriverTips/index.tsx +11 -6
  9. package/src/components/LanguageSelector/index.tsx +7 -2
  10. package/src/components/LoginForm/index.tsx +120 -30
  11. package/src/components/LoginForm/styles.tsx +6 -0
  12. package/src/components/OrderDetails/index.tsx +7 -21
  13. package/src/components/PaymentOptions/index.tsx +67 -50
  14. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  15. package/src/components/SignupForm/index.tsx +145 -61
  16. package/src/components/SingleProductCard/index.tsx +16 -4
  17. package/src/components/StripeMethodForm/index.tsx +1 -2
  18. package/src/components/UpsellingProducts/index.tsx +1 -1
  19. package/src/components/UserProfileForm/index.tsx +63 -6
  20. package/src/components/UserProfileForm/styles.tsx +8 -0
  21. package/src/components/VerifyPhone/styles.tsx +1 -2
  22. package/src/components/shared/OModal.tsx +1 -1
  23. package/src/hooks/useCountdownTimer.tsx +26 -0
  24. package/src/navigators/CheckoutNavigator.tsx +6 -0
  25. package/src/navigators/HomeNavigator.tsx +12 -0
  26. package/src/pages/BusinessesListing.tsx +1 -1
  27. package/src/pages/MultiCheckout.tsx +31 -0
  28. package/src/pages/MultiOrdersDetails.tsx +27 -0
  29. package/src/pages/Sessions.tsx +22 -0
  30. package/src/theme.json +0 -1
  31. package/src/types/index.tsx +18 -11
  32. package/src/utils/index.tsx +68 -1
  33. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +103 -15
  34. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -0
  35. package/themes/business/src/components/Chat/index.tsx +42 -90
  36. package/themes/business/src/components/DriverMap/index.tsx +6 -5
  37. package/themes/business/src/components/LoginForm/index.tsx +89 -2
  38. package/themes/business/src/components/LoginForm/styles.tsx +6 -0
  39. package/themes/business/src/components/LogoutButton/index.tsx +1 -1
  40. package/themes/business/src/components/NewOrderNotification/index.tsx +26 -13
  41. package/themes/business/src/components/OrderDetails/Business.tsx +2 -2
  42. package/themes/business/src/components/OrderDetails/Delivery.tsx +28 -11
  43. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +41 -7
  44. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +6 -0
  45. package/themes/business/src/components/OrdersListManager/index.tsx +1 -1
  46. package/themes/business/src/components/OrdersOption/index.tsx +5 -2
  47. package/themes/business/src/components/PreviousOrders/index.tsx +2 -2
  48. package/themes/business/src/components/ProductItemAccordion/index.tsx +2 -2
  49. package/themes/business/src/components/UserFormDetails/index.tsx +5 -2
  50. package/themes/business/src/components/UserProfileForm/index.tsx +2 -0
  51. package/themes/business/src/components/shared/OModal.tsx +1 -1
  52. package/themes/business/src/types/index.tsx +6 -1
  53. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  54. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  55. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  56. package/themes/kiosk/src/components/BusinessMenu/index.tsx +39 -28
  57. package/themes/kiosk/src/components/BusinessesListing/index.tsx +2 -3
  58. package/themes/kiosk/src/components/Cart/index.tsx +11 -12
  59. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +9 -2
  60. package/themes/kiosk/src/components/CartContent/index.tsx +0 -11
  61. package/themes/kiosk/src/components/CartItem/index.tsx +4 -3
  62. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +107 -62
  63. package/themes/kiosk/src/components/Checkout/index.tsx +40 -22
  64. package/themes/kiosk/src/components/CustomerName/index.tsx +0 -6
  65. package/themes/kiosk/src/components/DrawerView/index.tsx +1 -0
  66. package/themes/kiosk/src/components/DrawerView/styles.tsx +2 -2
  67. package/themes/kiosk/src/components/NavBar/index.tsx +29 -20
  68. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  69. package/themes/kiosk/src/components/OrderDetails/index.tsx +32 -27
  70. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +9 -11
  71. package/themes/kiosk/src/components/PaymentOptions/index.tsx +56 -54
  72. package/themes/kiosk/src/components/ProductForm/index.tsx +7 -8
  73. package/themes/kiosk/src/components/ProductItemAccordion/index.tsx +2 -2
  74. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -1
  75. package/themes/kiosk/src/components/ProductOptionSubOption/index.tsx +3 -1
  76. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +16 -5
  77. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  78. package/themes/kiosk/src/types/index.d.ts +1 -0
  79. package/themes/original/index.tsx +22 -8
  80. package/themes/original/src/components/ActiveOrders/index.tsx +15 -132
  81. package/themes/original/src/components/ActiveOrders/styles.tsx +0 -54
  82. package/themes/original/src/components/AddressForm/index.tsx +7 -6
  83. package/themes/original/src/components/AddressList/index.tsx +30 -18
  84. package/themes/original/src/components/AppleLogin/index.tsx +9 -13
  85. package/themes/original/src/components/BusinessBasicInformation/index.tsx +136 -45
  86. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +4 -0
  87. package/themes/original/src/components/BusinessController/index.tsx +48 -11
  88. package/themes/original/src/components/BusinessController/styles.tsx +27 -0
  89. package/themes/original/src/components/BusinessFeaturedController/index.tsx +20 -1
  90. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +23 -0
  91. package/themes/original/src/components/BusinessItemAccordion/index.tsx +8 -5
  92. package/themes/original/src/components/BusinessItemAccordion/styles.tsx +3 -1
  93. package/themes/original/src/components/BusinessListingSearch/index.tsx +196 -58
  94. package/themes/original/src/components/BusinessListingSearch/styles.tsx +22 -2
  95. package/themes/original/src/components/BusinessPreorder/index.tsx +1 -1
  96. package/themes/original/src/components/BusinessProductsCategories/index.tsx +2 -2
  97. package/themes/original/src/components/BusinessProductsList/CategoryDescription/index.tsx +44 -0
  98. package/themes/original/src/components/BusinessProductsList/index.tsx +51 -53
  99. package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
  100. package/themes/original/src/components/BusinessProductsListing/index.tsx +105 -22
  101. package/themes/original/src/components/BusinessProductsListing/styles.tsx +22 -0
  102. package/themes/original/src/components/BusinessReviews/index.tsx +6 -1
  103. package/themes/original/src/components/BusinessTypeFilter/index.tsx +1 -2
  104. package/themes/original/src/components/BusinessesListing/index.tsx +126 -65
  105. package/themes/original/src/components/BusinessesListing/styles.tsx +11 -3
  106. package/themes/original/src/components/Cart/index.tsx +60 -41
  107. package/themes/original/src/components/Checkout/index.tsx +48 -32
  108. package/themes/original/src/components/DriverTips/index.tsx +17 -12
  109. package/themes/original/src/components/Favorite/index.tsx +92 -0
  110. package/themes/original/src/components/Favorite/styles.tsx +22 -0
  111. package/themes/original/src/components/FavoriteList/index.tsx +298 -0
  112. package/themes/original/src/components/FavoriteList/styles.tsx +5 -0
  113. package/themes/original/src/components/ForgotPasswordForm/index.tsx +84 -4
  114. package/themes/original/src/components/GPSButton/index.tsx +15 -8
  115. package/themes/original/src/components/GoogleMap/index.tsx +11 -11
  116. package/themes/original/src/components/Help/index.tsx +21 -4
  117. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +18 -1
  118. package/themes/original/src/components/LastOrders/index.tsx +12 -1
  119. package/themes/original/src/components/LoginForm/Otp/index.tsx +91 -0
  120. package/themes/original/src/components/LoginForm/Otp/styles.tsx +7 -0
  121. package/themes/original/src/components/LoginForm/index.tsx +332 -164
  122. package/themes/original/src/components/LoginForm/styles.tsx +1 -3
  123. package/themes/original/src/components/MessageListing/index.tsx +10 -1
  124. package/themes/original/src/components/Messages/index.tsx +1 -1
  125. package/themes/original/src/components/MomentOption/index.tsx +10 -1
  126. package/themes/original/src/components/MomentOption/styles.tsx +1 -1
  127. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +243 -0
  128. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/styles.tsx +46 -0
  129. package/themes/original/src/components/MultiCheckout/index.tsx +298 -0
  130. package/themes/original/src/components/MultiCheckout/styles.tsx +59 -0
  131. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +372 -0
  132. package/themes/original/src/components/MultiOrdersDetails/index.tsx +258 -0
  133. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +50 -0
  134. package/themes/original/src/components/MyOrders/index.tsx +120 -32
  135. package/themes/original/src/components/MyOrders/styles.tsx +8 -1
  136. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +167 -0
  137. package/themes/original/src/components/OrderDetails/index.tsx +135 -49
  138. package/themes/original/src/components/OrderDetails/styles.tsx +1 -2
  139. package/themes/original/src/components/OrderSummary/index.tsx +2 -2
  140. package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -2
  141. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +153 -0
  142. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/styles.tsx +6 -0
  143. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +53 -0
  144. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/styles.tsx +6 -0
  145. package/themes/original/src/components/OrdersOption/index.tsx +130 -38
  146. package/themes/original/src/components/OrdersOption/styles.tsx +4 -1
  147. package/themes/original/src/components/PaymentOptionCash/index.tsx +2 -2
  148. package/themes/original/src/components/PaymentOptionWallet/index.tsx +17 -23
  149. package/themes/original/src/components/PaymentOptionWallet/styles.tsx +1 -1
  150. package/themes/original/src/components/PaymentOptions/index.tsx +57 -36
  151. package/themes/original/src/components/PhoneInputNumber/index.tsx +5 -11
  152. package/themes/original/src/components/PreviousOrders/index.tsx +18 -147
  153. package/themes/original/src/components/ProductForm/index.tsx +70 -62
  154. package/themes/original/src/components/ProductForm/styles.tsx +0 -1
  155. package/themes/original/src/components/ProductItemAccordion/index.tsx +2 -2
  156. package/themes/original/src/components/ProductOptionSubOption/index.tsx +18 -12
  157. package/themes/original/src/components/Promotions/index.tsx +151 -133
  158. package/themes/original/src/components/Promotions/styles.tsx +3 -23
  159. package/themes/original/src/components/SearchBar/index.tsx +10 -4
  160. package/themes/original/src/components/Sessions/index.tsx +160 -0
  161. package/themes/original/src/components/Sessions/styles.tsx +15 -0
  162. package/themes/original/src/components/SignupForm/index.tsx +237 -126
  163. package/themes/original/src/components/SingleOrderCard/index.tsx +282 -0
  164. package/themes/original/src/components/SingleOrderCard/styles.tsx +54 -0
  165. package/themes/original/src/components/SingleProductCard/index.tsx +59 -17
  166. package/themes/original/src/components/StripeElementsForm/index.tsx +16 -8
  167. package/themes/original/src/components/StripeElementsForm/naked.tsx +2 -2
  168. package/themes/original/src/components/UpsellingProducts/index.tsx +86 -74
  169. package/themes/original/src/components/UserDetails/index.tsx +5 -96
  170. package/themes/original/src/components/UserFormDetails/index.tsx +25 -26
  171. package/themes/original/src/components/UserProfile/index.tsx +52 -5
  172. package/themes/original/src/components/UserProfileForm/index.tsx +20 -18
  173. package/themes/original/src/components/UserVerification/index.tsx +178 -192
  174. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  175. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  176. package/themes/original/src/components/Wallets/index.tsx +76 -9
  177. package/themes/original/src/components/Wallets/styles.tsx +21 -0
  178. package/themes/original/src/components/shared/OModal.tsx +4 -2
  179. package/themes/original/src/types/index.tsx +189 -35
  180. package/themes/original/src/utils/index.tsx +85 -2
  181. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +1 -1
  182. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -1,18 +1,13 @@
1
- import React, { useState } from 'react';
2
- import { useLanguage, useUtils } from 'ordering-components/native';
1
+ import React from 'react';
2
+ import { useLanguage } from 'ordering-components/native';
3
3
  import { useTheme } from 'styled-components/native';
4
- import { StyleSheet, TouchableOpacity, ScrollView, View } from 'react-native';
5
- import { OButton, OIcon, OText } from '../shared';
4
+ import { View } from 'react-native';
5
+ import { OButton } from '../shared';
6
6
  import {
7
- Card,
8
- Logo,
9
- Information,
10
- MyOrderOptions,
11
- Status,
12
7
  WrappButton,
13
8
  } from './styles';
14
9
  import { PreviousOrdersParams } from '../../types';
15
- import moment from 'moment';
10
+ import { SingleOrderCard } from '../SingleOrderCard';
16
11
 
17
12
  export const PreviousOrders = (props: PreviousOrdersParams) => {
18
13
  const {
@@ -24,152 +19,28 @@ export const PreviousOrders = (props: PreviousOrdersParams) => {
24
19
  handleReorder,
25
20
  reorderLoading,
26
21
  orderID,
22
+ handleUpdateOrderList
27
23
  } = props;
28
24
 
29
25
  const theme = useTheme();
30
26
 
31
-
32
- const styles = StyleSheet.create({
33
- logo: {
34
- borderRadius: 10,
35
- width: 64,
36
- height: 64,
37
- },
38
- reorderbutton: {
39
- height: 23,
40
- paddingLeft: 10,
41
- paddingRight: 10,
42
- borderRadius: 23,
43
- shadowOpacity: 0,
44
- backgroundColor: theme.colors.primaryContrast,
45
- borderWidth: 0,
46
- },
47
- reorderLoading: {
48
- width: 80,
49
- height: 40,
50
- borderRadius: 10,
51
- },
52
- reviewButton: {
53
- height: 23,
54
- maxHeight: 23,
55
- backgroundColor: theme.colors.white,
56
- alignItems: 'center',
57
- justifyContent: 'center',
58
- paddingHorizontal: 10,
59
- borderRadius: 23,
60
- borderWidth: 1,
61
- borderColor: theme.colors.primaryContrast,
62
- },
63
- buttonText: {
64
- color: theme.colors.primary,
65
- fontSize: 10,
66
- marginLeft: 2,
67
- marginRight: 2,
68
- },
69
- });
70
-
71
-
72
27
  const [, t] = useLanguage();
73
- const [reorderSelected, setReorderSelected] = useState<number | null>(null);
74
- const [{ parseDate, optimizeImage }] = useUtils();
75
- const allowedOrderStatus = [1, 2, 5, 6, 10, 11, 12];
76
-
77
- const handleClickViewOrder = (uuid: string) => {
78
- onNavigationRedirect &&
79
- onNavigationRedirect('OrderDetails', { orderId: uuid });
80
- };
81
-
82
- const handleClickOrderReview = (order: any) => {
83
- onNavigationRedirect &&
84
- onNavigationRedirect('ReviewOrder', {
85
- order: {
86
- id: order?.id,
87
- business_id: order?.business_id,
88
- logo: order?.business?.logo,
89
- driver: order?.driver,
90
- products: order?.products,
91
- review: order?.review,
92
- user_review: order?.user_review
93
- },
94
- });
95
- };
96
-
97
- const formatDate = (date: string, option?: any) => {
98
- return option?.utc ? moment.utc(date).format('DD/MM/YY \u2022 h:m a') : moment(date).format('DD/MM/YY \u2022 h:m a');
99
- };
100
28
 
101
- const handleReorderClick = (id: number) => {
102
- setReorderSelected(id);
103
- handleReorder(id);
104
- };
29
+ const pastOrders = [1, 2, 5, 6, 10, 11, 12, 15, 16, 17]
105
30
 
106
31
  return (
107
32
  <View style={{ marginBottom: 30 }}>
108
- {orders.map((order: any) => (
109
- <TouchableOpacity
110
- onPress={() => handleClickViewOrder(order?.uuid)}
111
- activeOpacity={0.7}
112
- style={{ flexDirection: 'row' }}
113
- key={order.id}>
114
- <Card>
115
- {!!order.business?.logo && (
116
- <Logo>
117
- <OIcon
118
- url={optimizeImage(order.business?.logo, 'h_300,c_limit')}
119
- style={styles.logo}
120
- />
121
- </Logo>
122
- )}
123
- <Information>
124
- <OText size={12} lineHeight={18} weight={'600'} numberOfLines={1} ellipsizeMode={'tail'}>
125
- {order.business?.name}
126
- </OText>
127
- <OText
128
- size={10}
129
- lineHeight={15}
130
- color={theme.colors.textSecondary}
131
- style={{ marginVertical: 3 }}
132
- numberOfLines={1}>
133
- {order?.delivery_datetime_utc
134
- ? formatDate(order?.delivery_datetime_utc)
135
- : formatDate(order?.delivery_datetime, { utc: false })}
136
- </OText>
137
- <OText
138
- color={theme.colors.primary}
139
- size={10}
140
- lineHeight={15}
141
- numberOfLines={1}>
142
- {getOrderStatus(order.status)?.value}
143
- </OText>
144
- </Information>
145
- <Status>
146
- {order.cart && (
147
- <OButton
148
- text={t('REORDER', 'Reorder')}
149
- imgRightSrc={''}
150
- textStyle={styles.buttonText}
151
- style={
152
- reorderLoading && order.id === reorderSelected
153
- ? styles.reorderLoading
154
- : styles.reorderbutton
155
- }
156
- onClick={() => handleReorderClick(order.id)}
157
- isLoading={reorderLoading && order.id === reorderSelected}
158
- />
159
- )}
160
- {allowedOrderStatus.includes(parseInt(order?.status)) &&
161
- !order.review && (
162
- <TouchableOpacity
163
- onPress={() => handleClickOrderReview(order)}
164
- style={styles.reviewButton}>
165
- <OText size={10} color={theme.colors.primary} numberOfLines={1}>
166
- {t('REVIEW', 'Review')}
167
- </OText>
168
- </TouchableOpacity>
169
- )}
170
- </Status>
171
- </Card>
172
- </TouchableOpacity>
33
+ {orders.map((order: any, i: number) => (
34
+ <SingleOrderCard
35
+ key={i}
36
+ order={order}
37
+ reorderLoading={reorderLoading}
38
+ handleReorder={handleReorder}
39
+ onNavigationRedirect={onNavigationRedirect}
40
+ getOrderStatus={getOrderStatus}
41
+ pastOrders={pastOrders.includes(order?.status)}
42
+ handleUpdateOrderList={handleUpdateOrderList}
43
+ />
173
44
  ))}
174
45
  {pagination.totalPages && pagination.currentPage < pagination.totalPages && (
175
46
  <WrappButton>
@@ -175,6 +175,7 @@ export const ProductOptionsUI = (props: any) => {
175
175
  const [optionLayout, setOptionLayout] = useState<any>({})
176
176
  const [headerRefHeight, setHeaderRefHeight] = useState(0)
177
177
  const [summaryRefHeight, setSummaryRefHeight] = useState(0)
178
+ const [isScrollAvailable, setIsScrollAvailable] = useState(null)
178
179
 
179
180
  const isError = (id: number) => {
180
181
  let bgColor = theme.colors.white;
@@ -278,47 +279,6 @@ export const ProductOptionsUI = (props: any) => {
278
279
  setOptionLayout(_optionLayout)
279
280
  }
280
281
 
281
- useEffect(() => {
282
- const imageList: any = []
283
- const videoList: any = []
284
- product?.images && imageList.push(product.images)
285
- if (product?.gallery && product?.gallery.length > 0) {
286
- for (const img of product?.gallery) {
287
- if (img?.file) {
288
- imageList.push(img?.file)
289
- }
290
- if (img?.video) {
291
- const keys = img?.video.split('/')
292
- let _videoId = keys[keys.length - 1]
293
-
294
- if (_videoId.includes('watch')) {
295
- const __url = _videoId.split('=')[1]
296
- _videoId = __url
297
- } else if (_videoId.includes('?')) {
298
- const __url = _videoId.split('?')[0]
299
- _videoId = __url
300
- }
301
-
302
- if (_videoId.search(/&/i) >= 0) {
303
- _videoId = _videoId.split('&')[0]
304
- } else if (_videoId.search(/\?/i) >= 0) {
305
- _videoId = _videoId.split('?')[0]
306
- }
307
- if ((_videoId.length === 11)) {
308
- videoList.push(_videoId)
309
- }
310
- }
311
- }
312
- }
313
- const gallery = imageList.concat(videoList)
314
- setGallery(gallery)
315
-
316
- if (product?.weight && product?.weight_unit) {
317
- setIsHaveWeight(true)
318
- setPricePerWeightUnit(product?.price / product?.weight)
319
- }
320
- }, [product])
321
-
322
282
  const saveErrors =
323
283
  orderState.loading ||
324
284
  maxProductQuantity === 0 ||
@@ -326,25 +286,6 @@ export const ProductOptionsUI = (props: any) => {
326
286
 
327
287
  const ExtraOptions = ({ eID, options }: any) => (
328
288
  <>
329
- {product?.ingredients.length > 0 && (
330
- <TouchableOpacity
331
- key={`eopt_all_00`}
332
- onPress={() => setSelectedOpt(-1)}
333
- style={[
334
- styles.extraItem,
335
- {
336
- borderBottomColor:
337
- selOpt == -1 ? theme.colors.textNormal : theme.colors.border,
338
- },
339
- ]}>
340
- <OText
341
- color={selOpt == -1 ? theme.colors.textNormal : theme.colors.textSecondary}
342
- size={selOpt == -1 ? 14 : 12}
343
- weight={selOpt == -1 ? '600' : 'normal'}>
344
- {t('INGREDIENTS', 'Ingredients')}
345
- </OText>
346
- </TouchableOpacity>
347
- )}
348
289
  {options.map(({ id, name, respect_to, suboptions }: any) => (
349
290
  <React.Fragment key={`cont_key_${id}`}>
350
291
  {respect_to == null && suboptions?.length > 0 && (
@@ -377,6 +318,54 @@ export const ProductOptionsUI = (props: any) => {
377
318
  ? () => navigation.goBack()
378
319
  : () => navigation.navigate('Business', { store: props.businessSlug })
379
320
 
321
+ useEffect(() => {
322
+ if (isScrollAvailable) {
323
+ setIsScrollAvailable(null)
324
+ scrollDown(isScrollAvailable)
325
+ }
326
+ }, [errors])
327
+
328
+ useEffect(() => {
329
+ const imageList: any = []
330
+ const videoList: any = []
331
+ product?.images && imageList.push(product.images)
332
+ if (product?.gallery && product?.gallery.length > 0) {
333
+ for (const img of product?.gallery) {
334
+ if (img?.file) {
335
+ imageList.push(img?.file)
336
+ }
337
+ if (img?.video) {
338
+ const keys = img?.video.split('/')
339
+ let _videoId = keys[keys.length - 1]
340
+
341
+ if (_videoId.includes('watch')) {
342
+ const __url = _videoId.split('=')[1]
343
+ _videoId = __url
344
+ } else if (_videoId.includes('?')) {
345
+ const __url = _videoId.split('?')[0]
346
+ _videoId = __url
347
+ }
348
+
349
+ if (_videoId.search(/&/i) >= 0) {
350
+ _videoId = _videoId.split('&')[0]
351
+ } else if (_videoId.search(/\?/i) >= 0) {
352
+ _videoId = _videoId.split('?')[0]
353
+ }
354
+ if ((_videoId.length === 11)) {
355
+ videoList.push(_videoId)
356
+ }
357
+ }
358
+ }
359
+ }
360
+ const gallery = imageList.concat(videoList)
361
+ setGallery(gallery)
362
+
363
+ if (product?.weight && product?.weight_unit) {
364
+ setIsHaveWeight(true)
365
+ setPricePerWeightUnit(product?.price / product?.weight)
366
+ }
367
+ }, [product])
368
+
380
369
  return (
381
370
  <SafeAreaView style={{ flex: 1 }}>
382
371
  <TopHeader>
@@ -665,6 +654,25 @@ export const ProductOptionsUI = (props: any) => {
665
654
  {t('ALL', 'All')}
666
655
  </OText>
667
656
  </TouchableOpacity>
657
+ {product?.ingredients.length > 0 && (
658
+ <TouchableOpacity
659
+ key={`eopt_all_00`}
660
+ onPress={() => setSelectedOpt(-1)}
661
+ style={[
662
+ styles.extraItem,
663
+ {
664
+ borderBottomColor:
665
+ selOpt == -1 ? theme.colors.textNormal : theme.colors.border,
666
+ },
667
+ ]}>
668
+ <OText
669
+ color={selOpt == -1 ? theme.colors.textNormal : theme.colors.textSecondary}
670
+ size={selOpt == -1 ? 14 : 12}
671
+ weight={selOpt == -1 ? '600' : 'normal'}>
672
+ {t('INGREDIENTS', 'Ingredients')}
673
+ </OText>
674
+ </TouchableOpacity>
675
+ )}
668
676
  {product?.extras.map((extra: any) =>
669
677
  <ExtraOptions key={extra.id} options={extra.options} />
670
678
  )}
@@ -694,7 +702,7 @@ export const ProductOptionsUI = (props: any) => {
694
702
  </WrapperIngredients>
695
703
  </View>
696
704
  )}
697
- {product?.extras.map((extra: any) =>
705
+ {product?.extras.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
698
706
  extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
699
707
  const currentState =
700
708
  productCart.options[`id:${option.id}`] || {};
@@ -738,7 +746,7 @@ export const ProductOptionsUI = (props: any) => {
738
746
  isSoldOut ||
739
747
  maxProductQuantity <= 0
740
748
  }
741
- scrollDown={scrollDown}
749
+ setIsScrollAvailable={setIsScrollAvailable}
742
750
  error={errors[`id:${option.id}`]}
743
751
  />
744
752
  );
@@ -49,7 +49,6 @@ export const ProductDescription = styled.View`
49
49
  `
50
50
 
51
51
  export const ProductEditions = styled.View`
52
-
53
52
  `
54
53
 
55
54
  export const SectionTitle = styled.View`
@@ -40,7 +40,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
40
40
 
41
41
  const pickerStyle = StyleSheet.create({
42
42
  inputAndroid: {
43
- width: 27,
43
+ width: 34,
44
44
  textAlign: 'center',
45
45
  overflow: 'visible',
46
46
  fontSize: 12,
@@ -49,7 +49,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
49
49
  color: theme.colors.textNormal
50
50
  },
51
51
  inputIOS: {
52
- width: 27,
52
+ width: 34,
53
53
  textAlign: 'center',
54
54
  overflow: 'visible',
55
55
  fontSize: 12,
@@ -28,36 +28,40 @@ export const ProductOptionSubOptionUI = (props: any) => {
28
28
  toggleSelect,
29
29
  changePosition,
30
30
  disabled,
31
- error,
32
- scrollDown
31
+ setIsScrollAvailable
33
32
  } = props
34
33
 
34
+ const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
35
+ const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
36
+
35
37
  const theme = useTheme();
36
-
37
38
  const [, t] = useLanguage()
38
39
  const [{ parsePrice }] = useUtils()
39
40
  const [showMessage, setShowMessage] = useState(false)
41
+ const [isDirty, setIsDirty] = useState(false)
40
42
 
41
43
  const handleSuboptionClick = () => {
42
44
  toggleSelect()
43
-
44
- if (balance === option?.max - 1 && !state.selected) {
45
- scrollDown(option?.id)
46
- }
45
+ setIsDirty(true)
47
46
 
48
47
  if (balance === option?.max && option?.suboptions?.length > balance && !(option?.min === 1 && option?.max === 1)) {
49
48
  setShowMessage(true)
50
49
  }
51
50
  }
52
51
 
52
+ useEffect(() => {
53
+ if (balance === option?.max && state?.selected && isDirty) {
54
+ setIsDirty(false)
55
+ setIsScrollAvailable(option?.id)
56
+ }
57
+ }, [state?.selected])
58
+
53
59
  useEffect(() => {
54
60
  if (!(balance === option?.max && option?.suboptions?.length > balance && !(option?.min === 1 && option?.max === 1))) {
55
61
  setShowMessage(false)
56
62
  }
57
63
  }, [balance])
58
64
 
59
- const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
60
- const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
61
65
  return (
62
66
  <View>
63
67
  <Container onPress={() => handleSuboptionClick()}>
@@ -130,9 +134,11 @@ export const ProductOptionSubOptionUI = (props: any) => {
130
134
  </>
131
135
  )}
132
136
  </PositionControl>
133
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
134
- + {parsePrice(price)}
135
- </OText>
137
+ {price > 0 && (
138
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
139
+ + {parsePrice(price)}
140
+ </OText>
141
+ )}
136
142
  </Container>
137
143
  {showMessage && <OText size={10} mLeft={4} mRight={4} style={{ flex: 1, textAlign: 'center' }} color={theme.colors.primary}>{`${t('OPTIONS_MAX_LIMIT', 'Maximum options to choose')}: ${option?.max}`}</OText>}
138
144
  </View>