ordering-ui-react-native 0.17.62 → 0.17.63-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 (207) 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 +2 -2
  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 +270 -245
  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 +123 -111
  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 +133 -65
  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 +114 -123
  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 +444 -242
  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 +19 -3
  60. package/themes/original/src/components/AddressForm/index.tsx +61 -39
  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 +94 -66
  69. package/themes/original/src/components/BusinessController/styles.tsx +22 -3
  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 +142 -109
  73. package/themes/original/src/components/BusinessItemAccordion/index.tsx +15 -20
  74. package/themes/original/src/components/BusinessListingSearch/index.tsx +349 -339
  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 +684 -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 +90 -85
  86. package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +0 -1
  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 +356 -124
  92. package/themes/original/src/components/CitiesControl/index.tsx +89 -0
  93. package/themes/original/src/components/CitiesControl/styles.tsx +17 -0
  94. package/themes/original/src/components/CouponControl/index.tsx +10 -3
  95. package/themes/original/src/components/DriverTips/index.tsx +52 -34
  96. package/themes/original/src/components/FacebookLogin/styles.tsx +3 -1
  97. package/themes/original/src/components/Favorite/index.tsx +8 -9
  98. package/themes/original/src/components/Favorite/styles.tsx +1 -1
  99. package/themes/original/src/components/FavoriteList/index.tsx +1 -35
  100. package/themes/original/src/components/FloatingButton/index.tsx +1 -2
  101. package/themes/original/src/components/FloatingButton/styles.tsx +1 -1
  102. package/themes/original/src/components/GPSButton/index.tsx +6 -4
  103. package/themes/original/src/components/GiftCard/GiftCardUI/index.tsx +96 -0
  104. package/themes/original/src/components/GiftCard/GiftCardUI/styles.tsx +5 -0
  105. package/themes/original/src/components/GiftCard/PurchaseGiftCard/index.tsx +100 -0
  106. package/themes/original/src/components/GiftCard/PurchaseGiftCard/styles.tsx +8 -0
  107. package/themes/original/src/components/GiftCard/RedeemGiftCard/index.tsx +191 -0
  108. package/themes/original/src/components/GiftCard/RedeemGiftCard/styles.tsx +8 -0
  109. package/themes/original/src/components/GiftCard/SendGiftCard/index.tsx +165 -0
  110. package/themes/original/src/components/GiftCard/SendGiftCard/styles.tsx +9 -0
  111. package/themes/original/src/components/GoogleLogin/styles.tsx +1 -1
  112. package/themes/original/src/components/GoogleMap/index.tsx +60 -5
  113. package/themes/original/src/components/Help/index.tsx +8 -8
  114. package/themes/original/src/components/HelpAccountAndPayment/index.tsx +10 -31
  115. package/themes/original/src/components/HelpAccountAndPayment/styles.tsx +5 -3
  116. package/themes/original/src/components/HelpGuide/index.tsx +6 -6
  117. package/themes/original/src/components/HelpGuide/styles.tsx +6 -0
  118. package/themes/original/src/components/HelpOrder/index.tsx +6 -15
  119. package/themes/original/src/components/HelpOrder/styles.tsx +8 -1
  120. package/themes/original/src/components/Home/index.tsx +13 -4
  121. package/themes/original/src/components/LastOrder/index.tsx +1 -34
  122. package/themes/original/src/components/LoginForm/Otp/index.tsx +55 -13
  123. package/themes/original/src/components/LoginForm/Otp/styles.tsx +0 -1
  124. package/themes/original/src/components/LoginForm/index.tsx +59 -34
  125. package/themes/original/src/components/LottieAnimation/index.tsx +89 -55
  126. package/themes/original/src/components/MessageListing/index.tsx +16 -42
  127. package/themes/original/src/components/Messages/index.tsx +29 -7
  128. package/themes/original/src/components/MomentOption/index.tsx +195 -90
  129. package/themes/original/src/components/MomentSelector/index.tsx +1 -1
  130. package/themes/original/src/components/MultiCart/index.tsx +50 -0
  131. package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +162 -51
  132. package/themes/original/src/components/MultiCheckout/index.tsx +308 -88
  133. package/themes/original/src/components/MultiCheckout/styles.tsx +3 -1
  134. package/themes/original/src/components/MultiOrdersDetails/SingleOrderCard.tsx +37 -224
  135. package/themes/original/src/components/MultiOrdersDetails/index.tsx +68 -21
  136. package/themes/original/src/components/MultiOrdersDetails/styles.tsx +1 -1
  137. package/themes/original/src/components/MyOrders/index.tsx +40 -29
  138. package/themes/original/src/components/NavBar/index.tsx +20 -17
  139. package/themes/original/src/components/NotFoundSource/index.tsx +14 -10
  140. package/themes/original/src/components/Notifications/index.tsx +46 -50
  141. package/themes/original/src/components/Notifications/styles.tsx +6 -3
  142. package/themes/original/src/components/OrderDetails/OrderEta.tsx +76 -0
  143. package/themes/original/src/components/OrderDetails/OrderHistory.tsx +15 -3
  144. package/themes/original/src/components/OrderDetails/index.tsx +190 -363
  145. package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
  146. package/themes/original/src/components/OrderItAgain/index.tsx +3 -1
  147. package/themes/original/src/components/OrderProgress/index.tsx +33 -56
  148. package/themes/original/src/components/OrderSummary/index.tsx +88 -59
  149. package/themes/original/src/components/OrderTypeSelector/index.tsx +2 -1
  150. package/themes/original/src/components/OrdersOption/PreviousBusinessOrdered/index.tsx +24 -19
  151. package/themes/original/src/components/OrdersOption/PreviousProductsOrdered/index.tsx +14 -14
  152. package/themes/original/src/components/OrdersOption/index.tsx +78 -67
  153. package/themes/original/src/components/OrdersOption/styles.tsx +1 -1
  154. package/themes/original/src/components/PageBanner/index.tsx +106 -31
  155. package/themes/original/src/components/PageBanner/styles.tsx +4 -4
  156. package/themes/original/src/components/PaymentOptionCard/index.tsx +180 -0
  157. package/themes/original/src/components/PaymentOptionStripe/styles.tsx +1 -1
  158. package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
  159. package/themes/original/src/components/PaymentOptions/index.tsx +78 -35
  160. package/themes/original/src/components/PhoneInputNumber/index.tsx +3 -3
  161. package/themes/original/src/components/ProductForm/index.tsx +114 -35
  162. package/themes/original/src/components/ProductForm/styles.tsx +5 -5
  163. package/themes/original/src/components/ProductItemAccordion/index.tsx +14 -11
  164. package/themes/original/src/components/ProductOptionSubOption/index.tsx +20 -18
  165. package/themes/original/src/components/ProductOptionSubOption/styles.tsx +5 -9
  166. package/themes/original/src/components/ProfessionalFilter/SingleProfessionalCard/index.tsx +108 -0
  167. package/themes/original/src/components/ProfessionalFilter/index.tsx +20 -50
  168. package/themes/original/src/components/ProfessionalProfile/index.tsx +36 -7
  169. package/themes/original/src/components/Promotions/index.tsx +5 -4
  170. package/themes/original/src/components/Promotions/styles.tsx +3 -1
  171. package/themes/original/src/components/ReviewOrder/index.tsx +26 -9
  172. package/themes/original/src/components/ReviewOrder/styles.tsx +7 -0
  173. package/themes/original/src/components/ReviewProducts/index.tsx +16 -7
  174. package/themes/original/src/components/ReviewTrigger/index.tsx +27 -9
  175. package/themes/original/src/components/ReviewTrigger/styles.tsx +8 -1
  176. package/themes/original/src/components/ScheduleAccordion/index.tsx +68 -0
  177. package/themes/original/src/components/ScheduleAccordion/styles.tsx +14 -0
  178. package/themes/original/src/components/ServiceForm/index.tsx +66 -17
  179. package/themes/original/src/components/Sessions/index.tsx +11 -8
  180. package/themes/original/src/components/Sessions/styles.tsx +5 -0
  181. package/themes/original/src/components/SignupForm/index.tsx +43 -27
  182. package/themes/original/src/components/SingleOrderCard/index.tsx +130 -56
  183. package/themes/original/src/components/SingleOrderCard/styles.tsx +11 -2
  184. package/themes/original/src/components/SingleProductCard/index.tsx +72 -31
  185. package/themes/original/src/components/SingleProductCard/styles.tsx +20 -4
  186. package/themes/original/src/components/SingleProductReview/styles.tsx +1 -1
  187. package/themes/original/src/components/StripeCardsList/index.tsx +49 -5
  188. package/themes/original/src/components/StripeElementsForm/index.tsx +48 -34
  189. package/themes/original/src/components/StripeElementsForm/naked.tsx +12 -1
  190. package/themes/original/src/components/UpsellingProducts/index.tsx +238 -224
  191. package/themes/original/src/components/UpsellingProducts/styles.tsx +12 -1
  192. package/themes/original/src/components/UserDetails/index.tsx +3 -1
  193. package/themes/original/src/components/UserFormDetails/index.tsx +76 -7
  194. package/themes/original/src/components/UserFormDetails/styles.tsx +1 -1
  195. package/themes/original/src/components/UserProfile/index.tsx +88 -79
  196. package/themes/original/src/components/UserProfileForm/index.tsx +27 -29
  197. package/themes/original/src/components/UserProfileForm/styles.tsx +7 -0
  198. package/themes/original/src/components/WalletTransactionItem/index.tsx +2 -2
  199. package/themes/original/src/components/WalletTransactions/index.tsx +3 -3
  200. package/themes/original/src/components/Wallets/index.tsx +66 -30
  201. package/themes/original/src/components/Wallets/styles.tsx +3 -4
  202. package/themes/original/src/components/shared/OButton.tsx +6 -2
  203. package/themes/original/src/components/shared/OInput.tsx +6 -1
  204. package/themes/original/src/components/shared/OModal.tsx +3 -3
  205. package/themes/original/src/types/index.tsx +36 -10
  206. package/themes/original/src/utils/index.tsx +273 -1
  207. 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: 30,
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
  }
