ordering-ui-react-native 0.14.89 → 0.14.90-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 (135) hide show
  1. package/package.json +6 -3
  2. package/src/DeliveryApp.tsx +34 -2
  3. package/src/assets/images/no-network.png +0 -0
  4. package/src/components/BusinessTypeFilter/index.tsx +9 -2
  5. package/src/components/BusinessTypeFilter/styles.tsx +1 -1
  6. package/src/components/BusinessesListing/index.tsx +1 -1
  7. package/src/components/Cart/index.tsx +1 -1
  8. package/src/components/Checkout/index.tsx +0 -1
  9. package/src/components/Home/index.tsx +3 -5
  10. package/src/components/LanguageSelector/index.tsx +65 -97
  11. package/src/components/LanguageSelector/styles.tsx +4 -17
  12. package/src/components/Messages/index.tsx +38 -30
  13. package/src/components/MomentOption/index.tsx +3 -1
  14. package/src/components/OrderDetails/index.tsx +26 -5
  15. package/src/components/PaymentOptions/index.tsx +7 -16
  16. package/src/components/PaymentOptionsWebView/index.tsx +123 -124
  17. package/src/components/ProductForm/index.tsx +1 -1
  18. package/src/components/ProductForm/styles.tsx +1 -0
  19. package/src/components/StripeElementsForm/index.tsx +27 -48
  20. package/src/components/UserProfileForm/index.tsx +35 -1
  21. package/src/components/VerifyPhone/styles.tsx +1 -2
  22. package/src/config.json +0 -2
  23. package/src/pages/Checkout.tsx +1 -1
  24. package/src/providers/AlertProvider.tsx +4 -1
  25. package/src/theme.json +2 -1
  26. package/src/types/index.tsx +2 -9
  27. package/src/utils/index.tsx +2 -1
  28. package/themes/business/index.tsx +4 -0
  29. package/themes/business/src/components/Chat/index.tsx +32 -31
  30. package/themes/business/src/components/NetworkError/index.tsx +61 -0
  31. package/themes/business/src/components/NetworkError/styles.tsx +11 -0
  32. package/themes/business/src/components/OrderDetails/Business.tsx +1 -0
  33. package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +85 -17
  34. package/themes/business/src/components/OrdersListManager/index.tsx +871 -0
  35. package/themes/business/src/components/OrdersListManager/styles.tsx +123 -0
  36. package/themes/business/src/components/OrdersListManager/utils.tsx +216 -0
  37. package/themes/business/src/components/OrdersOption/index.tsx +18 -68
  38. package/themes/business/src/components/OrdersOption/styles.tsx +2 -5
  39. package/themes/business/src/components/PreviousOrders/index.tsx +34 -11
  40. package/themes/business/src/components/ReviewCustomer/index.tsx +5 -1
  41. package/themes/business/src/types/index.tsx +4 -0
  42. package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
  43. package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
  44. package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
  45. package/themes/kiosk/index.tsx +2 -0
  46. package/themes/kiosk/src/components/BusinessController/index.tsx +27 -6
  47. package/themes/kiosk/src/components/BusinessController/styles.tsx +1 -1
  48. package/themes/kiosk/src/components/BusinessProductsListing/index.tsx +51 -24
  49. package/themes/kiosk/src/components/Cart/index.tsx +1 -1
  50. package/themes/kiosk/src/components/CartBottomSheet/index.tsx +1 -1
  51. package/themes/kiosk/src/components/CartBottomSheet/styles.tsx +1 -1
  52. package/themes/kiosk/src/components/CartContent/index.tsx +13 -3
  53. package/themes/kiosk/src/components/CartItem/index.tsx +20 -8
  54. package/themes/kiosk/src/components/CategoriesMenu/index.tsx +7 -5
  55. package/themes/kiosk/src/components/CustomerName/index.tsx +89 -88
  56. package/themes/kiosk/src/components/Intro/index.tsx +13 -13
  57. package/themes/kiosk/src/components/LanguageSelector/index.tsx +12 -8
  58. package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
  59. package/themes/kiosk/src/components/NetworkError/index.tsx +60 -0
  60. package/themes/kiosk/src/components/NetworkError/styles.tsx +11 -0
  61. package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
  62. package/themes/kiosk/src/components/OrderDetails/index.tsx +2 -2
  63. package/themes/kiosk/src/components/OrderSummary/index.tsx +1 -1
  64. package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +10 -12
  65. package/themes/kiosk/src/components/ProductForm/index.tsx +172 -124
  66. package/themes/kiosk/src/components/ProductForm/styles.tsx +1 -1
  67. package/themes/kiosk/src/components/ProductOption/index.tsx +1 -0
  68. package/themes/kiosk/src/components/ProductOption/styles.tsx +1 -0
  69. package/themes/kiosk/src/components/UpsellingProducts/index.tsx +48 -34
  70. package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
  71. package/themes/kiosk/src/components/shared/OCard.tsx +112 -78
  72. package/themes/kiosk/src/types/index.d.ts +4 -0
  73. package/themes/original/index.tsx +36 -6
  74. package/themes/original/src/components/AddressForm/index.tsx +15 -10
  75. package/themes/original/src/components/AddressList/index.tsx +27 -1
  76. package/themes/original/src/components/AnalyticsSegment/index.tsx +127 -0
  77. package/themes/original/src/components/BusinessBasicInformation/index.tsx +11 -7
  78. package/themes/original/src/components/BusinessController/index.tsx +5 -4
  79. package/themes/original/src/components/BusinessMenuList/index.tsx +4 -2
  80. package/themes/original/src/components/BusinessPreorder/index.tsx +142 -121
  81. package/themes/original/src/components/BusinessProductsCategories/index.tsx +1 -1
  82. package/themes/original/src/components/BusinessProductsList/index.tsx +50 -6
  83. package/themes/original/src/components/BusinessProductsListing/index.tsx +13 -10
  84. package/themes/original/src/components/BusinessReviews/index.tsx +4 -3
  85. package/themes/original/src/components/BusinessesListing/index.tsx +23 -22
  86. package/themes/original/src/components/Cart/index.tsx +43 -10
  87. package/themes/original/src/components/CartContent/index.tsx +2 -2
  88. package/themes/original/src/components/Checkout/index.tsx +54 -30
  89. package/themes/original/src/components/Checkout/styles.tsx +7 -0
  90. package/themes/original/src/components/CouponControl/index.tsx +1 -0
  91. package/themes/original/src/components/DriverTips/index.tsx +1 -1
  92. package/themes/original/src/components/ForgotPasswordForm/index.tsx +8 -12
  93. package/themes/original/src/components/HighestRatedBusinesses/index.tsx +9 -2
  94. package/themes/original/src/components/LoginForm/index.tsx +83 -68
  95. package/themes/original/src/components/Messages/index.tsx +24 -21
  96. package/themes/original/src/components/Messages/styles.tsx +1 -3
  97. package/themes/original/src/components/MomentOption/index.tsx +127 -152
  98. package/themes/original/src/components/MomentOption/styles.tsx +42 -18
  99. package/themes/original/src/components/NetworkError/index.tsx +61 -0
  100. package/themes/original/src/components/NetworkError/styles.tsx +11 -0
  101. package/themes/original/src/components/OrderDetails/index.tsx +103 -124
  102. package/themes/original/src/components/OrderDetails/styles.tsx +3 -1
  103. package/themes/original/src/components/OrderProgress/index.tsx +2 -3
  104. package/themes/original/src/components/OrderSummary/index.tsx +35 -2
  105. package/themes/original/src/components/OrdersOption/index.tsx +16 -40
  106. package/themes/original/src/components/OrdersOption/styles.tsx +0 -5
  107. package/themes/original/src/components/PaymentOptionWallet/index.tsx +1 -1
  108. package/themes/original/src/components/PaymentOptions/index.tsx +21 -24
  109. package/themes/original/src/components/PhoneInputNumber/index.tsx +15 -8
  110. package/themes/original/src/components/PlaceSpot/index.tsx +114 -0
  111. package/themes/original/src/components/PlaceSpot/styles.tsx +11 -0
  112. package/themes/original/src/components/PreviousOrders/index.tsx +4 -0
  113. package/themes/original/src/components/ProductForm/index.tsx +154 -105
  114. package/themes/original/src/components/ProductForm/styles.tsx +5 -3
  115. package/themes/original/src/components/ProductOptionSubOption/index.tsx +6 -1
  116. package/themes/original/src/components/ReviewDriver/index.tsx +2 -1
  117. package/themes/original/src/components/ReviewOrder/index.tsx +2 -17
  118. package/themes/original/src/components/SignupForm/index.tsx +173 -154
  119. package/themes/original/src/components/SingleProductCard/index.tsx +6 -13
  120. package/themes/original/src/components/SingleProductCard/styles.tsx +1 -1
  121. package/themes/original/src/components/SingleProductReview/index.tsx +4 -0
  122. package/themes/original/src/components/StripeElementsForm/index.tsx +55 -72
  123. package/themes/original/src/components/UpsellingProducts/index.tsx +6 -6
  124. package/themes/original/src/components/UserDetails/index.tsx +4 -95
  125. package/themes/original/src/components/UserFormDetails/index.tsx +2 -14
  126. package/themes/original/src/components/UserProfile/index.tsx +16 -9
  127. package/themes/original/src/components/UserProfileForm/index.tsx +16 -8
  128. package/themes/original/src/components/VerifyPhone/index.tsx +10 -7
  129. package/themes/original/src/components/VerifyPhone/styles.tsx +2 -1
  130. package/themes/original/src/components/shared/HeaderTitle.tsx +20 -0
  131. package/themes/original/src/components/shared/index.tsx +2 -0
  132. package/themes/original/src/types/index.tsx +18 -8
  133. package/themes/single-business/src/components/OrderTypeSelector/index.tsx +5 -5
  134. package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
  135. package/src/components/StripeMethodForm/index.tsx +0 -163
