ordering-ui-react-native 0.17.57 → 0.17.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 (212) hide show
  1. package/package.json +8 -7
  2. package/src/DeliveryApp.tsx +43 -1
  3. package/src/components/BusinessesListing/index.tsx +1 -1
  4. package/src/components/OrderCreating/index.tsx +1 -21
  5. package/src/components/PaymentOptionsWebView/index.tsx +29 -8
  6. package/src/components/PhoneInputNumber/index.tsx +6 -2
  7. package/src/components/StripeMethodForm/index.tsx +136 -102
  8. package/src/components/VerifyPhone/styles.tsx +1 -2
  9. package/src/components/shared/OToast.tsx +4 -4
  10. package/src/types/index.tsx +5 -0
  11. package/src/utils/index.tsx +5 -0
  12. package/themes/business/index.tsx +2 -0
  13. package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +265 -240
  14. package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +6 -4
  15. package/themes/business/src/components/BusinessController/index.tsx +0 -1
  16. package/themes/business/src/components/Chat/index.tsx +125 -113
  17. package/themes/business/src/components/DriverMap/index.tsx +17 -6
  18. package/themes/business/src/components/DriverSchedule/index.tsx +42 -5
  19. package/themes/business/src/components/GoogleMap/index.tsx +58 -57
  20. package/themes/business/src/components/LoginForm/Otp/index.tsx +31 -3
  21. package/themes/business/src/components/LoginForm/index.tsx +15 -22
  22. package/themes/business/src/components/MapView/index.tsx +10 -10
  23. package/themes/business/src/components/NewOrderNotification/index.tsx +35 -21
  24. package/themes/business/src/components/NotFoundSource/index.tsx +2 -2
  25. package/themes/business/src/components/OrderDetails/Business.tsx +1 -1
  26. package/themes/business/src/components/OrderDetails/Delivery.tsx +191 -6
  27. package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +93 -50
  28. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +64 -63
  29. package/themes/business/src/components/OrderDetailsLogistic/index.tsx +195 -0
  30. package/themes/business/src/components/OrderDetailsLogistic/styles.tsx +5 -0
  31. package/themes/business/src/components/OrderMessage/index.tsx +19 -18
  32. package/themes/business/src/components/OrderSummary/index.tsx +113 -121
  33. package/themes/business/src/components/OrdersOption/index.tsx +32 -75
  34. package/themes/business/src/components/PreviousOrders/OrderItem.tsx +249 -0
  35. package/themes/business/src/components/PreviousOrders/OrdersGroupedItem.tsx +115 -0
  36. package/themes/business/src/components/PreviousOrders/index.tsx +445 -243
  37. package/themes/business/src/components/PreviousOrders/styles.tsx +31 -3
  38. package/themes/business/src/components/ProductItemAccordion/index.tsx +27 -3
  39. package/themes/business/src/components/ReviewCustomer/index.tsx +30 -15
  40. package/themes/business/src/components/StoresList/index.tsx +3 -4
  41. package/themes/business/src/components/UserProfileForm/index.tsx +11 -13
  42. package/themes/business/src/components/shared/OLink.tsx +33 -13
  43. package/themes/business/src/components/shared/OModal.tsx +16 -9
  44. package/themes/business/src/components/shared/OText.tsx +8 -2
  45. package/themes/business/src/types/index.tsx +28 -12
  46. package/themes/business/src/utils/index.tsx +29 -2
  47. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  48. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  49. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  50. package/themes/kiosk/src/components/Checkout/index.tsx +6 -0
  51. package/themes/kiosk/src/components/Intro/index.tsx +16 -1
  52. package/themes/kiosk/src/components/LoginForm/index.tsx +7 -9
  53. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  54. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  55. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
  56. package/themes/kiosk/src/components/PhoneInputNumber/index.tsx +2 -2
  57. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  58. package/themes/original/index.tsx +4 -0
  59. package/themes/original/src/components/AddressDetails/index.tsx +28 -10
  60. package/themes/original/src/components/AddressForm/index.tsx +68 -40
  61. package/themes/original/src/components/AddressList/index.tsx +27 -22
  62. package/themes/original/src/components/AddressList/styles.tsx +4 -2
  63. package/themes/original/src/components/AnalyticsSegment/index.tsx +193 -10
  64. package/themes/original/src/components/AppleLogin/index.tsx +4 -4
  65. package/themes/original/src/components/AppleLogin/styles.tsx +3 -1
  66. package/themes/original/src/components/BusinessBasicInformation/index.tsx +153 -96
  67. package/themes/original/src/components/BusinessBasicInformation/styles.tsx +10 -12
  68. package/themes/original/src/components/BusinessController/index.tsx +122 -68
  69. package/themes/original/src/components/BusinessController/styles.tsx +23 -4
  70. package/themes/original/src/components/BusinessFeaturedController/index.tsx +21 -54
  71. package/themes/original/src/components/BusinessFeaturedController/styles.tsx +8 -0
  72. package/themes/original/src/components/BusinessInformation/index.tsx +110 -108
  73. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
  74. package/themes/original/src/components/BusinessListingSearch/index.tsx +352 -326
  75. package/themes/original/src/components/BusinessListingSearch/styles.tsx +0 -18
  76. package/themes/original/src/components/BusinessPreorder/index.tsx +103 -19
  77. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -2
  78. package/themes/original/src/components/BusinessProductsList/index.tsx +25 -15
  79. package/themes/original/src/components/BusinessProductsList/styles.tsx +8 -3
  80. package/themes/original/src/components/BusinessProductsListing/UpsellingRedirect.tsx +1 -1
  81. package/themes/original/src/components/BusinessProductsListing/index.tsx +683 -555
  82. package/themes/original/src/components/BusinessProductsListing/styles.tsx +2 -2
  83. package/themes/original/src/components/BusinessReviews/index.tsx +3 -1
  84. package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +1 -1
  85. package/themes/original/src/components/BusinessesListing/Layout/Original/index.tsx +96 -91
  86. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -4
  87. package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
  88. package/themes/original/src/components/Cart/index.tsx +77 -50
  89. package/themes/original/src/components/CartContent/index.tsx +117 -20
  90. package/themes/original/src/components/CartContent/styles.tsx +17 -7
  91. package/themes/original/src/components/Checkout/index.tsx +359 -171
  92. package/themes/original/src/components/Checkout/styles.tsx +4 -2
  93. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  94. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  95. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  96. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  97. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  98. package/themes/original/src/components/Favorite/index.tsx +8 -9
  99. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  100. package/themes/original/src/components/FavoriteList/index.tsx +51 -80
  101. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  102. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  103. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  104. package/themes/original/src/components/GPSButton/styles.ts +3 -3
  105. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  106. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  107. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  108. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  109. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  110. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  111. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  112. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  113. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  114. package/themes/original/src/components/GoogleMap/index.tsx +15 -4
  115. package/themes/original/src/components/Help/index.tsx +8 -8
  116. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
  117. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
  118. package/themes/original/src/components/HelpGuide/index.tsx +6 -6
  119. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  120. package/themes/original/src/components/HelpOrder/index.tsx +6 -15
  121. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  122. package/themes/original/src/components/Home/index.tsx +13 -4
  123. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  124. package/themes/original/src/components/LoginForm/Otp/index.tsx +55 -13
  125. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  126. package/themes/original/src/components/LoginForm/index.tsx +60 -35
  127. package/themes/original/src/components/LottieAnimation/index.tsx +89 -55
  128. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  129. package/themes/original/src/components/Messages/index.tsx +32 -10
  130. package/themes/original/src/components/MomentOption/index.tsx +195 -90
  131. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  132. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  133. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +153 -49
  134. package/themes/original/src/components/MultiCheckout/index.tsx +308 -88
  135. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  136. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  137. package/themes/original/src/components/MultiOrdersDetails/index.tsx +68 -21
  138. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  139. package/themes/original/src/components/MyOrders/index.tsx +65 -52
  140. package/themes/original/src/components/NavBar/index.tsx +18 -18
  141. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  142. package/themes/original/src/components/Notifications/index.tsx +46 -50
  143. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  144. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  145. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  146. package/themes/original/src/components/OrderDetails/index.tsx +190 -358
  147. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  148. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  149. package/themes/original/src/components/OrderProgress/index.tsx +33 -59
  150. package/themes/original/src/components/OrderSummary/index.tsx +85 -57
  151. package/themes/original/src/components/OrderTypeSelector/index.tsx +1 -1
  152. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  153. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  154. package/themes/original/src/components/OrdersOption/index.tsx +78 -67
  155. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  156. package/themes/original/src/components/PageBanner/index.tsx +106 -31
  157. package/themes/original/src/components/PageBanner/styles.tsx +4 -4
  158. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  159. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  160. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  161. package/themes/original/src/components/PaymentOptions/index.tsx +68 -9
  162. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  163. package/themes/original/src/components/PlaceSpot/index.tsx +12 -6
  164. package/themes/original/src/components/ProductForm/index.tsx +109 -33
  165. package/themes/original/src/components/ProductForm/styles.tsx +5 -7
  166. package/themes/original/src/components/ProductItemAccordion/index.tsx +22 -19
  167. package/themes/original/src/components/ProductOptionSubOption/index.tsx +24 -14
  168. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +3 -4
  169. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  170. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  171. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  172. package/themes/original/src/components/Promotions/index.tsx +234 -220
  173. package/themes/original/src/components/Promotions/styles.tsx +10 -3
  174. package/themes/original/src/components/ReviewDriver/index.tsx +3 -3
  175. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  176. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  177. package/themes/original/src/components/ReviewProducts/index.tsx +23 -11
  178. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  179. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  180. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  181. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  182. package/themes/original/src/components/ServiceForm/index.tsx +66 -17
  183. package/themes/original/src/components/Sessions/index.tsx +11 -8
  184. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  185. package/themes/original/src/components/SignupForm/index.tsx +44 -29
  186. package/themes/original/src/components/SingleOrderCard/index.tsx +130 -52
  187. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -2
  188. package/themes/original/src/components/SingleProductCard/index.tsx +71 -34
  189. package/themes/original/src/components/SingleProductCard/styles.tsx +21 -4
  190. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  191. package/themes/original/src/components/StripeCardsList/index.tsx +13 -3
  192. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  193. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  194. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  195. package/themes/original/src/components/UserDetails/index.tsx +8 -4
  196. package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
  197. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  198. package/themes/original/src/components/UserProfile/index.tsx +88 -79
  199. package/themes/original/src/components/UserProfileForm/index.tsx +27 -29
  200. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  201. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  202. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  203. package/themes/original/src/components/Wallets/index.tsx +67 -24
  204. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  205. package/themes/original/src/components/shared/HeaderTitle.tsx +8 -3
  206. package/themes/original/src/components/shared/OButton.tsx +6 -2
  207. package/themes/original/src/components/shared/OInput.tsx +6 -1
  208. package/themes/original/src/components/shared/OModal.tsx +3 -3
  209. package/themes/original/src/layouts/Container.tsx +1 -1
  210. package/themes/original/src/types/index.tsx +41 -11
  211. package/themes/original/src/utils/index.tsx +273 -1
  212. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
