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 ; };