@@ -0,0 +1,127 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { createClient, AnalyticsProvider } from '@segment/analytics-react-native';
3
+ import { useEvent, useConfig } from 'ordering-components/native';
4
+
5
+ export const AnalyticsSegment = (props: any) => {
6
+ const { children } = props
7
+
8
+ const [events] = useEvent()
9
+ const [configState] = useConfig()
10
+ const [segmentClient, setSegmentClient] = useState<any>({})
11
+
12
+ const handleClickProduct = (product: any) => {
13
+ segmentClient.track('Product Clicked', {
14
+ id: product.id,
15
+ name: product.name,
16
+ category: product.category_id,
17
+ price: product.price
18
+ })
19
+ }
20
+
21
+ const handleProductAdded = (product: any) => {
22
+ segmentClient.track('Product Added', {
23
+ id: product.id,
24
+ name: product.name,
25
+ category: product.category_id,
26
+ price: product.price,
27
+ quantity: product.quantity
28
+ })
29
+ }
30
+
31
+ const handleProductRemoved = (product: any) => {
32
+ segmentClient.track('Product Removed', {
33
+ id: product.id,
34
+ name: product.name,
35
+ category: product.category_id,
36
+ price: product.price,
37
+ quantity: product.quantity
38
+ })
39
+ }
40
+
41
+ const handleOrderPlaced = (order: any) => {
42
+ segmentClient.track('Order Placed', {
43
+ id: order.id,
44
+ affiliation: order.business?.name,
45
+ revenue: order.total,
46
+ tax: order.tax_total,
47
+ shipping: order.delivery_zone_price
48
+ })
49
+ segmentClient.track('Payment Info Entered', {
50
+ order: order.id,
51
+ business: order.business?.name,
52
+ business_id: order.business_id,
53
+ total: order.total,
54
+ tax: order.tax_total,
55
+ delivery: order.delivery_zone_price,
56
+ paymethod: order.paymethod
57
+ })
58
+ }
59
+
60
+ const handleUpdateOrder = (order: any) => {
61
+ segmentClient.track('Order Updated', {
62
+ id: order.id,
63
+ affiliation: order.business?.name,
64
+ revenue: order.total,
65
+ tax: order.tax_total,
66
+ shipping: order.delivery_zone_price
67
+ })
68
+ }
69
+
70
+ const handleAddOrder = (order: any) => {
71
+ segmentClient.track('Order Added', {
72
+ id: order.id,
73
+ affiliation: order.business?.name,
74
+ revenue: order.total,
75
+ tax: order.tax_total,
76
+ shipping: order.delivery_zone_price
77
+ })
78
+ }
79
+
80
+ const handleLogin = (data: any) => {
81
+ segmentClient.identify(data.id, {
82
+ email: data.email,
83
+ name: data.name
84
+ })
85
+ }
86
+
87
+ useEffect(() => {
88
+ if (segmentClient?.config?.writeKey) {
89
+ events.on('product_clicked', handleClickProduct)
90
+ events.on('userLogin', handleLogin)
91
+ events.on('product_added', handleProductAdded)
92
+ events.on('order_placed', handleOrderPlaced)
93
+ events.on('order_updated', handleUpdateOrder)
94
+ events.on('order_added', handleAddOrder)
95
+ events.on('cart_product_removed', handleProductRemoved)
96
+ }
97
+ return () => {
98
+ if (segmentClient?.config?.writeKey) {
99
+ events.off('product_clicked', handleClickProduct)
100
+ events.off('userLogin', handleLogin)
101
+ events.off('product_added', handleProductAdded)
102
+ events.off('order_placed', handleOrderPlaced)
103
+ events.off('order_updated', handleUpdateOrder)
104
+ events.off('order_added', handleAddOrder)
105
+ events.off('cart_product_removed', handleProductRemoved)
106
+ }
107
+ }
108
+ }, [segmentClient])
109
+
110
+ useEffect(() => {
111
+ if (configState?.configs?.segment_track_id?.value) {
112
+ const _segmentClient: any = createClient({
113
+ writeKey: configState?.configs?.segment_track_id?.value
114
+ });
115
+ setSegmentClient(_segmentClient)
116
+ }
117
+ }, [configState])
118
+
119
+ return (
120
+ <>
121
+ <AnalyticsProvider client={segmentClient}>
122
+ {children}
123
+ </AnalyticsProvider>
124
+ </>
125
+
126
+ )
127
+ }
@@ -29,7 +29,7 @@ const types = ['food', 'laundry', 'alcohol', 'groceries'];
29
29
  export const BusinessBasicInformation = (
30
30
  props: BusinessBasicInformationParams,
31
31
  ) => {
32
- const { navigation, businessState, isBusinessInfoShow, logo, header } = props;
32
+ const { navigation, businessState, isBusinessInfoShow, logo, header, isPreOrder } = props;
33
33
  const { business, loading } = businessState;
34
34
 
35
35
  const theme = useTheme();
@@ -181,12 +181,16 @@ export const BusinessBasicInformation = (
181
181
  <WrapReviews>
182
182
  {!isBusinessInfoShow && (
183
183
  <>
184
- <TouchableOpacity onPress={() => navigation.navigate('BusinessPreorder', { business: businessState?.business, handleBusinessClick: () => navigation?.goBack() })}>
185
- <OText color={theme.colors.textSecondary} style={{ textDecorationLine: 'underline' }}>
186
- {t('PRE_ORDER', 'Preorder')}
187
- </OText>
188
- </TouchableOpacity>
189
- <OText size={12} color={theme.colors.textSecondary}>{' \u2022 '}</OText>
184
+ { isPreOrder && (
185
+ <>
186
+ <TouchableOpacity onPress={() => navigation.navigate('BusinessPreorder', { business: businessState?.business, handleBusinessClick: () => navigation?.goBack() })}>
187
+ <OText color={theme.colors.textSecondary} style={{ textDecorationLine: 'underline' }}>
188
+ {t('PRE_ORDER', 'Preorder')}
189
+ </OText>
190
+ </TouchableOpacity>
191
+ <OText size={12} color={theme.colors.textSecondary}>{' \u2022 '}</OText>
192
+ </>
193
+ )}
190
194
  <TouchableOpacity onPress={() => setOpenBusinessReviews(true)}>
191
195
  <OText color={theme.colors.textSecondary} style={{ textDecorationLine: 'underline' }}>
192
196
  {t('REVIEWS', 'Reviews')}
@@ -4,6 +4,7 @@ import {
4
4
  useUtils,
5
5
  useOrder,
6
6
  useLanguage,
7
+ useConfig
7
8
  } from 'ordering-components/native';
8
9
  import { OIcon, OText } from '../shared';
9
10
  import { StyleSheet, View } from 'react-native';
@@ -29,9 +30,9 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
29
30
  const [{ parsePrice, parseDistance, parseNumber, optimizeImage }] =
30
31
  useUtils();
31
32
  const [orderState] = useOrder();
33
+ const [configState] = useConfig();
32
34
  const [, t] = useLanguage();
33
35
  const theme = useTheme()
34
-
35
36
  const styles = StyleSheet.create({
36
37
  headerStyle: {
37
38
  borderTopLeftRadius: 7.6,
@@ -111,7 +112,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
111
112
  <FastImage
112
113
  style={{ height: 120 }}
113
114
  source={{
114
- uri: optimizeImage(business?.header, 'h_120,c_limit'),
115
+ uri: optimizeImage(business?.header, 'h_500,c_limit'),
115
116
  priority: FastImage.priority.normal,
116
117
  }}
117
118
  resizeMode={FastImage.resizeMode.cover}
@@ -122,7 +123,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
122
123
  </View>
123
124
  )}
124
125
  <BusinessState>
125
- {!isBusinessOpen && (
126
+ {!isBusinessOpen && (configState?.configs?.preorder_status_enabled?.value === '1') && (
126
127
  <View style={styles.businessStateView}>
127
128
  <OText
128
129
  color={theme.colors.textThird}
@@ -140,7 +141,7 @@ export const BusinessControllerUI = (props: BusinessControllerParams) => {
140
141
  <FastImage
141
142
  style={{ width: 56, height: 56 }}
142
143
  source={{
143
- uri: optimizeImage(business?.logo, 'h_60,c_limit'),
144
+ uri: optimizeImage(business?.logo, 'h_150,c_limit'),
144
145
  priority: FastImage.priority.normal,
145
146
  }}
146
147
  resizeMode={FastImage.resizeMode.cover}
@@ -7,6 +7,7 @@ import { useTheme } from 'styled-components/native'
7
7
  import IconAntDesign from 'react-native-vector-icons/AntDesign'
8
8
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder'
9
9
  import SelectDropdown from 'react-native-select-dropdown'
10
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
10
11
 
11
12
  const windowHeight = Dimensions.get('window').height;
12
13
 
@@ -18,6 +19,7 @@ const BusinessMenuListUI = (props: BusinessMenuListParams) => {
18
19
 
19
20
  const [, t] = useLanguage()
20
21
  const theme = useTheme()
22
+ const {top} = useSafeAreaInsets()
21
23
 
22
24
  const styles = StyleSheet.create({
23
25
  container: {
@@ -81,7 +83,7 @@ const BusinessMenuListUI = (props: BusinessMenuListParams) => {
81
83
  dropdownStyle={{
82
84
  borderRadius: 8,
83
85
  borderColor: theme.colors.lightGray,
84
- marginTop: Platform.OS === 'ios' ? 12 : -15,
86
+ marginTop: Platform.OS === 'ios' ? 12 : -top,
85
87
  maxHeight: 160
86
88
  }}
87
89
  rowStyle={{
@@ -123,4 +125,4 @@ export const BusinessMenuList = (props: any) => {
123
125
  };
124
126
 
125
127
  return <BusinessMenuListing {...businessMenuListProps} />;
126
- };
128
+ };
@@ -21,6 +21,7 @@ import {
21
21
  TimeContentWrapper,
22
22
  TimeItem
23
23
  } from './styles'
24
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
24
25
 
25
26
  const windowHeight = Dimensions.get('window').height;
26
27
 
@@ -50,7 +51,9 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
50
51
  const [selectDate, setSelectedDate] = useState<any>(null)
51
52
  const [datesWhitelist, setDateWhitelist] = useState<any>([{ start: null, end: null }])
52
53
  const [isEnabled, setIsEnabled] = useState(false)
53
-
54
+ const { top } = useSafeAreaInsets()
55
+ const showOrderTime = (selectedPreorderType === 1 && Object.keys(menu)?.length > 0) || selectedPreorderType === 0
56
+ const isPreOrderSetting = configs?.preorder_status_enabled?.value === '1'
54
57
  const styles = StyleSheet.create({
55
58
  container: {
56
59
  height: windowHeight,
@@ -299,60 +302,62 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
299
302
  />
300
303
  </View>
301
304
  </BusinessInfoWrapper>
302
- <PreorderTypeWrapper>
303
- <OText
304
- size={16}
305
- style={{
306
- fontWeight: '600',
307
- lineHeight: 24,
308
- marginBottom: 12
309
- }}
310
- >
311
- {t('PREORDER_TYPE', 'Preorder type')}
312
- </OText>
313
- <SelectDropdown
314
- defaultValueByIndex={selectedPreorderType}
315
- data={preorderTypeList}
316
- // disabled={orderState.loading}
317
- onSelect={(selectedItem, index) => {
318
- setSelectedPreorderType(index)
319
- }}
320
- buttonTextAfterSelection={(selectedItem, index) => {
321
- return selectedItem.name
322
- }}
323
- rowTextForSelection={(item, index) => {
324
- return item.name
325
- }}
326
- buttonStyle={styles.selectOption}
327
- buttonTextStyle={{
328
- color: theme.colors.disabled,
329
- fontSize: 14,
330
- textAlign: 'left',
331
- marginHorizontal: 0
332
- }}
333
- dropdownStyle={{
334
- borderRadius: 8,
335
- borderColor: theme.colors.lightGray,
336
- marginTop: Platform.OS === 'ios' ? 12 : -15
337
- }}
338
- rowStyle={{
339
- borderBottomColor: theme.colors.backgroundGray100,
340
- backgroundColor: theme.colors.backgroundGray100,
341
- height: 40,
342
- flexDirection: 'column',
343
- alignItems: 'flex-start',
344
- paddingTop: 8,
345
- paddingHorizontal: 14
346
- }}
347
- rowTextStyle={{
348
- color: theme.colors.disabled,
349
- fontSize: 14,
350
- marginHorizontal: 0
351
- }}
352
- renderDropdownIcon={() => dropDownIcon()}
353
- dropdownOverlayColor='transparent'
354
- />
355
- </PreorderTypeWrapper>
305
+ {isPreOrderSetting && (
306
+ <PreorderTypeWrapper>
307
+ <OText
308
+ size={16}
309
+ style={{
310
+ fontWeight: '600',
311
+ lineHeight: 24,
312
+ marginBottom: 12
313
+ }}
314
+ >
315
+ {t('PREORDER_TYPE', 'Preorder type')}
316
+ </OText>
317
+ <SelectDropdown
318
+ defaultValueByIndex={selectedPreorderType}
319
+ data={preorderTypeList}
320
+ // disabled={orderState.loading}
321
+ onSelect={(selectedItem, index) => {
322
+ setSelectedPreorderType(index)
323
+ }}
324
+ buttonTextAfterSelection={(selectedItem, index) => {
325
+ return selectedItem.name
326
+ }}
327
+ rowTextForSelection={(item, index) => {
328
+ return item.name
329
+ }}
330
+ buttonStyle={styles.selectOption}
331
+ buttonTextStyle={{
332
+ color: theme.colors.disabled,
333
+ fontSize: 14,
334
+ textAlign: 'left',
335
+ marginHorizontal: 0
336
+ }}
337
+ dropdownStyle={{
338
+ borderRadius: 8,
339
+ borderColor: theme.colors.lightGray,
340
+ marginTop: Platform.OS === 'ios' ? 12 : -top
341
+ }}
342
+ rowStyle={{
343
+ borderBottomColor: theme.colors.backgroundGray100,
344
+ backgroundColor: theme.colors.backgroundGray100,
345
+ height: 40,
346
+ flexDirection: 'column',
347
+ alignItems: 'flex-start',
348
+ paddingTop: 8,
349
+ paddingHorizontal: 14
350
+ }}
351
+ rowTextStyle={{
352
+ color: theme.colors.disabled,
353
+ fontSize: 14,
354
+ marginHorizontal: 0
355
+ }}
356
+ renderDropdownIcon={() => dropDownIcon()}
357
+ dropdownOverlayColor='transparent'
358
+ />
359
+ </PreorderTypeWrapper>
360
+ )}
356
361
  {selectedPreorderType === 1 && (
357
362
  <MenuWrapper>
358
363
  <OText
@@ -372,78 +377,94 @@ const BusinessPreorderUI = (props: BusinessPreorderParams) => {
372
377
  />
373
378
  </MenuWrapper>
374
379
  )}
375
- <OrderTimeWrapper>
380
+ {isPreOrderSetting && (
381
+ <OrderTimeWrapper>
382
+ <OText
383
+ size={16}
384
+ style={{
385
+ fontWeight: '600',
386
+ lineHeight: 24
387
+ }}
388
+ >
389
+ {t('ORDER_TIME', 'Order time')}
390
+ </OText>
391
+ <View style={{ flex: 1 }}>
392
+ {selectDate && datesWhitelist[0]?.start !== null && (
393
+ <CalendarStrip
394
+ scrollable
395
+ style={styles.calendar}
396
+ calendarHeaderContainerStyle={styles.calendarHeaderContainer}
397
+ calendarHeaderStyle={styles.calendarHeader}
398
+ dateNumberStyle={styles.dateNumber}
399
+ dateNameStyle={styles.dateName}
400
+ iconContainer={{ flex: 0.1 }}
401
+ highlightDateNameStyle={styles.highlightDateName}
402
+ highlightDateNumberStyle={styles.highlightDateNumber}
403
+ dayContainerStyle={{ height: '100%' }}
404
+ highlightDateContainerStyle={{ height: '100%' }}
405
+ calendarHeaderFormat='MMMM, YYYY'
406
+ iconStyle={{ borderWidth: 1 }}
407
+ selectedDate={selectDate}
408
+ datesWhitelist={datesWhitelist}
409
+ disabledDateNameStyle={styles.disabledDateName}
410
+ disabledDateNumberStyle={styles.disabledDateNumber}
411
+ disabledDateOpacity={0.6}
412
+ onDateSelected={(date) => onSelectDate(date)}
413
+ leftSelector={<LeftSelector />}
414
+ rightSelector={<RightSelector />}
415
+ />
416
+ )}
417
+ </View>
418
+ <TimeListWrapper nestedScrollEnabled={true}>
419
+ {(isEnabled && timeList?.length > 0) ? (
420
+ <TimeContentWrapper>
421
+ {timeList.map((time: any, i: number) => (
422
+ <TouchableOpacity key={i} onPress={() => handleChangeTime(time.value)}>
423
+ <TimeItem active={timeSelected === time.value}>
424
+ <OText
425
+ size={14}
426
+ color={timeSelected === time.value ? theme.colors.primary : theme.colors.textNormal}
427
+ style={{
428
+ lineHeight: 24
429
+ }}
430
+ >{time.text}</OText>
431
+ </TimeItem>
432
+ </TouchableOpacity>
433
+ ))}
434
+ {timeList.length % 3 === 2 && (
435
+ <TimeItem style={{ backgroundColor: 'transparent' }} />
436
+ )}
437
+ </TimeContentWrapper>
438
+ ) : (
439
+ <OText
440
+ size={16}
441
+ style={{
442
+ fontWeight: '600',
443
+ lineHeight: 24,
444
+ marginBottom: 12,
445
+ textAlign: 'center'
446
+ }}
447
+ >
448
+ {t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment')}
449
+ </OText>
450
+ )}
451
+ </TimeListWrapper>
452
+ </OrderTimeWrapper>
453
+ )}
454
+ {!isPreOrderSetting && (
376
455
  <OText
377
456
  size={16}
378
457
  style={{
379
458
  fontWeight: '600',
380
- lineHeight: 24
459
+ lineHeight: 24,
460
+ marginTop: 30,
461
+ marginBottom: 12,
462
+ textAlign: 'center'
381
463
  }}
382
- >
383
- {t('ORDER_TIME', 'Order time')}
464
+ >
465
+ {t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment')}
384
466
  </OText>
385
- <View style={{ flex: 1 }}>
386
- {selectDate && datesWhitelist[0]?.start !== null && (
387
- <CalendarStrip
388
- scrollable
389
- style={styles.calendar}
390
- calendarHeaderContainerStyle={styles.calendarHeaderContainer}
391
- calendarHeaderStyle={styles.calendarHeader}
392
- dateNumberStyle={styles.dateNumber}
393
- dateNameStyle={styles.dateName}
394
- iconContainer={{ flex: 0.1 }}
395
- highlightDateNameStyle={styles.highlightDateName}
396
- highlightDateNumberStyle={styles.highlightDateNumber}
397
- dayContainerStyle={{ height: '100%' }}
398
- highlightDateContainerStyle={{ height: '100%' }}
399
- calendarHeaderFormat='MMMM, YYYY'
400
- iconStyle={{ borderWidth: 1 }}
401
- selectedDate={selectDate}
402
- datesWhitelist={datesWhitelist}
403
- disabledDateNameStyle={styles.disabledDateName}
404
- disabledDateNumberStyle={styles.disabledDateNumber}
405
- disabledDateOpacity={0.6}
406
- onDateSelected={(date) => onSelectDate(date)}
407
- leftSelector={<LeftSelector />}
408
- rightSelector={<RightSelector />}
409
- />
410
- )}
411
- </View>
412
- <TimeListWrapper nestedScrollEnabled={true}>
413
- {(isEnabled && timeList?.length > 0) ? (
414
- <TimeContentWrapper>
415
- {timeList.map((time: any, i: number) => (
416
- <TouchableOpacity key={i} onPress={() => handleChangeTime(time.value)}>
417
- <TimeItem active={timeSelected === time.value}>
418
- <OText
419
- size={14}
420
- color={timeSelected === time.value ? theme.colors.primary : theme.colors.textNormal}
421
- style={{
422
- lineHeight: 24
423
- }}
424
- >{time.text}</OText>
425
- </TimeItem>
426
- </TouchableOpacity>
427
- ))}
428
- {timeList.length % 3 === 2 && (
429
- <TimeItem style={{ backgroundColor: 'transparent' }} />
430
- )}
431
- </TimeContentWrapper>
432
- ) : (
433
- <OText
434
- size={16}
435
- style={{
436
- fontWeight: '600',
437
- lineHeight: 24,
438
- marginBottom: 12,
439
- textAlign: 'center'
440
- }}
441
- >
442
- {t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment')}
443
- </OText>
444
- )}
445
- </TimeListWrapper>
446
- </OrderTimeWrapper>
467
+ )}
447
468
  <OButton
448
469
  text={t('GO_TO_MENU', 'Go to menu')}
449
470
  textStyle={{ color: 'white' }}
@@ -111,7 +111,7 @@ const BusinessProductsCategoriesUI = (props: any) => {
111
111
  categories.length &&
112
112
  categories.map((category: any) => (
113
113
  <Tab
114
- key={category.name}
114
+ key={category.id}
115
115
  onPress={() => handleCategoryScroll(category)}
116
116
  style={[
117
117
  category.id === 'featured' && !featured && styles.featuredStyle,
@@ -1,13 +1,14 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
2
  import { ProductsList, useLanguage, useUtils, useConfig } from 'ordering-components/native';
3
3
  import { SingleProductCard } from '../SingleProductCard';
4
4
  import { NotFoundSource } from '../NotFoundSource';
5
5
  import { BusinessProductsListParams } from '../../types';
6
- import { OIcon, OText } from '../shared';
6
+ import { OButton, OIcon, OModal, OText } from '../shared';
7
7
  import { ProductsContainer, ErrorMessage, WrapperNotFound } from './styles';
8
8
  import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
9
9
  import { View } from 'react-native';
10
10
  import { StyleSheet } from 'react-native';
11
+ import { useTheme } from 'styled-components/native';
11
12
 
12
13
  const BusinessProductsListUI = (props: BusinessProductsListParams) => {
13
14
  const {
@@ -32,8 +33,9 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
32
33
  const [, t] = useLanguage();
33
34
  const [{ optimizeImage }] = useUtils()
34
35
  const [{ configs }] = useConfig()
36
+ const theme = useTheme()
35
37
  const isUseParentCategory = configs?.use_parent_category?.value === 'true' || configs?.use_parent_category?.value === '1'
36
-
38
+ const [openDescription, setOpenDescription] = useState<any>(null)
37
39
  const handleOnLayout = (event: any, categoryId: any) => {
38
40
  const _categoriesLayout = { ...categoriesLayout }
39
41
  const categoryKey = 'cat_' + categoryId
@@ -84,8 +86,11 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
84
86
 
85
87
  {!category?.id && categories.filter(category => category?.id !== null).map((category, i, _categories) => {
86
88
  const products = !isUseParentCategory
87
- ? categoryState?.products?.filter((product : any) => product?.category_id === category?.id) ?? []
88
- : categoryState?.products?.filter((product : any) => category?.children?.some((cat : any) => cat.category_id === product?.category_id)) ?? []
89
+ ? categoryState?.products?.filter((product: any) => product?.category_id === category?.id) ?? []
90
+ : categoryState?.products?.filter((product: any) => category?.children?.some((cat: any) => cat.category_id === product?.category_id)) ?? []
91
+
92
+ const shortCategoryDescription = category?.description?.length > 80 ? `${category?.description?.substring(0, 80)}...` : category?.description
93
+
89
94
  return (
90
95
  <React.Fragment key={'cat_' + category.id}>
91
96
  {products.length > 0 && (
@@ -96,7 +101,7 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
96
101
  >
97
102
  <View style={bpStyles.catIcon}>
98
103
  <OIcon
99
- url={optimizeImage(category.image, 'h_100,c_limit')}
104
+ url={optimizeImage(category.image, 'h_250,c_limit')}
100
105
  width={41}
101
106
  height={41}
102
107
  style={{ borderRadius: 7.6 }}
@@ -106,6 +111,28 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
106
111
  {category.name}
107
112
  </OText>
108
113
  </View>
114
+ {!!category?.description && (
115
+ <View style={{ position: 'relative' }}>
116
+ <OText size={12} weight={'500'} mBottom={5}>
117
+ {shortCategoryDescription}
118
+ {category?.description?.length > 80 && (
119
+ <OButton
120
+ style={{ height: 15, paddingRight: 0, paddingLeft: 0, borderWidth: 0 }}
121
+ text={t('SEE_MORE', 'See more')}
122
+ parentStyle={{ padding: 0 }}
123
+ onClick={() => setOpenDescription(category)}
124
+ bgColor='transparent'
125
+ textStyle={{
126
+ fontSize: 12,
127
+ borderBottomWidth: 1,
128
+ borderBottomColor: theme.colors.primary,
129
+ color: theme.colors.primary
130
+ }}
131
+ />
132
+ )}
133
+ </OText>
134
+ </View>
135
+ )}
109
136
  <>
110
137
  {products.sort((a: any, b: any) => a.rank - b.rank).map((product: any, i: any) => (
111
138
  <SingleProductCard
@@ -188,6 +215,23 @@ const BusinessProductsListUI = (props: BusinessProductsListParams) => {
188
215
  <OText>{e}</OText>
189
216
  </ErrorMessage>
190
217
  ))}
218
+ <OModal
219
+ open={!!openDescription}
220
+ title={openDescription?.name}
221
+ onClose={() => setOpenDescription(null)}
222
+ >
223
+ <View style={{ padding: 20 }}>
224
+ {!!openDescription?.image && (
225
+ <OIcon
226
+ url={optimizeImage(openDescription?.image, 'h_100,c_limit')}
227
+ width={240}
228
+ height={240}
229
+ style={{ borderRadius: 7.6 }}
230
+ />
231
+ )}
232
+ <OText>{openDescription?.description}</OText>
233
+ </View>
234
+ </OModal>
191
235
  </ProductsContainer>
192
236
  );
193
237
  };