@@ -18,8 +18,11 @@ import {
18
18
  useOrder,
19
19
  useUtils,
20
20
  ToastType,
21
- useToast
21
+ useToast,
22
+ useConfig,
23
+ useEvent
22
24
  } from 'ordering-components/native';
25
+ import uuid from 'react-native-uuid';
23
26
  import { useTheme } from 'styled-components/native';
24
27
  import { ProductIngredient } from '../ProductIngredient';
25
28
  import { ProductOption } from '../ProductOption';
@@ -27,6 +30,7 @@ import Swiper from 'react-native-swiper'
27
30
  import FastImage from 'react-native-fast-image';
28
31
  import IconAntDesign from 'react-native-vector-icons/AntDesign';
29
32
  import YoutubePlayer from "react-native-youtube-iframe"
33
+ import ReactNativeHapticFeedback from "react-native-haptic-feedback";
30
34
 
31
35
  import {
32
36
  WrapHeader,
@@ -50,6 +54,8 @@ import { ScrollView } from 'react-native-gesture-handler';
50
54
  import { ProductOptionSubOption } from '../ProductOptionSubOption';
51
55
  import { NotFoundSource } from '../NotFoundSource';
52
56
  import { Placeholder, PlaceholderLine, Fade } from 'rn-placeholder';
57
+ import NavBar from '../NavBar';
58
+ import { orderTypeList, vibrateApp } from '../../utils';
53
59
  const windowWidth = Dimensions.get('window').width;
54
60
 
55
61
  export const ProductOptionsUI = (props: any) => {
@@ -69,11 +75,16 @@ export const ProductOptionsUI = (props: any) => {
69
75
  handleChangeSuboptionState,
70
76
  handleChangeCommentState,
71
77
  productObject,
72
- productAddedToCartLength
78
+ productAddedToCartLength,
79
+ actionStatus,
80
+ handleCreateGuestUser
73
81
  } = props;
74
82
 
75
83
  const theme = useTheme();
76
84
  const [, { showToast }] = useToast()
85
+ const [events] = useEvent()
86
+
87
+ const isChewLayout = theme?.header?.components?.layout?.type?.toLowerCase() === 'chew'
77
88
 
78
89
  const styles = StyleSheet.create({
79
90
  mainContainer: {
@@ -163,6 +174,10 @@ export const ProductOptionsUI = (props: any) => {
163
174
  justifyContent: 'space-between',
164
175
  width: '100%',
165
176
  marginTop: 10
177
+ },
178
+ wrapperNavbar: {
179
+ paddingHorizontal: 40,
180
+ paddingTop: 0,
166
181
  }
167
182
  });
168
183
 
@@ -170,6 +185,7 @@ export const ProductOptionsUI = (props: any) => {
170
185
  const [, t] = useLanguage();
171
186
  const [orderState] = useOrder();
172
187
  const [{ auth }] = useSession();
188
+ const [{ configs }] = useConfig()
173
189
  const { product, loading, error } = productObject;
174
190
  const [gallery, setGallery] = useState([])
175
191
  const [thumbsSwiper, setThumbsSwiper] = useState(0)
@@ -189,6 +205,19 @@ export const ProductOptionsUI = (props: any) => {
189
205
  const [summaryRefHeight, setSummaryRefHeight] = useState(0)
190
206
  const [isScrollAvailable, setIsScrollAvailable] = useState(null)
191
207
  const [editionsLayoutY, setEditionsLayoutY] = useState(null)
208
+ const [viewedProduct, setViewedProduct] = useState<any>(null)
209
+ const [showTitle, setShowTitle] = useState(false)
210
+
211
+ const guestCheckoutEnabled = configs?.guest_checkout_enabled?.value === '1'
212
+ const orderTypeEnabled = !orderTypeList[orderState?.options?.type - 1] || configs?.allowed_order_types_guest_checkout?.value?.includes(orderTypeList[orderState?.options?.type - 1])
213
+
214
+ const vibrateApp = (impact?: string) => {
215
+ const options = {
216
+ enableVibrateFallback: true,
217
+ ignoreAndroidSystemSettings: false
218
+ };
219
+ ReactNativeHapticFeedback.trigger(impact || "impactLight", options);
220
+ }
192
221
 
193
222
  const isError = (id: number) => {
194
223
  let bgColor = theme.colors.white;
@@ -205,11 +234,12 @@ export const ProductOptionsUI = (props: any) => {
205
234
  };
206
235
 
207
236
  const handleSaveProduct = () => {
237
+ vibrateApp()
208
238
  if (!productCart.quantity) {
209
239
  showToast(ToastType.Error, t('VALIDATION_ERROR_REQUIRED', 'The quantity field is required').replace('_attribute_', t('PRODUCT_POTIONS_QUANTITY', 'Quantity')))
210
240
  return
211
241
  }
212
- const isErrors = Object.values(errors).length > 0;
242
+ const isErrors = Object.values(errors)?.length > 0;
213
243
  if (!isErrors) {
214
244
  handleSave && handleSave();
215
245
  return;
@@ -228,7 +258,7 @@ export const ProductOptionsUI = (props: any) => {
228
258
  };
229
259
 
230
260
  const handleChangeMainIndex = (index: number) => {
231
- if (index < 0 || index > gallery.length - 1) {
261
+ if (index < 0 || index > gallery?.length - 1) {
232
262
  setThumbsSwiper(0)
233
263
  return
234
264
  }
@@ -271,7 +301,7 @@ export const ProductOptionsUI = (props: any) => {
271
301
  }
272
302
 
273
303
  const scrollDown = (id: any) => {
274
- const isErrors = Object.values(errors).length > 0
304
+ const isErrors = Object.values(errors)?.length > 0
275
305
  if (!isErrors) {
276
306
  return
277
307
  }
@@ -285,6 +315,11 @@ export const ProductOptionsUI = (props: any) => {
285
315
  }
286
316
  }
287
317
 
318
+ const handleUpdateGuest = () => {
319
+ const guestToken = uuid.v4()
320
+ if (guestToken) handleCreateGuestUser({ guest_token: guestToken })
321
+ }
322
+
288
323
  const handleOnLayout = (event: any, optionId: any) => {
289
324
  const _optionLayout = { ...optionLayout }
290
325
  const optionKey = 'id:' + optionId
@@ -295,9 +330,9 @@ export const ProductOptionsUI = (props: any) => {
295
330
  const saveErrors =
296
331
  orderState.loading ||
297
332
  maxProductQuantity === 0 ||
298
- Object.keys(errors).length > 0;
333
+ Object.keys(errors)?.length > 0;
334
+
299
335
 
300
-
301
336
  const ExtraOptions = ({ eID, options }: any) => (
302
337
  <>
303
338
  {options.map(({ id, name, respect_to, suboptions }: any) => (
@@ -337,7 +372,7 @@ export const ProductOptionsUI = (props: any) => {
337
372
  );
338
373
 
339
374
  const handleScroll = ({ nativeEvent: { contentOffset, layoutMeasurement } }: any) => {
340
-
375
+ setShowTitle(contentOffset.y > 30)
341
376
  const _topOption = Object.keys(optionLayout).find(((option: any) => Math.abs(contentOffset?.y - layoutMeasurement?.height - optionLayout[option]?.y) < 20))
342
377
  if (_topOption) {
343
378
  const _topOptionId = Number(_topOption.replace('id:', ''))
@@ -358,15 +393,18 @@ export const ProductOptionsUI = (props: any) => {
358
393
  useEffect(() => {
359
394
  const imageList: any = []
360
395
  const videoList: any = []
361
- product?.images?.length > 0 ? imageList.push(product.images) : imageList.push(theme?.images?.dummies?.product)
362
- if (product?.gallery && product?.gallery.length > 0) {
396
+ imageList.push(product?.images?.length > 0
397
+ ? product.images
398
+ : theme?.images?.dummies?.product)
399
+
400
+ if (product?.gallery && product?.gallery?.length > 0) {
363
401
  for (const img of product?.gallery) {
364
402
  if (img?.file) {
365
403
  imageList.push(img?.file)
366
404
  }
367
405
  if (img?.video) {
368
406
  const keys = img?.video.split('/')
369
- let _videoId = keys[keys.length - 1]
407
+ let _videoId = keys[keys?.length - 1]
370
408
 
371
409
  if (_videoId.includes('watch')) {
372
410
  const __url = _videoId.split('=')[1]
@@ -381,7 +419,7 @@ export const ProductOptionsUI = (props: any) => {
381
419
  } else if (_videoId.search(/\?/i) >= 0) {
382
420
  _videoId = _videoId.split('?')[0]
383
421
  }
384
- if ((_videoId.length === 11)) {
422
+ if ((_videoId?.length === 11)) {
385
423
  videoList.push(_videoId)
386
424
  }
387
425
  }
@@ -460,9 +498,22 @@ export const ProductOptionsUI = (props: any) => {
460
498
  height: 44,
461
499
  borderColor: theme.colors.primary,
462
500
  backgroundColor: theme.colors.white,
501
+ paddingLeft: 0,
502
+ paddingRight: 0
463
503
  }}
464
504
  />
465
505
  )}
506
+ {!auth && guestCheckoutEnabled && orderTypeEnabled && (
507
+ <TouchableOpacity style={{ marginTop: 10 }} onPress={handleUpdateGuest}>
508
+ {actionStatus?.loading ? (
509
+ <Placeholder Animation={Fade}>
510
+ <PlaceholderLine width={60} height={20} />
511
+ </Placeholder>
512
+ ) : (
513
+ <OText color={theme.colors.primary} size={13}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
514
+ )}
515
+ </TouchableOpacity>
516
+ )}
466
517
  </View>
467
518
  )
468
519
  }
@@ -476,14 +527,34 @@ export const ProductOptionsUI = (props: any) => {
476
527
  }
477
528
  }, [])
478
529
 
530
+ useEffect(() => {
531
+ if (!product?.id || product?.id === viewedProduct?.id) return
532
+ setViewedProduct(product)
533
+ events.emit('product_viewed', product)
534
+ }, [product?.id, viewedProduct])
479
535
 
480
536
  return (
481
537
  <SafeAreaView style={{ flex: 1 }}>
482
- <TopHeader>
483
- <TopActions onPress={() => handleGoBack()}>
484
- <IconAntDesign name='arrowleft' size={26} />
485
- </TopActions>
486
- </TopHeader>
538
+ <View style={styles.wrapperNavbar}>
539
+ <TopHeader>
540
+ <>
541
+ <TopActions onPress={() => handleGoBack()}>
542
+ <OIcon src={theme.images.general.arrow_left} color={theme.colors.textNormal} />
543
+ </TopActions>
544
+ {showTitle && (
545
+ <OText
546
+ size={16}
547
+ style={{ flex: 1, textAlign: 'center' }}
548
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
549
+ numberOfLines={2}
550
+ ellipsizeMode='tail'
551
+ >
552
+ {product?.name}
553
+ </OText>
554
+ )}
555
+ </>
556
+ </TopHeader>
557
+ </View>
487
558
  {!error && (
488
559
  <ScrollView
489
560
  ref={scrollViewRef}
@@ -532,14 +603,14 @@ export const ProductOptionsUI = (props: any) => {
532
603
  </View>
533
604
  }
534
605
  >
535
- {gallery && gallery.length > 0 && gallery.map((img, i) => (
606
+ {gallery && gallery?.length > 0 && gallery.map((img, i) => (
536
607
  <View
537
608
  style={styles.slide1}
538
609
  key={i}
539
610
  >
540
- {String(img).includes('image') || typeof img === 'number' ? (
611
+ {(String(img).includes('http') || typeof img === 'number') ? (
541
612
  <FastImage
542
- style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 3 / 2 }}
613
+ style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
543
614
  source={typeof img !== 'number' ? {
544
615
  uri: optimizeImage(img, 'h_1024,c_limit'),
545
616
  priority: FastImage.priority.normal,
@@ -548,7 +619,8 @@ export const ProductOptionsUI = (props: any) => {
548
619
  ) : (
549
620
  <>
550
621
  <YoutubePlayer
551
- height={300}
622
+ height={'100%'}
623
+ width={'100%'}
552
624
  play={playing}
553
625
  videoId={img}
554
626
  onChangeState={onStateChange}
@@ -566,7 +638,7 @@ export const ProductOptionsUI = (props: any) => {
566
638
  paddingVertical: 15
567
639
  }}
568
640
  >
569
- {gallery.length > 0 && gallery.map((img, index) => (
641
+ {gallery?.length > 1 && gallery.map((img, index) => (
570
642
  <TouchableOpacity
571
643
  key={index}
572
644
  onPress={() => handleClickThumb(index)}
@@ -579,7 +651,7 @@ export const ProductOptionsUI = (props: any) => {
579
651
  opacity: index === thumbsSwiper ? 1 : 0.8
580
652
  }}
581
653
  >
582
- {String(img).includes('image') ? (
654
+ {String(img).includes('http') ? (
583
655
  <OIcon
584
656
  url={img}
585
657
  style={{
@@ -594,7 +666,7 @@ export const ProductOptionsUI = (props: any) => {
594
666
  />
595
667
  ) : (
596
668
  <OIcon
597
- url={'http://img.youtube.com/vi/' + img + '/0.jpg'}
669
+ url={'https://img.youtube.com/vi/' + img + '/0.jpg'}
598
670
  style={{
599
671
  borderColor: theme.colors.lightGray,
600
672
  borderRadius: 8,
@@ -614,7 +686,10 @@ export const ProductOptionsUI = (props: any) => {
614
686
  </>
615
687
  )}
616
688
  </WrapHeader>
617
- <ProductSummary onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}>
689
+ <ProductSummary
690
+ ph={isChewLayout ? 20 : 40}
691
+ onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
692
+ >
618
693
  <ProductTitle>
619
694
  {loading && !product ? (
620
695
  <Placeholder Animation={Fade}>
@@ -714,11 +789,11 @@ export const ProductOptionsUI = (props: any) => {
714
789
  marginBottom: 20,
715
790
  borderBottomWidth: 1,
716
791
  borderBottomColor: theme.colors.border,
717
- marginHorizontal: 30,
792
+ marginHorizontal: isChewLayout ? 20 : 30,
718
793
  backgroundColor: theme.colors.backgroundPage,
719
794
  }}
720
795
  >
721
- {product?.ingredients.length > 0 && (
796
+ {product?.ingredients?.length > 0 && (
722
797
  <TouchableOpacity
723
798
  key={`eopt_key_01`}
724
799
  onPress={() => {
@@ -743,7 +818,7 @@ export const ProductOptionsUI = (props: any) => {
743
818
  </OText>
744
819
  </TouchableOpacity>
745
820
  )}
746
- {product?.extras.map((extra: any) =>
821
+ {product?.extras?.map((extra: any) =>
747
822
  <ExtraOptions key={extra.id} options={extra.options} />
748
823
  )}
749
824
  </ExtraOptionWrap>
@@ -788,12 +863,13 @@ export const ProductOptionsUI = (props: any) => {
788
863
  </>
789
864
  ) : (
790
865
  <ProductEditions
866
+ style={{ paddingHorizontal: isChewLayout ? 20 : 40 }}
791
867
  onLayout={(event: any) => {
792
868
  setEditionsLayoutY(event.nativeEvent.layout?.y)
793
869
  }}
794
870
  >
795
871
  <>
796
- {product?.ingredients.length > 0 && (
872
+ {product?.ingredients?.length > 0 && (
797
873
  <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
798
874
  <SectionTitle>
799
875
  <OText size={16}>
@@ -815,8 +891,8 @@ export const ProductOptionsUI = (props: any) => {
815
891
  </WrapperIngredients>
816
892
  </View>
817
893
  )}
818
- {product?.extras.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
819
- extra.options.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
894
+ {product?.extras?.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
895
+ extra.options?.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
820
896
  const currentState =
821
897
  productCart.options[`id:${option.id}`] || {};
822
898
  return (
@@ -832,7 +908,7 @@ export const ProductOptionsUI = (props: any) => {
832
908
  backgroundColor: isError(option.id),
833
909
  borderRadius: 7.6
834
910
  }}>
835
- {option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
911
+ {option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
836
912
  (suboption: any) => {
837
913
  const currentState =
838
914
  productCart.options[
@@ -897,7 +973,7 @@ export const ProductOptionsUI = (props: any) => {
897
973
  )}
898
974
  </ProductEditions>
899
975
  )}
900
- {!!error && error.length > 0 && (
976
+ {!!error && error?.length > 0 && (
901
977
  <NotFoundSource content={error[0]?.message || error[0]} />
902
978
  )}
903
979
  </ScrollView>
@@ -8,8 +8,8 @@ export const WrapHeader = styled.View`
8
8
  export const TopActions = styled.TouchableOpacity`
9
9
  height: 60px;
10
10
  justify-content: center;
11
- padding-horizontal: 30px;
12
- width: 100px;
11
+ min-width: 30px;
12
+ padding-right: 15px;
13
13
  `;
14
14
 
15
15
  export const TopHeader = styled.View`
@@ -44,12 +44,10 @@ export const ProductTitle = styled.View`
44
44
  padding-bottom: 7px;
45
45
  `
46
46
 
47
- export const ProductDescription = styled.View`
48
- margin-bottom: 20px;
49
- `
47
+ export const ProductDescription = styled.View``
50
48
 
51
49
  export const ProductEditions = styled.View`
52
- padding: 0 40px;
50
+ padding-vertical: 0;
53
51
  `
54
52
 
55
53
  export const SectionTitle = styled.View`
@@ -96,7 +94,7 @@ export const WeightUnitItem = styled.View`
96
94
  `}
97
95
  `
98
96
  export const ProductSummary = styled.View`
99
- padding: 26px 40px;
97
+ padding: 26px ${(props: any) => props.ph}px 0;
100
98
  position: relative;
101
99
  background-color: white;
102
100
  z-index: 100;
@@ -27,6 +27,7 @@ import { ProductItemAccordionParams } from '../../types'
27
27
  export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
28
28
 
29
29
  const {
30
+ isDisabledEdit,
30
31
  isCartPending,
31
32
  isCartProduct,
32
33
  product,
@@ -76,6 +77,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
76
77
  const [isServiceOpen, setIsServiceOpen] = useState(false)
77
78
  // const [setHeight, setHeightState] = useState({ height: new Animated.Value(0) })
78
79
  // const [setRotate, setRotateState] = useState({ angle: new Animated.Value(0) })
80
+ const [productQuantity, setProductQuantity] = useState(product.quantity.toString())
79
81
 
80
82
  const productInfo = () => {
81
83
  if (isCartProduct) {
@@ -106,19 +108,20 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
106
108
  /* const toggleAccordion = () => {
107
109
  if ((!product?.valid_menu && isCartProduct)) return
108
110
  if (isActive) {
109
- Animated.timing(setHeight.height, {
111
+ Animated.timing(setHeight.height, {
110
112
  toValue: 100,
111
113
  duration: 500,
112
114
  easing: Easing.linear,
113
115
  useNativeDriver: false,
114
- }).start()
116
+ }).start()
115
117
  } else {
116
- setHeightState({height: new Animated.Value(0)})
118
+ setHeightState({height: new Animated.Value(0)})
117
119
  }
118
120
  }*/
119
121
 
120
122
  const handleChangeQuantity = (value: string) => {
121
123
  if (!orderState.loading) {
124
+ setProductQuantity(value)
122
125
  if (parseInt(value) === 0) {
123
126
  onDeleteProduct && onDeleteProduct(product)
124
127
  } else {
@@ -133,7 +136,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
133
136
  }
134
137
 
135
138
  /*useEffect(() => {
136
- toggleAccordion()
139
+ toggleAccordion()
137
140
  }, [isActive])*/
138
141
 
139
142
  const productOptions = getProductMax && [...Array(getProductMax(product) + 1),].map((_: any, opt: number) => {
@@ -203,12 +206,12 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
203
206
  </View>
204
207
  ) : (
205
208
  <>
206
- {isCartProduct && !isCartPending && getProductMax && (
209
+ {!isDisabledEdit && isCartProduct && !isCartPending && getProductMax && (
207
210
  <ProductInfo>
208
211
  <RNPickerSelect
209
212
  items={productOptions}
210
213
  onValueChange={handleChangeQuantity}
211
- value={product.quantity.toString()}
214
+ value={productQuantity}
212
215
  style={pickerStyle}
213
216
  useNativeAndroidPickerStyle={false}
214
217
  placeholder={{}}
@@ -225,23 +228,23 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
225
228
  </ProductQuantity>
226
229
  )}
227
230
  <View style={{ flex: 1 }}>
228
- <OText size={12} lineHeight={18} weight={'400'}>{product.name}</OText>
231
+ <OText size={12} lineHeight={18} weight={'400'} mLeft={8}>{product.name}</OText>
229
232
  </View>
230
233
  </>
231
234
  )}
232
235
  <View style={{ display: 'flex', flexDirection: 'column', flex: 1, alignItems: 'flex-end', maxWidth: 100 }}>
233
236
  <View style={{ flexDirection: 'row' }}>
234
237
  <OText size={12} lineHeight={18} weight={'400'}>{parsePrice(product.total || product.price)}</OText>
235
- {(productInfo().ingredients.length > 0 || productInfo().options.length > 0 || product.comment) && (
238
+ {(productInfo().ingredients.length > 0 || productInfo().options.length > 0 || !!product.comment) && (
236
239
  <MaterialCommunityIcon name='chevron-down' size={18} />
237
240
  )}
238
241
  </View>
239
- <View style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-start' }}>
240
- {onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
241
- <TouchableOpacity onPress={() => handleEditProduct(product)} style={{ marginEnd: 7 }}>
242
- <OIcon
243
- src={theme.images.general.pencil}
244
- width={20}
242
+ <View style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-start', height: 20 }}>
243
+ {!isDisabledEdit && onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
244
+ <TouchableOpacity onPress={() => handleEditProduct(product)} style={{ marginRight: 5 }}>
245
+ <MaterialCommunityIcon
246
+ name='pencil-outline'
247
+ size={20}
245
248
  color={theme.colors.textSecondary}
246
249
  />
247
250
  </TouchableOpacity>
@@ -252,9 +255,9 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
252
255
  message={t('QUESTION_DELETE_PRODUCT', 'Are you sure that you want to delete the product?')}
253
256
  onAccept={() => onDeleteProduct(product)}
254
257
  >
255
- <OIcon
256
- src={theme.images.general.trash}
257
- width={20}
258
+ <MaterialCommunityIcon
259
+ name='trash-can-outline'
260
+ size={20}
258
261
  color={theme.colors.textSecondary}
259
262
  />
260
263
  </OAlert>
@@ -286,7 +289,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
286
289
  )}
287
290
  {productInfo().options.length > 0 && (
288
291
  <ProductOptionsList>
289
- {productInfo().options.map((option: any, i: number) => (
292
+ {productInfo().options.sort((a: any, b: any) => a.rank - b.rank).map((option: any, i: number) => (
290
293
  <ProductOption key={option.id + i}>
291
294
  <OText size={10} color={theme.colors.textSecondary}>{option.name}</OText>
292
295
  {option.suboptions.map((suboption: any) => (
@@ -305,7 +308,7 @@ export const ProductItemAccordion = (props: ProductItemAccordionParams) => {
305
308
  ))}
306
309
  </ProductOptionsList>
307
310
  )}
308
- {product.comment && (
311
+ {!!product.comment && (
309
312
  <ProductComment>
310
313
  <OText size={10} color={theme.colors.textSecondary}>{t('SPECIAL_COMMENT', 'Special Comment')}</OText>
311
314
  <OText size={10} color={theme.colors.textThird}>{product.comment}</OText>
@@ -6,6 +6,7 @@ import {
6
6
  } from 'ordering-components/native'
7
7
  import { useTheme } from 'styled-components/native';
8
8
  import { StyleSheet, View } from 'react-native'
9
+ import IconAntDesign from 'react-native-vector-icons/AntDesign';
9
10
 
10
11
  import {
11
12
  Container,
@@ -31,15 +32,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
31
32
  setIsScrollAvailable
32
33
  } = props
33
34
 
34
- const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
35
+ const disableIncrement = option?.limit_suboptions_by_max ? balance === option?.max || state.quantity === suboption?.max : state.quantity === suboption?.max || (!state.selected && balance === option?.max)
35
36
  const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
36
-
37
+
37
38
  const theme = useTheme();
38
39
  const [, t] = useLanguage()
39
40
  const [{ parsePrice }] = useUtils()
40
41
  const [showMessage, setShowMessage] = useState(false)
41
42
  const [isDirty, setIsDirty] = useState(false)
42
43
 
44
+ const iconsSize = 20
45
+
43
46
  const handleSuboptionClick = () => {
44
47
  toggleSelect()
45
48
  setIsDirty(true)
@@ -64,7 +67,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
64
67
 
65
68
  return (
66
69
  <View>
67
- <Container onPress={() => handleSuboptionClick()}>
70
+ <Container onPress={!(option?.with_half_option || option?.allow_suboption_quantity) ? () => handleSuboptionClick() : null}>
68
71
  <IconControl disabled={disabled} onPress={() => handleSuboptionClick()}>
69
72
  {((option?.min === 0 && option?.max === 1) || option?.max > 1) ? (
70
73
  state?.selected ? (
@@ -87,9 +90,9 @@ export const ProductOptionSubOptionUI = (props: any) => {
87
90
  {option?.allow_suboption_quantity && state?.selected && (
88
91
  <>
89
92
  <Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
90
- <OIcon
91
- src={theme.images.general.minus}
92
- width={16}
93
+ <IconAntDesign
94
+ name='minuscircleo'
95
+ size={iconsSize}
93
96
  color={state.quantity === 0 || disabled ? theme.colors.disabled : theme.colors.primary}
94
97
  />
95
98
  </Checkbox>
@@ -97,9 +100,9 @@ export const ProductOptionSubOptionUI = (props: any) => {
97
100
  {state.quantity}
98
101
  </OText>
99
102
  <Checkbox disabled={disabled || disableIncrement} onPress={increment}>
100
- <OIcon
101
- src={theme.images.general.plus}
102
- width={16}
103
+ <IconAntDesign
104
+ name='pluscircleo'
105
+ size={iconsSize}
103
106
  color={disableIncrement || disabled ? theme.colors.disabled : theme.colors.primary}
104
107
  />
105
108
  </Checkbox>
@@ -113,7 +116,8 @@ export const ProductOptionSubOptionUI = (props: any) => {
113
116
  <OIcon
114
117
  src={theme.images.general.half_l}
115
118
  color={state.selected && state.position === 'left' ? theme.colors.primary : '#cbcbcb'}
116
- width={16}
119
+ width={20}
120
+ height={20}
117
121
  style={styles.inverse}
118
122
  />
119
123
  </Circle>
@@ -121,26 +125,32 @@ export const ProductOptionSubOptionUI = (props: any) => {
121
125
  <OIcon
122
126
  src={theme.images.general.half_f}
123
127
  color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
124
- width={16}
128
+ width={20}
129
+ height={20}
125
130
  />
126
131
  </Circle>
127
132
  <Circle disabled={disabled} onPress={() => changePosition('right')}>
128
133
  <OIcon
129
134
  src={theme.images.general.half_r}
130
135
  color={state.selected && state.position === 'right' ? theme.colors.primary : '#cbcbcb'}
131
- width={16}
136
+ width={20}
137
+ height={20}
132
138
  />
133
139
  </Circle>
134
140
  </>
135
141
  )}
136
142
  </PositionControl>
137
143
  {price > 0 && (
138
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
144
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} style={{ paddingRight: 10 }}>
139
145
  + {parsePrice(price)}
140
146
  </OText>
141
147
  )}
142
148
  </Container>
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>}
149
+ {showMessage && (
150
+ <OText size={10} mLeft={4} mRight={4} style={{ flex: 1, textAlign: 'center' }} color={theme.colors.primary}>
151
+ {`${t('OPTIONS_MAX_LIMIT', 'Maximum options to choose')}: ${option?.max}`}
152
+ </OText>
153
+ )}
144
154
  </View>
145
155
  )
146
156
  }
@@ -4,13 +4,13 @@ export const Container = styled.TouchableOpacity`
4
4
  flex-direction: row;
5
5
  align-items: center;
6
6
  justify-content: space-between;
7
- padding: 10px;
8
7
  width: 100%;
9
8
  `
10
9
 
11
10
  export const IconControl = styled.TouchableOpacity`
12
11
  flex-direction: row;
13
- width: 45%;
12
+ padding: 10px;
13
+ width: 38%;
14
14
  align-items: center;
15
15
  `
16
16
 
@@ -18,10 +18,9 @@ export const QuantityControl = styled.View`
18
18
  flex-direction: row;
19
19
  align-items: center;
20
20
  justify-content: flex-start;
21
- margin-horizontal: 5px;
21
+ margin-right: 5px;
22
22
  flex: 1;
23
23
  width: 60px;
24
-
25
24
  `
26
25
 
27
26
  export const PositionControl = styled.View`