import React, { useEffect, useState } from 'react';
import { Fade, Placeholder, PlaceholderLine } from 'rn-placeholder';
import Geolocation from '@react-native-community/geolocation'
import {
View,
StyleSheet,
ScrollView,
Platform,
TouchableOpacity,
} from 'react-native';
import {
BusinessList as BusinessesListingController,
useLanguage,
useSession,
useOrder,
useConfig,
useUtils,
} from 'ordering-components/native';
import { useTheme } from 'styled-components/native';
import {
Search,
OrderControlContainer,
AddressInput,
WrapMomentOption,
HeaderWrapper,
ListWrapper,
FeaturedWrapper,
TopHeader,
DropOptionButton,
WrapSearchBar,
FarAwayMessage
} from './styles';
import { SearchBar } from '../SearchBar';
import { OButton, OIcon, OText } from '../shared';
import { BusinessesListingParams } from '../../types';
import { NotFoundSource } from '../NotFoundSource';
import { BusinessTypeFilter } from '../BusinessTypeFilter';
import { BusinessController } from '../BusinessController';
import { OrderTypeSelector } from '../OrderTypeSelector';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { BusinessFeaturedController } from '../BusinessFeaturedController';
import { getTypesText } from '../../utils';
import NavBar from '../NavBar';
import { getDistance } from '../../utils'
import Ionicons from 'react-native-vector-icons/Ionicons'
const PIXELS_TO_SCROLL = 1000;
const BusinessesListingUI = (props: BusinessesListingParams) => {
const {
navigation,
businessesList,
searchValue,
getBusinesses,
handleChangeBusinessType,
handleBusinessClick,
paginationProps,
handleChangeSearch,
} = props;
const theme = useTheme();
const styles = StyleSheet.create({
container: {
marginBottom: 0,
},
welcome: {
flex: 1,
flexDirection: 'row',
},
inputStyle: {
backgroundColor: theme.colors.inputDisabled,
flex: 1,
},
wrapperOrderOptions: {
width: '100%',
flexDirection: 'row',
justifyContent: 'flex-start',
marginBottom: 10,
zIndex: 100,
},
borderStyle: {
borderColor: theme.colors.backgroundGray,
borderWidth: 1,
borderRadius: 10,
},
searchInput: {
fontSize: 12,
},
btnBackArrow: {
borderWidth: 0,
backgroundColor: theme.colors.clear,
shadowColor: theme.colors.clear,
paddingLeft: 40,
paddingRight: 40
},
headerStyle: {
height: 260,
paddingHorizontal: 40
},
iconStyle: {
fontSize: 18,
color: theme.colors.warning5,
marginRight: 8
},
});
const [, t] = useLanguage();
const [{ user, auth }] = useSession();
const [orderState] = useOrder();
const [{ configs }] = useConfig();
const [{ parseDate }] = useUtils();
const { top } = useSafeAreaInsets();
const [featuredBusiness, setFeaturedBusinesses] = useState(Array);
const [isFarAway, setIsFarAway] = useState(false)
const configTypes = configs?.order_types_allowed?.value.split('|').map((value: any) => Number(value)) || [];
const handleScroll = ({ nativeEvent }: any) => {
const y = nativeEvent.contentOffset.y;
const height = nativeEvent.contentSize.height;
const hasMore = !(
paginationProps.totalPages === paginationProps.currentPage
);
if (y + PIXELS_TO_SCROLL > height && !businessesList.loading && hasMore) {
getBusinesses();
}
};
useEffect(() => {
if (businessesList.businesses.length > 0) {
const fb = businessesList.businesses.filter((b) => b.featured == true);
const ary = [];
while (fb.length > 0) {
ary.push(fb.splice(0, 2));
}
setFeaturedBusinesses(ary);
}
}, [businessesList.businesses]);
useEffect(() => {
Geolocation.getCurrentPosition((pos) => {
const crd = pos.coords
const distance = getDistance(crd.latitude, crd.longitude, orderState?.options?.address?.location?.lat, orderState?.options?.address?.location?.lng)
if (distance > 20) setIsFarAway(true)
else setIsFarAway(false)
}, (err) => {
console.log(`ERROR(${err.code}): ${err.message}`)
}, {
enableHighAccuracy: true, timeout: 15000, maximumAge: 10000
})
}, [orderState?.options?.address?.location])
return (
handleScroll(e)}
showsVerticalScrollIndicator={false}
>
{!auth && (
navigation?.canGoBack() && navigation.goBack()}
/>
)}
auth
? navigation.navigate('AddressList', { isFromBusinesses: true })
: navigation.navigate('AddressForm', {
address: orderState.options?.address,
isFromBusinesses: true,
})
}
style={{ marginTop: !auth ? 36 : 20 }}
activeOpacity={0.8}
>
{orderState?.options?.address?.address}
{isFarAway && (
{t('YOU_ARE_FAR_FROM_ADDRESS', 'You are far from this address')}
)}
navigation.navigate('OrderTypes', { configTypes: configTypes })}
>
{t(getTypesText(orderState?.options?.type || 1), 'Delivery')}
navigation.navigate('MomentOption')}>
{orderState.options?.moment
? parseDate(orderState.options?.moment, {
outputFormat:
configs?.format_time?.value === '12'
? 'MM/DD hh:mma'
: 'MM/DD HH:mm',
})
: t('ASAP_ABBREVIATION', 'ASAP')}
{featuredBusiness && featuredBusiness.length > 0 && (
{t('FEATURED_BUSINESS', 'Featured business')}
{featuredBusiness.map((bAry: any, idx) => (
{bAry.length > 1 && (
)}
))}
)}
{!businessesList.loading && businessesList.businesses.length === 0 && (
)}
{businessesList.businesses?.map(
(business: any) =>
!business.featured && (
),
)}
{businessesList.loading && (
<>
{[
...Array(
paginationProps.nextPageItems
? paginationProps.nextPageItems
: 8,
).keys(),
].map((item, i) => (
))}
>
)}
);
};
export const BusinessesListing = (props: BusinessesListingParams) => {
const BusinessesListingProps = {
...props,
isForceSearch: Platform.OS === 'ios',
UIComponent: BusinessesListingUI,
};
return ;
};