@@ -455,14 +493,27 @@ export const ProductOptionsUI = (props: any) => {
455
493
  : t('LOGIN_SIGNUP', 'Login / Sign Up')
456
494
  }
457
495
  imgRightSrc=""
458
- textStyle={{ color: theme.colors.primary, fontSize: 14 }}
496
+ textStyle={{ color: theme.colors.primary, fontSize: 13, textAlign: 'center' }}
459
497
  style={{
460
- height: 44,
498
+ height: 42,
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} style={{ textAlign: 'center' }}>{t('WITH_GUEST_USER', 'With Guest user')}</OText>
514
+ )}
515
+ </TouchableOpacity>
516
+ )}
466
517
  </View>
467
518
  )
468
519
  }
@@ -476,14 +527,37 @@ 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
+ <IconAntDesign
543
+ name='arrowleft'
544
+ size={26}
545
+ />
546
+ </TopActions>
547
+ {showTitle && (
548
+ <OText
549
+ size={16}
550
+ style={{ flex: 1, textAlign: 'center' }}
551
+ weight={Platform.OS === 'ios' ? '600' : 'bold'}
552
+ numberOfLines={2}
553
+ ellipsizeMode='tail'
554
+ >
555
+ {product?.name}
556
+ </OText>
557
+ )}
558
+ </>
559
+ </TopHeader>
560
+ </View>
487
561
  {!error && (
488
562
  <ScrollView
489
563
  ref={scrollViewRef}
@@ -532,14 +606,14 @@ export const ProductOptionsUI = (props: any) => {
532
606
  </View>
533
607
  }
534
608
  >
535
- {gallery && gallery.length > 0 && gallery.map((img, i) => (
609
+ {gallery && gallery?.length > 0 && gallery.map((img, i) => (
536
610
  <View
537
611
  style={styles.slide1}
538
612
  key={i}
539
613
  >
540
- {String(img).includes('image') || typeof img === 'number' ? (
614
+ {(String(img).includes('http') || typeof img === 'number') ? (
541
615
  <FastImage
542
- style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 3 / 2 }}
616
+ style={{ height: '100%', opacity: isSoldOut ? 0.5 : 1, aspectRatio: 16 / 9 }}
543
617
  source={typeof img !== 'number' ? {
544
618
  uri: optimizeImage(img, 'h_1024,c_limit'),
545
619
  priority: FastImage.priority.normal,
@@ -548,7 +622,8 @@ export const ProductOptionsUI = (props: any) => {
548
622
  ) : (
549
623
  <>
550
624
  <YoutubePlayer
551
- height={300}
625
+ height={'100%'}
626
+ width={'100%'}
552
627
  play={playing}
553
628
  videoId={img}
554
629
  onChangeState={onStateChange}
@@ -566,7 +641,7 @@ export const ProductOptionsUI = (props: any) => {
566
641
  paddingVertical: 15
567
642
  }}
568
643
  >
569
- {gallery.length > 0 && gallery.map((img, index) => (
644
+ {gallery?.length > 1 && gallery.map((img, index) => (
570
645
  <TouchableOpacity
571
646
  key={index}
572
647
  onPress={() => handleClickThumb(index)}
@@ -579,7 +654,7 @@ export const ProductOptionsUI = (props: any) => {
579
654
  opacity: index === thumbsSwiper ? 1 : 0.8
580
655
  }}
581
656
  >
582
- {String(img).includes('image') ? (
657
+ {String(img).includes('http') ? (
583
658
  <OIcon
584
659
  url={img}
585
660
  style={{
@@ -594,7 +669,7 @@ export const ProductOptionsUI = (props: any) => {
594
669
  />
595
670
  ) : (
596
671
  <OIcon
597
- url={'http://img.youtube.com/vi/' + img + '/0.jpg'}
672
+ url={'https://img.youtube.com/vi/' + img + '/0.jpg'}
598
673
  style={{
599
674
  borderColor: theme.colors.lightGray,
600
675
  borderRadius: 8,
@@ -614,7 +689,10 @@ export const ProductOptionsUI = (props: any) => {
614
689
  </>
615
690
  )}
616
691
  </WrapHeader>
617
- <ProductSummary onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}>
692
+ <ProductSummary
693
+ ph={isChewLayout ? 20 : 30}
694
+ onLayout={(event: any) => setSummaryRefHeight(event.nativeEvent.layout?.height)}
695
+ >
618
696
  <ProductTitle>
619
697
  {loading && !product ? (
620
698
  <Placeholder Animation={Fade}>
@@ -714,11 +792,11 @@ export const ProductOptionsUI = (props: any) => {
714
792
  marginBottom: 20,
715
793
  borderBottomWidth: 1,
716
794
  borderBottomColor: theme.colors.border,
717
- marginHorizontal: 30,
795
+ marginHorizontal: 20,
718
796
  backgroundColor: theme.colors.backgroundPage,
719
797
  }}
720
798
  >
721
- {product?.ingredients.length > 0 && (
799
+ {product?.ingredients?.length > 0 && (
722
800
  <TouchableOpacity
723
801
  key={`eopt_key_01`}
724
802
  onPress={() => {
@@ -743,7 +821,7 @@ export const ProductOptionsUI = (props: any) => {
743
821
  </OText>
744
822
  </TouchableOpacity>
745
823
  )}
746
- {product?.extras.map((extra: any) =>
824
+ {product?.extras?.map((extra: any) =>
747
825
  <ExtraOptions key={extra.id} options={extra.options} />
748
826
  )}
749
827
  </ExtraOptionWrap>
@@ -788,12 +866,13 @@ export const ProductOptionsUI = (props: any) => {
788
866
  </>
789
867
  ) : (
790
868
  <ProductEditions
869
+ style={{ paddingHorizontal: isChewLayout ? 20 : 30 }}
791
870
  onLayout={(event: any) => {
792
871
  setEditionsLayoutY(event.nativeEvent.layout?.y)
793
872
  }}
794
873
  >
795
874
  <>
796
- {product?.ingredients.length > 0 && (
875
+ {product?.ingredients?.length > 0 && (
797
876
  <View style={styles.optionContainer} onLayout={(event: any) => handleOnLayout(event, 0)}>
798
877
  <SectionTitle>
799
878
  <OText size={16}>
@@ -815,8 +894,8 @@ export const ProductOptionsUI = (props: any) => {
815
894
  </WrapperIngredients>
816
895
  </View>
817
896
  )}
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) => {
897
+ {product?.extras?.sort((a: any, b: any) => a.rank - b.rank).map((extra: any) =>
898
+ extra.options?.sort((a: any, b: any) => a.rank - b.rank).map((option: any) => {
820
899
  const currentState =
821
900
  productCart.options[`id:${option.id}`] || {};
822
901
  return (
@@ -832,7 +911,7 @@ export const ProductOptionsUI = (props: any) => {
832
911
  backgroundColor: isError(option.id),
833
912
  borderRadius: 7.6
834
913
  }}>
835
- {option.suboptions.sort((a: any, b: any) => a.rank - b.rank).map(
914
+ {option?.suboptions?.sort((a: any, b: any) => a.rank - b.rank).map(
836
915
  (suboption: any) => {
837
916
  const currentState =
838
917
  productCart.options[
@@ -897,7 +976,7 @@ export const ProductOptionsUI = (props: any) => {
897
976
  )}
898
977
  </ProductEditions>
899
978
  )}
900
- {!!error && error.length > 0 && (
979
+ {!!error && error?.length > 0 && (
901
980
  <NotFoundSource content={error[0]?.message || error[0]} />
902
981
  )}
903
982
  </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`
@@ -47,7 +47,7 @@ export const ProductTitle = styled.View`
47
47
  export const ProductDescription = styled.View``
48
48
 
49
49
  export const ProductEditions = styled.View`
50
- padding: 0 40px;
50
+ padding-vertical: 0;
51
51
  `
52
52
 
53
53
  export const SectionTitle = styled.View`
@@ -70,7 +70,7 @@ export const ProductActions = styled.View`
70
70
  position: absolute;
71
71
  bottom: 0px;
72
72
  padding-top: ${(props: any) => props.ios ? '20px' : '0'};
73
- padding-horizontal: 40px;
73
+ padding-horizontal: 30px;
74
74
  padding-vertical: 20px;
75
75
  width: 100%;
76
76
  flex-direction: ${(props: any) => props.isColumn ? 'column' : 'row'};
@@ -94,7 +94,7 @@ export const WeightUnitItem = styled.View`
94
94
  `}
95
95
  `
96
96
  export const ProductSummary = styled.View`
97
- padding: 26px 40px 0;
97
+ padding: 26px ${(props: any) => props.ph}px 0;
98
98
  position: relative;
99
99
  background-color: white;
100
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,19 +228,19 @@ 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
242
  <View style={{ display: 'flex', flexDirection: 'row', justifyContent: 'flex-start', height: 20 }}>
240
- {onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
243
+ {!isDisabledEdit && onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && (
241
244
  <TouchableOpacity onPress={() => handleEditProduct(product)} style={{ marginRight: 5 }}>
242
245
  <MaterialCommunityIcon
243
246
  name='pencil-outline'
@@ -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>
@@ -32,7 +32,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
32
32
  setIsScrollAvailable
33
33
  } = props
34
34
 
35
- 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)
36
36
  const price = option?.with_half_option && suboption?.half_price && state.position !== 'whole' ? suboption?.half_price : suboption?.price
37
37
 
38
38
  const theme = useTheme();
@@ -41,8 +41,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
41
41
  const [showMessage, setShowMessage] = useState(false)
42
42
  const [isDirty, setIsDirty] = useState(false)
43
43
 
44
- const isChewLayout = theme?.business_view?.components?.header?.components?.layout?.type === 'chew'
45
- const iconsSize = isChewLayout ? 20 : 16
44
+ const iconsSize = 20
46
45
 
47
46
  const handleSuboptionClick = () => {
48
47
  toggleSelect()
@@ -68,7 +67,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
68
67
 
69
68
  return (
70
69
  <View>
71
- <Container onPress={() => handleSuboptionClick()}>
70
+ <Container onPress={!(option?.with_half_option || option?.allow_suboption_quantity) ? () => handleSuboptionClick() : null}>
72
71
  <IconControl disabled={disabled} onPress={() => handleSuboptionClick()}>
73
72
  {((option?.min === 0 && option?.max === 1) || option?.max > 1) ? (
74
73
  state?.selected ? (
@@ -83,12 +82,12 @@ export const ProductOptionSubOptionUI = (props: any) => {
83
82
  <OIcon src={theme.images.general.radio_nor} color={theme.colors.disabled} width={16} />
84
83
  )
85
84
  )}
86
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={10} style={{ flex: 1 }}>
85
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} mLeft={5} style={{ flex: 1 }}>
87
86
  {suboption?.name}
88
87
  </OText>
89
88
  </IconControl>
90
- <QuantityControl>
91
- {option?.allow_suboption_quantity && state?.selected && (
89
+ {option?.allow_suboption_quantity && state?.selected && (
90
+ <QuantityControl>
92
91
  <>
93
92
  <Checkbox disabled={disabled || state.quantity === 0} onPress={decrement}>
94
93
  <IconAntDesign
@@ -97,7 +96,7 @@ export const ProductOptionSubOptionUI = (props: any) => {
97
96
  color={state.quantity === 0 || disabled ? theme.colors.disabled : theme.colors.primary}
98
97
  />
99
98
  </Checkbox>
100
- <OText size={12} mLeft={5} mRight={5}>
99
+ <OText size={12}>
101
100
  {state.quantity}
102
101
  </OText>
103
102
  <Checkbox disabled={disabled || disableIncrement} onPress={increment}>
@@ -108,16 +107,17 @@ export const ProductOptionSubOptionUI = (props: any) => {
108
107
  />
109
108
  </Checkbox>
110
109
  </>
111
- )}
112
- </QuantityControl>
113
- <PositionControl>
114
- {option?.with_half_option && state?.selected && (
110
+ </QuantityControl>
111
+ )}
112
+ {option?.with_half_option && state?.selected && (
113
+ <PositionControl>
115
114
  <>
116
115
  <Circle disabled={disabled} onPress={() => changePosition('left')}>
117
116
  <OIcon
118
117
  src={theme.images.general.half_l}
119
118
  color={state.selected && state.position === 'left' ? theme.colors.primary : '#cbcbcb'}
120
- width={16}
119
+ width={20}
120
+ height={20}
121
121
  style={styles.inverse}
122
122
  />
123
123
  </Circle>
@@ -125,21 +125,23 @@ export const ProductOptionSubOptionUI = (props: any) => {
125
125
  <OIcon
126
126
  src={theme.images.general.half_f}
127
127
  color={state.selected && state.position === 'whole' ? theme.colors.primary : '#cbcbcb'}
128
- width={16}
128
+ width={20}
129
+ height={20}
129
130
  />
130
131
  </Circle>
131
132
  <Circle disabled={disabled} onPress={() => changePosition('right')}>
132
133
  <OIcon
133
134
  src={theme.images.general.half_r}
134
135
  color={state.selected && state.position === 'right' ? theme.colors.primary : '#cbcbcb'}
135
- width={16}
136
+ width={20}
137
+ height={20}
136
138
  />
137
139
  </Circle>
138
140
  </>
139
- )}
140
- </PositionControl>
141
+ </PositionControl>
142
+ )}
141
143
  {price > 0 && (
142
- <OText size={12} lineHeight={18} color={theme.colors.textSecondary}>
144
+ <OText size={12} lineHeight={18} color={theme.colors.textSecondary} style={{width: 70, maxWidth: 70}}>
143
145
  + {parsePrice(price)}
144
146
  </OText>
145
147
  )}
@@ -4,35 +4,31 @@ 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 0 10px 10px;
13
+ width: 35%;
14
14
  align-items: center;
15
15
  `
16
16
 
17
17
  export const QuantityControl = styled.View`
18
18
  flex-direction: row;
19
19
  align-items: center;
20
- justify-content: flex-start;
21
- margin-horizontal: 5px;
22
- flex: 1;
23
- width: 60px;
20
+ justify-content: space-between;
21
+ width: 62px;
24
22
  `
25
23
 
26
24
  export const PositionControl = styled.View`
27
25
  flex-direction: row;
28
26
  align-items: center;
29
- margin-right: 5px;
30
- flex: 1;
31
27
  `
32
28
 
33
29
  export const Checkbox = styled.TouchableOpacity`
34
30
  `
35
31
 
36
32
  export const Circle = styled.TouchableOpacity`
37
- margin: 0 1px;
33
+ margin: 0 1.5px;
38
34
  `