ordering-ui-react-native 0.22.54 → 0.22.55-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.
- package/package.json +5 -7
- package/src/DeliveryApp.tsx +1 -1
- package/src/components/BusinessesListing/index.tsx +1 -1
- package/src/components/Checkout/index.tsx +40 -39
- package/src/components/VerifyPhone/styles.tsx +1 -2
- package/src/context/OfflineActions/index.tsx +236 -0
- package/src/providers/AlertProvider.tsx +3 -1
- package/themes/business/src/components/AcceptOrRejectOrder/index.tsx +9 -6
- package/themes/business/src/components/AcceptOrRejectOrder/styles.tsx +1 -0
- package/themes/business/src/components/BusinessController/index.tsx +8 -3
- package/themes/business/src/components/BusinessProductList/index.tsx +3 -2
- package/themes/business/src/components/Chat/index.tsx +15 -3
- package/themes/business/src/components/DriverMap/index.tsx +44 -33
- package/themes/business/src/components/FloatingButton/index.tsx +3 -2
- package/themes/business/src/components/LanguageSelector/index.tsx +1 -1
- package/themes/business/src/components/LoginForm/index.tsx +123 -98
- package/themes/business/src/components/LogoutButton/index.tsx +13 -4
- package/themes/business/src/components/MapView/index.tsx +22 -17
- package/themes/business/src/components/NewOrderNotification/index.tsx +25 -14
- package/themes/business/src/components/OrderDetails/Business.tsx +56 -20
- package/themes/business/src/components/OrderDetails/Delivery.tsx +134 -53
- package/themes/business/src/components/OrderDetails/OrderContentComponent.tsx +155 -45
- package/themes/business/src/components/OrderDetails/OrderHeaderComponent.tsx +51 -28
- package/themes/business/src/components/OrderDetails/styles.tsx +39 -3
- package/themes/business/src/components/OrderDetails/usePrinterCommands.tsx +17 -16
- package/themes/business/src/components/OrderDetailsLogistic/index.tsx +3 -2
- package/themes/business/src/components/OrderSummary/index.tsx +271 -176
- package/themes/business/src/components/OrdersListManager/index.tsx +13 -1
- package/themes/business/src/components/OrdersOption/index.tsx +345 -231
- package/themes/business/src/components/OrdersOption/styles.tsx +14 -0
- package/themes/business/src/components/PreviousMessages/index.tsx +26 -3
- package/themes/business/src/components/PreviousOrders/OrderItem.tsx +30 -18
- package/themes/business/src/components/PreviousOrders/index.tsx +74 -66
- package/themes/business/src/components/PreviousOrders/styles.tsx +2 -1
- package/themes/business/src/components/PrinterEdition/MessageAlert.tsx +33 -0
- package/themes/business/src/components/PrinterEdition/index.tsx +143 -75
- package/themes/business/src/components/PrinterEdition/printerList.tsx +23 -0
- package/themes/business/src/components/PrinterSettings/index.tsx +1 -1
- package/themes/business/src/components/ProductItemAccordion/index.tsx +3 -2
- package/themes/business/src/components/ReviewCustomer/index.tsx +2 -0
- package/themes/business/src/components/StoresList/index.tsx +2 -2
- package/themes/business/src/components/UserProfileForm/index.tsx +48 -10
- package/themes/business/src/components/UserProfileForm/styles.tsx +7 -0
- package/themes/business/src/components/WebsocketStatus/index.tsx +2 -2
- package/themes/business/src/config/currency.tsx +1010 -0
- package/themes/business/src/hooks/useLocation.tsx +16 -12
- package/themes/business/src/layouts/SafeAreaContainer.tsx +35 -19
- package/themes/business/src/types/index.tsx +22 -7
- package/themes/business/src/utils/index.tsx +28 -3
- package/themes/doordash/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/doordash/src/components/LoginForm/index.tsx +1 -2
- package/themes/instacart/src/components/BusinessesListing/index.tsx +1 -1
- package/themes/kiosk/src/components/Checkout/index.tsx +9 -5
- package/themes/kiosk/src/components/CustomerName/index.tsx +1 -1
- package/themes/kiosk/src/components/NavBar/index.tsx +14 -14
- package/themes/kiosk/src/components/OptionCard/index.tsx +1 -1
- package/themes/kiosk/src/components/OrderTypeCardSelector/index.tsx +8 -10
- package/themes/kiosk/src/components/PaymentOptions/index.tsx +121 -57
- package/themes/kiosk/src/components/shared/OButton.tsx +5 -18
- package/themes/original/index.tsx +9 -1
- package/themes/original/src/components/AddressForm/index.tsx +19 -8
- package/themes/original/src/components/AppleLogin/index.tsx +4 -4
- package/themes/original/src/components/BusinessBasicInformation/index.tsx +1 -1
- package/themes/original/src/components/BusinessController/index.tsx +4 -2
- package/themes/original/src/components/BusinessItemAccordion/index.tsx +10 -4
- package/themes/original/src/components/BusinessListingSearch/BusinessSearchFooter.tsx +103 -92
- package/themes/original/src/components/BusinessListingSearch/BusinessSearchHeader.tsx +7 -3
- package/themes/original/src/components/BusinessListingSearch/index.tsx +8 -13
- package/themes/original/src/components/BusinessPreorder/index.tsx +34 -15
- package/themes/original/src/components/BusinessProductsList/SubcategoriesComponent/index.tsx +73 -70
- package/themes/original/src/components/BusinessProductsList/index.tsx +6 -7
- package/themes/original/src/components/BusinessProductsList/styles.tsx +0 -3
- package/themes/original/src/components/BusinessProductsListing/index.tsx +10 -6
- package/themes/original/src/components/BusinessTypeFilter/index.tsx +9 -8
- package/themes/original/src/components/BusinessesListing/Layout/Appointment/index.tsx +2 -1
- package/themes/original/src/components/BusinessesListing/Layout/Original/styles.tsx +1 -1
- package/themes/original/src/components/BusinessesListing/index.tsx +0 -1
- package/themes/original/src/components/Cart/index.tsx +48 -13
- package/themes/original/src/components/CartContent/index.tsx +2 -3
- package/themes/original/src/components/Checkout/index.tsx +104 -80
- package/themes/original/src/components/Favorite/index.tsx +1 -5
- package/themes/original/src/components/ForgotPasswordForm/index.tsx +1 -2
- package/themes/original/src/components/GoogleMap/index.tsx +39 -18
- package/themes/original/src/components/HighestRatedBusinesses/index.tsx +1 -1
- package/themes/original/src/components/Home/index.tsx +35 -16
- package/themes/original/src/components/LoginForm/index.tsx +12 -5
- package/themes/original/src/components/MessageListing/index.tsx +1 -1
- package/themes/original/src/components/Messages/index.tsx +20 -13
- package/themes/original/src/components/MomentOption/TimeListItem.tsx +56 -0
- package/themes/original/src/components/MomentOption/index.tsx +72 -51
- package/themes/original/src/components/MomentSelector/index.tsx +5 -2
- package/themes/original/src/components/MultiCartsPaymethodsAndWallets/index.tsx +1 -0
- package/themes/original/src/components/MultiCheckout/index.tsx +55 -26
- package/themes/original/src/components/MyOrders/index.tsx +2 -2
- package/themes/original/src/components/NavBar/index.tsx +6 -2
- package/themes/original/src/components/OrderDetails/OrderEta.tsx +4 -3
- package/themes/original/src/components/OrderDetails/OrderHistory.tsx +11 -4
- package/themes/original/src/components/OrderDetails/index.tsx +44 -19
- package/themes/original/src/components/OrderDetails/styles.tsx +0 -1
- package/themes/original/src/components/OrderProgress/index.tsx +4 -3
- package/themes/original/src/components/OrderSummary/index.tsx +32 -11
- package/themes/original/src/components/OrderTypeSelector/index.tsx +4 -3
- package/themes/original/src/components/OrdersOption/index.tsx +3 -6
- package/themes/original/src/components/PaymentOptionWallet/index.tsx +56 -56
- package/themes/original/src/components/PaymentOptions/index.tsx +462 -459
- package/themes/original/src/components/PhoneInputNumber/index.tsx +92 -7
- package/themes/original/src/components/ProductForm/ActionButton.tsx +6 -10
- package/themes/original/src/components/ProductItemAccordion/index.tsx +28 -37
- package/themes/original/src/components/ProductOptionSubOption/index.tsx +16 -8
- package/themes/original/src/components/ServiceForm/index.tsx +1 -1
- package/themes/original/src/components/SignupForm/index.tsx +41 -24
- package/themes/original/src/components/SingleOrderCard/index.tsx +7 -4
- package/themes/original/src/components/SingleProductCard/index.tsx +3 -4
- package/themes/original/src/components/SingleProductCard/styles.tsx +0 -3
- package/themes/original/src/components/StripeCardsList/index.tsx +16 -3
- package/themes/original/src/components/StripeElementsForm/index.tsx +6 -3
- package/themes/original/src/components/StripeElementsForm/naked.tsx +1 -1
- package/themes/original/src/components/TaxInformation/index.tsx +3 -2
- package/themes/original/src/components/UpsellingProducts/UpsellingContent.tsx +7 -2
- package/themes/original/src/components/UserDetails/index.tsx +17 -16
- package/themes/original/src/components/UserFormDetails/index.tsx +109 -67
- package/themes/original/src/components/UserProfile/index.tsx +9 -1
- package/themes/original/src/components/UserVerification/index.tsx +18 -5
- package/themes/original/src/components/shared/OAlert.tsx +2 -1
- package/themes/original/src/components/shared/OButton.tsx +2 -2
- package/themes/original/src/components/shared/OInput.tsx +4 -8
- package/themes/original/src/components/shared/OModal.tsx +7 -2
- package/themes/original/src/types/index.tsx +12 -4
- package/themes/original/src/utils/index.tsx +29 -0
- package/themes/uber-eats/src/components/BusinessesListing/index.tsx +1 -1
|
@@ -1,33 +1,53 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import { useLanguage, useOrder, useConfig } from 'ordering-components/native';
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useLanguage, useOrder, useConfig, useSession, useApi, ToastType, useToast } from 'ordering-components/native';
|
|
3
3
|
import { useTheme } from 'styled-components/native';
|
|
4
4
|
import { StyleSheet, View } from 'react-native';
|
|
5
5
|
import { OButton, OIcon, OText } from '../shared';
|
|
6
6
|
import { LanguageSelector } from '../LanguageSelector';
|
|
7
7
|
import { TouchableOpacity } from 'react-native-gesture-handler';
|
|
8
8
|
import { useWindowDimensions, Platform } from 'react-native';
|
|
9
|
+
import uuid from 'react-native-uuid';
|
|
9
10
|
|
|
10
11
|
export const Home = (props: any) => {
|
|
11
12
|
const { onNavigationRedirect, businessSlug } = props;
|
|
12
13
|
const { width, height } = useWindowDimensions();
|
|
13
14
|
const [, t] = useLanguage();
|
|
14
|
-
const [orderState] = useOrder();
|
|
15
|
+
const [orderState, { handleOrderStateLoading, setStateInitialValues }] = useOrder();
|
|
15
16
|
const [{ configs }] = useConfig()
|
|
17
|
+
const [, { login }] = useSession()
|
|
18
|
+
const [ordering] = useApi()
|
|
19
|
+
const [, { showToast }] = useToast()
|
|
16
20
|
|
|
17
21
|
const theme = useTheme();
|
|
18
|
-
const unaddressedTypes = configs?.unaddressed_order_types_allowed?.value.split('|').map((value: any) => Number(value)) || []
|
|
19
|
-
const isAllowUnaddressOrderType = unaddressedTypes.includes(orderState?.options?.type)
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
const handleCreateGuestUser = async (values: any) => {
|
|
24
|
+
try {
|
|
25
|
+
await handleOrderStateLoading(true)
|
|
26
|
+
const { content: { error, result } } = await ordering.users().save(values)
|
|
27
|
+
if (!error) {
|
|
28
|
+
await login({
|
|
29
|
+
user: result,
|
|
30
|
+
token: result.session?.access_token
|
|
31
|
+
})
|
|
32
|
+
} else {
|
|
33
|
+
showToast(ToastType.Error, t('ERROR_CREATING_GUEST_USER', 'Error creating guest users'))
|
|
34
|
+
}
|
|
35
|
+
await handleOrderStateLoading(false)
|
|
36
|
+
} catch (err) {
|
|
37
|
+
await handleOrderStateLoading(false)
|
|
38
|
+
showToast(ToastType.Error, t('ERROR_CREATING_GUEST_USER', 'Error creating guest users'))
|
|
24
39
|
}
|
|
25
|
-
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const handleUpdateGuest = async () => {
|
|
43
|
+
const guestToken = uuid.v4()
|
|
44
|
+
if (guestToken) await handleCreateGuestUser({ guest_token: guestToken })
|
|
45
|
+
}
|
|
26
46
|
|
|
27
47
|
return (
|
|
28
48
|
<View style={styles.container}>
|
|
29
49
|
<View>
|
|
30
|
-
<View style={{
|
|
50
|
+
<View style={{paddingTop: (height <= 756 && Platform.OS !== 'ios') ? (height * 0.05) : 0 }}>
|
|
31
51
|
<LanguageSelector />
|
|
32
52
|
</View>
|
|
33
53
|
<OIcon
|
|
@@ -53,6 +73,7 @@ export const Home = (props: any) => {
|
|
|
53
73
|
isCircle={false}
|
|
54
74
|
onClick={() => onNavigationRedirect('Login')}
|
|
55
75
|
imgRightSrc={null}
|
|
76
|
+
isDisabled={orderState?.loading}
|
|
56
77
|
/>
|
|
57
78
|
<OButton
|
|
58
79
|
text={t('SIGNUP', 'Signup')}
|
|
@@ -62,15 +83,13 @@ export const Home = (props: any) => {
|
|
|
62
83
|
textStyle={{ color: 'black' }}
|
|
63
84
|
onClick={() => onNavigationRedirect('Signup')}
|
|
64
85
|
imgRightSrc={null}
|
|
86
|
+
isDisabled={orderState?.loading}
|
|
65
87
|
/>
|
|
66
88
|
<TouchableOpacity
|
|
89
|
+
disabled={orderState?.loading}
|
|
67
90
|
style={{ ...styles.textLink, marginTop: 12 }}
|
|
68
|
-
onPress={() =>
|
|
69
|
-
|
|
70
|
-
? onNavigationRedirect(!!businessSlug ? 'Business' : 'BusinessList', { isGuestUser: true })
|
|
71
|
-
: onNavigationRedirect('AddressForm', { isGuestUser: true })
|
|
72
|
-
}>
|
|
73
|
-
<OText weight="normal" size={18} color={theme.colors.white}>
|
|
91
|
+
onPress={() => handleUpdateGuest()}>
|
|
92
|
+
<OText weight="normal" size={18} color={orderState?.loading ? '#ccc' : theme.colors.white}>
|
|
74
93
|
{t('CONTINUE_AS_GUEST', 'Continue as guest')}
|
|
75
94
|
</OText>
|
|
76
95
|
</TouchableOpacity>
|
|
@@ -73,7 +73,8 @@ const LoginFormUI = (props: LoginParams) => {
|
|
|
73
73
|
generateOtpCode,
|
|
74
74
|
useLoginOtpEmail,
|
|
75
75
|
useLoginOtpCellphone,
|
|
76
|
-
isGuest
|
|
76
|
+
isGuest,
|
|
77
|
+
setCellphoneStartZero
|
|
77
78
|
} = props;
|
|
78
79
|
|
|
79
80
|
const [, { showToast }] = useToast();
|
|
@@ -106,9 +107,9 @@ const LoginFormUI = (props: LoginParams) => {
|
|
|
106
107
|
|
|
107
108
|
const [isCheckingCode, setCheckingCode] = useState(false)
|
|
108
109
|
|
|
109
|
-
const googleLoginEnabled = configs?.google_login_enabled?.value === '1'
|
|
110
|
-
const facebookLoginEnabled = configs?.facebook_login_enabled?.value === '1'
|
|
111
|
-
const appleLoginEnabled = Platform.OS === 'ios' && (configs?.apple_login_enabled?.value === '1'
|
|
110
|
+
const googleLoginEnabled = configs?.google_login_enabled?.value === '1'
|
|
111
|
+
const facebookLoginEnabled = configs?.facebook_login_enabled?.value === '1'
|
|
112
|
+
const appleLoginEnabled = Platform.OS === 'ios' && (configs?.apple_login_enabled?.value === '1')
|
|
112
113
|
|
|
113
114
|
const loginStyle = StyleSheet.create({
|
|
114
115
|
btnOutline: {
|
|
@@ -300,6 +301,11 @@ const LoginFormUI = (props: LoginParams) => {
|
|
|
300
301
|
setTabLayouts(_tabLayouts)
|
|
301
302
|
}
|
|
302
303
|
|
|
304
|
+
const handleChangePhoneNumber = (number: any, rawNumber: any) => {
|
|
305
|
+
setPhoneInputData(number)
|
|
306
|
+
setCellphoneStartZero && setCellphoneStartZero(rawNumber?.number && rawNumber?.countryCallingCode ? rawNumber?.number : null)
|
|
307
|
+
}
|
|
308
|
+
|
|
303
309
|
useEffect(() => {
|
|
304
310
|
if (configs && Object.keys(configs).length > 0 && enableReCaptcha) {
|
|
305
311
|
if (configs?.security_recaptcha_type?.value === 'v3' &&
|
|
@@ -586,7 +592,7 @@ const LoginFormUI = (props: LoginParams) => {
|
|
|
586
592
|
<View style={{ marginBottom: 28 }}>
|
|
587
593
|
<PhoneInputNumber
|
|
588
594
|
data={phoneInputData}
|
|
589
|
-
handleData={
|
|
595
|
+
handleData={handleChangePhoneNumber}
|
|
590
596
|
textInputProps={{
|
|
591
597
|
returnKeyType: 'next',
|
|
592
598
|
onSubmitEditing: () => passwordRef?.current?.focus?.(),
|
|
@@ -630,6 +636,7 @@ const LoginFormUI = (props: LoginParams) => {
|
|
|
630
636
|
/>
|
|
631
637
|
)
|
|
632
638
|
}
|
|
639
|
+
autoCapitalize='none'
|
|
633
640
|
value={value}
|
|
634
641
|
forwardRef={passwordRef}
|
|
635
642
|
onChange={(val: any) => onChange(val)}
|
|
@@ -200,7 +200,7 @@ export const OrderListing = (props: OrdersOptionParams) => {
|
|
|
200
200
|
const OrderListingProps = {
|
|
201
201
|
...props,
|
|
202
202
|
UIComponent: OrdersOptionUI,
|
|
203
|
-
orderStatus: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
|
|
203
|
+
orderStatus: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
|
|
204
204
|
useDefualtSessionManager: true,
|
|
205
205
|
paginationSettings: {
|
|
206
206
|
initialPage: 1,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useEffect, useState } from 'react'
|
|
2
2
|
import Clipboard from '@react-native-clipboard/clipboard';
|
|
3
|
-
import { Messages as MessagesController, useSession, useUtils, useLanguage, ToastType, useToast } from 'ordering-components/native'
|
|
3
|
+
import { Messages as MessagesController, useSession, useUtils, useLanguage, ToastType, useToast, useConfig } from 'ordering-components/native'
|
|
4
4
|
import { useTheme } from 'styled-components/native';
|
|
5
5
|
import { launchImageLibrary } from 'react-native-image-picker'
|
|
6
6
|
import { GiftedChat, Actions, ActionsProps, InputToolbar, Composer, Send, Bubble, MessageImage, InputToolbarProps, ComposerProps } from 'react-native-gifted-chat'
|
|
@@ -39,7 +39,10 @@ const ORDER_STATUS: any = {
|
|
|
39
39
|
20: 'ORDER_CUSTOMER_ALMOST_ARRIVED_BUSINESS',
|
|
40
40
|
21: 'ORDER_CUSTOMER_ARRIVED_BUSINESS',
|
|
41
41
|
22: 'ORDER_LOOKING_FOR_DRIVER',
|
|
42
|
-
23: 'ORDER_DRIVER_ON_WAY'
|
|
42
|
+
23: 'ORDER_DRIVER_ON_WAY',
|
|
43
|
+
24: 'ORDER_DRIVER_WAITING_FOR_ORDER',
|
|
44
|
+
25: 'ORDER_ACCEPTED_BY_DRIVER_COMPANY',
|
|
45
|
+
26: 'ORDER_DRIVER_ARRIVED_CUSTOMER'
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
const filterSpecialStatus = ['prepared_in', 'delivered_in', 'delivery_datetime']
|
|
@@ -52,7 +55,6 @@ const MessagesUI = (props: MessagesParams) => {
|
|
|
52
55
|
messages,
|
|
53
56
|
image,
|
|
54
57
|
message,
|
|
55
|
-
messagesToShow,
|
|
56
58
|
sendMessage,
|
|
57
59
|
setCanRead,
|
|
58
60
|
setMessage,
|
|
@@ -67,13 +69,14 @@ const MessagesUI = (props: MessagesParams) => {
|
|
|
67
69
|
} = props
|
|
68
70
|
|
|
69
71
|
const [{ user }] = useSession()
|
|
72
|
+
const [{ configs }] = useConfig()
|
|
70
73
|
const [{ parseDate }] = useUtils()
|
|
71
74
|
const [, t] = useLanguage()
|
|
72
75
|
const [, { showToast }] = useToast();
|
|
73
76
|
|
|
74
77
|
const [formattedMessages, setFormattedMessages] = useState<Array<any>>([])
|
|
75
78
|
const [isKeyboardShow, setIsKeyboardShow] = useState(false)
|
|
76
|
-
const previousStatus = [1, 2, 5, 6, 10, 11, 12, 16, 17]
|
|
79
|
+
const previousStatus = [1, 2, 5, 6, 10, 11, 12, 15, 16, 17]
|
|
77
80
|
const chatDisabled = previousStatus.includes(order?.status)
|
|
78
81
|
const { height } = useWindowDimensions();
|
|
79
82
|
const { top, bottom } = useSafeAreaInsets();
|
|
@@ -142,23 +145,24 @@ const MessagesUI = (props: MessagesParams) => {
|
|
|
142
145
|
}
|
|
143
146
|
|
|
144
147
|
useEffect(() => {
|
|
145
|
-
|
|
148
|
+
const newMessages: Array<any> = []
|
|
146
149
|
const _console = `${t('ORDER_PLACED_FOR', 'Order placed for')} ${parseDate(order?.created_at)} ${t('VIA', 'Via')} ${order?.app_id ? t(order?.app_id.toUpperCase(), order?.app_id) : t('OTHER', 'Other')}`
|
|
147
150
|
const firstMessage = {
|
|
148
151
|
_id: 0,
|
|
152
|
+
type: 0,
|
|
149
153
|
text: _console,
|
|
150
154
|
createdAt: parseDate(order?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
|
|
151
155
|
system: true
|
|
152
156
|
}
|
|
153
|
-
const newMessage: any = [];
|
|
154
157
|
messages.messages.map((message: any) => {
|
|
155
158
|
if (message.change?.attribute === 'driver_group_id') return
|
|
156
|
-
if (business && message.type !== 0 && (messagesToShow?.messages?.length || message?.can_see?.includes('2'))) {
|
|
157
|
-
|
|
159
|
+
if (business && message.type !== 0 && (props?.messagesToShow?.messages?.length || message?.can_see?.includes('2'))) {
|
|
160
|
+
newMessages.push({
|
|
158
161
|
_id: message?.id,
|
|
159
162
|
text: message.type === 1 ? messageConsole(message) : message.comment,
|
|
160
163
|
createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
|
|
161
164
|
image: message.source,
|
|
165
|
+
type: message.type,
|
|
162
166
|
system: message.type === 1,
|
|
163
167
|
user: {
|
|
164
168
|
_id: message.author && message.author.id,
|
|
@@ -168,12 +172,13 @@ const MessagesUI = (props: MessagesParams) => {
|
|
|
168
172
|
});
|
|
169
173
|
}
|
|
170
174
|
|
|
171
|
-
if (driver && message.type !== 0 && (messagesToShow?.messages?.length || message?.can_see?.includes('4'))) {
|
|
172
|
-
|
|
175
|
+
if (driver && message.type !== 0 && (props?.messagesToShow?.messages?.length || message?.can_see?.includes('4'))) {
|
|
176
|
+
newMessages.push({
|
|
173
177
|
_id: message?.id,
|
|
174
178
|
text: message.type === 1 ? messageConsole(message) : message.comment,
|
|
175
179
|
createdAt: message.type !== 0 && parseDate(message?.created_at, { outputFormat: 'YYYY-MM-DD HH:mm:ss' }),
|
|
176
180
|
image: message.source,
|
|
181
|
+
type: message.type,
|
|
177
182
|
system: message.type === 1,
|
|
178
183
|
user: {
|
|
179
184
|
_id: message.author && message.author.id,
|
|
@@ -184,10 +189,12 @@ const MessagesUI = (props: MessagesParams) => {
|
|
|
184
189
|
}
|
|
185
190
|
|
|
186
191
|
if (message.type === 0) {
|
|
187
|
-
|
|
192
|
+
newMessages.push(firstMessage);
|
|
188
193
|
}
|
|
189
194
|
})
|
|
190
|
-
|
|
195
|
+
let _arrayMessages = [...newMessages.reverse()]
|
|
196
|
+
|
|
197
|
+
setFormattedMessages(_arrayMessages);
|
|
191
198
|
}, [messages.messages.length, business, driver])
|
|
192
199
|
|
|
193
200
|
useEffect(() => {
|
|
@@ -461,7 +468,7 @@ const MessagesUI = (props: MessagesParams) => {
|
|
|
461
468
|
active={business}
|
|
462
469
|
>
|
|
463
470
|
<OIcon
|
|
464
|
-
url={order?.business?.logo
|
|
471
|
+
url={order?.business?.logo}
|
|
465
472
|
width={32}
|
|
466
473
|
height={32}
|
|
467
474
|
style={{ borderRadius: 32 }}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Pressable } from 'react-native'
|
|
3
|
+
import {
|
|
4
|
+
TimeItem,
|
|
5
|
+
} from './styles'
|
|
6
|
+
import { OIcon, OText } from '../shared'
|
|
7
|
+
import { useTheme } from 'styled-components/native'
|
|
8
|
+
|
|
9
|
+
const timeListItemPropsAreEqual = (prevProps: any, nextProps: any) => {
|
|
10
|
+
return JSON.stringify(prevProps.time) === JSON.stringify(nextProps.time) &&
|
|
11
|
+
JSON.stringify(prevProps.selectedTime) === JSON.stringify(nextProps.selectedTime) &&
|
|
12
|
+
JSON.stringify(prevProps.cateringPreorder) === JSON.stringify(nextProps.cateringPreorder)
|
|
13
|
+
}
|
|
14
|
+
export const TimeListItem = React.memo((props : any) => {
|
|
15
|
+
const {
|
|
16
|
+
time,
|
|
17
|
+
selectedTime,
|
|
18
|
+
handleChangeTimeSelected,
|
|
19
|
+
cateringPreorder
|
|
20
|
+
} = props
|
|
21
|
+
const theme = useTheme()
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<Pressable onPress={() => handleChangeTimeSelected(time.value)}>
|
|
25
|
+
<TimeItem
|
|
26
|
+
active={selectedTime === time.value}
|
|
27
|
+
cateringPreorder={cateringPreorder}
|
|
28
|
+
>
|
|
29
|
+
{cateringPreorder && (
|
|
30
|
+
<>
|
|
31
|
+
{selectedTime === time.value ? (
|
|
32
|
+
<OIcon
|
|
33
|
+
src={theme.images.general.option_checked}
|
|
34
|
+
width={18}
|
|
35
|
+
style={{ marginEnd: 24, bottom: 2 }}
|
|
36
|
+
/>
|
|
37
|
+
) : (
|
|
38
|
+
<OIcon
|
|
39
|
+
src={theme.images.general.option_normal}
|
|
40
|
+
width={18}
|
|
41
|
+
style={{ marginEnd: 24, bottom: 2 }}
|
|
42
|
+
/>
|
|
43
|
+
)}
|
|
44
|
+
</>
|
|
45
|
+
)}
|
|
46
|
+
<OText
|
|
47
|
+
size={cateringPreorder ? 18 : 16}
|
|
48
|
+
color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
|
|
49
|
+
style={{
|
|
50
|
+
lineHeight: 24
|
|
51
|
+
}}
|
|
52
|
+
>{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
|
|
53
|
+
</TimeItem>
|
|
54
|
+
</Pressable>
|
|
55
|
+
)
|
|
56
|
+
}, timeListItemPropsAreEqual)
|
|
@@ -29,7 +29,8 @@ import {
|
|
|
29
29
|
TimeItem
|
|
30
30
|
} from './styles';
|
|
31
31
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
32
|
-
import {
|
|
32
|
+
import { monthsEnum, setLocalMoment } from '../../utils';
|
|
33
|
+
import { TimeListItem } from './TimeListItem';
|
|
33
34
|
|
|
34
35
|
const MomentOptionUI = (props: MomentOptionParams) => {
|
|
35
36
|
const {
|
|
@@ -161,6 +162,8 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
161
162
|
const [datesWhitelist, setDateWhitelist] = useState<any>([{ start: null, end: null }])
|
|
162
163
|
const [selectDate, setSelectedDate] = useState<any>(dateSelected)
|
|
163
164
|
const [timeList, setTimeList] = useState<any>(hoursList)
|
|
165
|
+
const [nextTime, setNextTime] = useState(null)
|
|
166
|
+
|
|
164
167
|
const goToBack = () => navigation?.canGoBack() && navigation.goBack();
|
|
165
168
|
|
|
166
169
|
const _handleAsap = () => {
|
|
@@ -256,7 +259,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
256
259
|
setDateWhitelist([{ start: _minDate, end: _maxDate }])
|
|
257
260
|
}
|
|
258
261
|
}
|
|
259
|
-
}, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays
|
|
262
|
+
}, [JSON.stringify(datesList), preorderMinimumDays, preorderMaximumDays])
|
|
260
263
|
|
|
261
264
|
useEffect(() => {
|
|
262
265
|
if (dateSelected) {
|
|
@@ -278,13 +281,21 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
278
281
|
let _timeLists = []
|
|
279
282
|
const schedule = business && getActualSchedule()
|
|
280
283
|
if (!schedule && business) {
|
|
284
|
+
setTimeList([])
|
|
281
285
|
return
|
|
282
286
|
}
|
|
283
287
|
_timeLists = hoursList
|
|
284
|
-
.filter(hour =>
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
+
.filter(hour => {
|
|
289
|
+
return (Object.keys(business || {})?.length === 0 || schedule?.lapses?.some((lapse: any) => {
|
|
290
|
+
const openHour = lapse.open.hour < 10 ? `0${lapse.open.hour}` : lapse.open.hour
|
|
291
|
+
const openMinute = lapse.open.minute < 10 ? `0${lapse.open.minute}` : lapse.open.minute
|
|
292
|
+
const closeHour = lapse.close.hour < 10 ? `0${lapse.close.hour}` : lapse.close.hour
|
|
293
|
+
const closeMinute = lapse.close.minute < 10 ? `0${lapse.close.minute}` : lapse.close.minute
|
|
294
|
+
return moment(dateSelected + ` ${hour.startTime}`) >= moment(dateSelected + ` ${openHour}:${openMinute}`).add(preorderLeadTime, 'minutes') && moment(dateSelected + ` ${hour.endTime}`) <= moment(dateSelected + ` ${closeHour}:${closeMinute}`)
|
|
295
|
+
})) &&
|
|
296
|
+
(moment(dateSelected + ` ${hour.startTime}`) < moment(dateSelected + ` ${hour.endTime}`)) &&
|
|
297
|
+
(moment().add(preorderLeadTime, 'minutes') < moment(dateSelected + ` ${hour.startTime}`) || !cateringPreorder)
|
|
298
|
+
})
|
|
288
299
|
.map(hour => {
|
|
289
300
|
return {
|
|
290
301
|
value: hour.startTime,
|
|
@@ -321,7 +332,28 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
321
332
|
}
|
|
322
333
|
}))
|
|
323
334
|
}
|
|
324
|
-
}, [dateSelected,
|
|
335
|
+
}, [dateSelected, hoursList?.length, JSON.stringify(datesWhitelist), JSON.stringify(business)])
|
|
336
|
+
|
|
337
|
+
useEffect(() => {
|
|
338
|
+
setLocalMoment(moment, t)
|
|
339
|
+
}, [])
|
|
340
|
+
|
|
341
|
+
useEffect(() => {
|
|
342
|
+
if (preorderMinimumDays === 0 && preorderLeadTime === 0) return
|
|
343
|
+
const isToday = dateSelected === moment().format('YYYY-MM-DD')
|
|
344
|
+
if (isCart && isToday && !orderState?.loading && timeList?.length > 0) {
|
|
345
|
+
setNextTime(timeList?.[0] ?? null)
|
|
346
|
+
}
|
|
347
|
+
}, [timeList?.length])
|
|
348
|
+
|
|
349
|
+
useEffect(() => {
|
|
350
|
+
if (nextTime?.value && timeList?.length > 0 && isCart && !orderState?.loading && !(preorderMinimumDays === 0 && preorderLeadTime === 0)) {
|
|
351
|
+
const notime = timeList?.filter((_: any, i: number) => i !== 0)?.find?.((time: any) => time?.value === timeSelected)
|
|
352
|
+
if (!notime) {
|
|
353
|
+
handleChangeTime(nextTime?.value)
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}, [nextTime?.value])
|
|
325
357
|
|
|
326
358
|
return (
|
|
327
359
|
<>
|
|
@@ -345,7 +377,7 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
345
377
|
titleWrapStyle={{ paddingHorizontal: 0 }}
|
|
346
378
|
/>
|
|
347
379
|
)}
|
|
348
|
-
{(preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder && (
|
|
380
|
+
{((preorderMinimumDays === 0 && preorderLeadTime === 0) || !cateringPreorder) && (
|
|
349
381
|
<WrapSelectOption
|
|
350
382
|
onPress={() => _handleAsap()}
|
|
351
383
|
disabled={orderState.loading} style={{ alignItems: 'flex-start' }}>
|
|
@@ -394,28 +426,27 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
394
426
|
<View style={{ flex: 1 }}>
|
|
395
427
|
{selectDate && datesWhitelist[0]?.start !== null && (
|
|
396
428
|
<CalendarStrip
|
|
397
|
-
locale={locale}
|
|
398
429
|
scrollable
|
|
399
430
|
style={styles.calendar}
|
|
400
431
|
calendarHeaderContainerStyle={styles.calendarHeaderContainer}
|
|
401
432
|
calendarHeaderStyle={styles.calendarHeader}
|
|
402
|
-
dateNumberStyle={styles.dateNumber}
|
|
403
|
-
dateNameStyle={styles.dateName}
|
|
404
433
|
iconContainer={{ flex: 0.1 }}
|
|
405
|
-
highlightDateNameStyle={styles.highlightDateName}
|
|
406
|
-
highlightDateNumberStyle={styles.highlightDateNumber}
|
|
407
434
|
dayContainerStyle={{ height: '100%' }}
|
|
408
435
|
highlightDateContainerStyle={{ height: '100%' }}
|
|
409
436
|
calendarHeaderFormat='MMMM, YYYY'
|
|
410
437
|
iconStyle={{ borderWidth: 1 }}
|
|
411
438
|
selectedDate={dateSelected}
|
|
412
439
|
datesWhitelist={datesWhitelist}
|
|
440
|
+
highlightDateNumberStyle={styles.highlightDateNumber}
|
|
441
|
+
highlightDateNameStyle={styles.highlightDateName}
|
|
413
442
|
minDate={moment()}
|
|
414
443
|
maxDate={cateringPreorder ? moment().add(preorderMaximumDays, 'days') : undefined}
|
|
415
444
|
disabledDateNameStyle={styles.disabledDateName}
|
|
416
445
|
disabledDateNumberStyle={styles.disabledDateNumber}
|
|
417
446
|
disabledDateOpacity={0.6}
|
|
418
|
-
|
|
447
|
+
dateNumberStyle={styles.dateNumber}
|
|
448
|
+
dateNameStyle={styles.dateName}
|
|
449
|
+
onDateSelected={(date: any) => onSelectDate(date)}
|
|
419
450
|
leftSelector={<LeftSelector />}
|
|
420
451
|
rightSelector={<RightSelector />}
|
|
421
452
|
/>
|
|
@@ -423,44 +454,34 @@ const MomentOptionUI = (props: MomentOptionParams) => {
|
|
|
423
454
|
</View>
|
|
424
455
|
)}
|
|
425
456
|
<TimeListWrapper nestedScrollEnabled={true} cateringPreorder={cateringPreorder}>
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
<
|
|
430
|
-
|
|
457
|
+
{timeList?.length > 0 ? (
|
|
458
|
+
<TimeContentWrapper>
|
|
459
|
+
{timeList.map((time: any, i: number) => (
|
|
460
|
+
<TimeListItem
|
|
461
|
+
key={i}
|
|
462
|
+
time={time}
|
|
463
|
+
selectedTime={selectedTime}
|
|
464
|
+
handleChangeTimeSelected={handleChangeTimeSelected}
|
|
431
465
|
cateringPreorder={cateringPreorder}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
size={cateringPreorder ? 18 : 16}
|
|
452
|
-
color={selectedTime === time.value ? theme.colors.primary : theme.colors.textNormal}
|
|
453
|
-
style={{
|
|
454
|
-
lineHeight: 24
|
|
455
|
-
}}
|
|
456
|
-
>{time.text} {cateringPreorder && `- ${time.endText}`}</OText>
|
|
457
|
-
</TimeItem>
|
|
458
|
-
</Pressable>
|
|
459
|
-
))}
|
|
460
|
-
{timeList.length % 3 === 2 && (
|
|
461
|
-
<TimeItem style={{ backgroundColor: 'transparent' }} />
|
|
462
|
-
)}
|
|
463
|
-
</TimeContentWrapper>
|
|
466
|
+
/>
|
|
467
|
+
))}
|
|
468
|
+
{timeList.length % 3 === 2 && (
|
|
469
|
+
<TimeItem style={{ backgroundColor: 'transparent' }} />
|
|
470
|
+
)}
|
|
471
|
+
</TimeContentWrapper>
|
|
472
|
+
) : (
|
|
473
|
+
<OText
|
|
474
|
+
size={16}
|
|
475
|
+
style={{
|
|
476
|
+
fontWeight: '600',
|
|
477
|
+
lineHeight: 24,
|
|
478
|
+
marginBottom: 12,
|
|
479
|
+
textAlign: 'center'
|
|
480
|
+
}}
|
|
481
|
+
>
|
|
482
|
+
{t('ERROR_ADD_PRODUCT_BUSINESS_CLOSED', 'The business is closed at the moment')}
|
|
483
|
+
</OText>
|
|
484
|
+
)}
|
|
464
485
|
</TimeListWrapper>
|
|
465
486
|
</OrderTimeWrapper>
|
|
466
487
|
)}
|
|
@@ -5,7 +5,8 @@ import { useTheme } from 'styled-components/native'
|
|
|
5
5
|
import {
|
|
6
6
|
MomentOption as MomentOptionController,
|
|
7
7
|
useConfig,
|
|
8
|
-
useUtils
|
|
8
|
+
useUtils,
|
|
9
|
+
useLanguage
|
|
9
10
|
} from 'ordering-components/native'
|
|
10
11
|
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
11
12
|
import IconAntDesign from 'react-native-vector-icons/AntDesign'
|
|
@@ -26,6 +27,7 @@ const MomentSelectorUI = (props: any) => {
|
|
|
26
27
|
const { top } = useSafeAreaInsets()
|
|
27
28
|
const [{ configs }] = useConfig()
|
|
28
29
|
const [{ parseTime }] = useUtils()
|
|
30
|
+
const [, t] = useLanguage()
|
|
29
31
|
|
|
30
32
|
const [customizedDateList, setCustomizedDateList] = useState([])
|
|
31
33
|
const [customizedTimeList, setCustomizedTimeList] = useState([])
|
|
@@ -130,6 +132,7 @@ const MomentSelectorUI = (props: any) => {
|
|
|
130
132
|
<View style={styles.selectWrapper}>
|
|
131
133
|
<SelectDropdown
|
|
132
134
|
defaultValue={customizedTimeList?.find((item: any) => item.key === timeSelected)}
|
|
135
|
+
defaultButtonText={t('SELECT_A_TIME_OPTION', 'Select an option')}
|
|
133
136
|
data={customizedTimeList}
|
|
134
137
|
onSelect={(selectedItem, index) => {
|
|
135
138
|
handleChangeTime(selectedItem.key)
|
|
@@ -194,4 +197,4 @@ export const MomentSelector = (props: any) => {
|
|
|
194
197
|
maxDate: currentDate
|
|
195
198
|
}
|
|
196
199
|
return <MomentOptionController {...businessPreorderProps} />
|
|
197
|
-
}
|
|
200
|
+
}
|