import React, { useEffect, useMemo, useState, useCallback } from 'react' import { useLanguage, BusinessSearchList, useOrder, useUtils, useEvent, showToast, ToastType } from 'ordering-components/native' import { ScrollView, StyleSheet, Dimensions, FlatList } from 'react-native' import { useTheme } from 'styled-components/native' import { OButton, OText } from '../shared' import { SingleProductCard } from '../SingleProductCard' import { SingleBusinessSearch, BusinessInfo, BusinessInfoItem, Metadata, SingleBusinessContainer, BContainer, } from './styles' import FastImage from 'react-native-fast-image' import { convertHoursToMinutes } from '../../utils' import { BusinessSearchParams } from '../../types' import { BusinessSearchHeader } from './BusinessSearchHeader' import { BusinessSearchFooter } from './BusinessSearchFooter' const PIXELS_TO_SCROLL = 1000 export const BusinessListingSearchUI = (props: BusinessSearchParams) => { const { navigation, businessesSearchList, onBusinessClick, handleChangeTermValue, termValue, handleSearchbusinessAndProducts, handleChangeFilters, filters, businessTypes, setFilters, brandList, paginationProps, handleUpdateProducts } = props const screenWidth = Dimensions.get('window').width; const theme = useTheme() const [orderState] = useOrder() const [events] = useEvent() const [, t] = useLanguage() const [{ parsePrice, parseDistance, optimizeImage }] = useUtils(); const [openFilters, setOpenFilters] = useState(false) const styles = StyleSheet.create({ productsContainer: { marginTop: 20 } }); const handleOpenfilters = () => { setOpenFilters(true) } const handleCloseFilters = () => { clearFilters() setOpenFilters(false) } const clearFilters = () => { setFilters({ business_types: [], orderBy: 'default', franchise_ids: [], price_level: null }) } const handleChangeActiveBusinessType = (type: any) => { if (type?.id === null) { handleChangeFilters('business_types', []) return } if (filters?.business_types?.includes(type?.id)) { const arrayAux = filters?.business_types const index = arrayAux?.indexOf(type?.id) arrayAux.splice(index, 1) handleChangeFilters('business_types', arrayAux) } else { handleChangeFilters('business_types', [...filters?.business_types, type?.id]) } } const handleChangeBrandFilter = (brandId: number) => { let franchiseIds = [...filters?.franchise_ids] if (filters?.franchise_ids?.includes(brandId)) franchiseIds = filters?.franchise_ids?.filter((item: any) => item !== brandId) else franchiseIds.push(brandId) handleChangeFilters && handleChangeFilters('franchise_ids', franchiseIds) } const handleChangePriceRange = (value: string) => { if (value === filters?.price_level) handleChangeFilters('price_level', null) else handleChangeFilters('price_level', value) } const handleApplyFilters = () => { handleSearchbusinessAndProducts(true) setOpenFilters(false) } const isInteger = (val: any) => Number.isInteger(Number(val)) && !!val const onProductClick = (business: any, categoryId: any, productId: any, product: any) => { if (!isInteger(business?.id) || !isInteger(categoryId) || !isInteger(productId) || !business.slug || !business.header || !business.logo) { showToast(ToastType.error, t('NOT_AVAILABLE', 'Not Available')) return } const currentCart: any = Object.values(orderState.carts).find((cart: any) => cart?.business?.slug === business?.slug) ?? {} const productAddedToCartLength = currentCart?.products?.reduce((productsLength: number, Cproduct: any) => { return productsLength + (Cproduct?.id === productId ? Cproduct?.quantity : 0) }, 0) || 0 navigation.navigate('ProductDetails', { isRedirect: 'business', businessId: business?.id, categoryId: categoryId, productId: productId, product: product, business: { store: business.slug, header: business.header, logo: business.logo, }, productAddedToCartLength }) } const handleScroll = useCallback(({ nativeEvent }: any) => { const y = nativeEvent.contentOffset.y; const height = nativeEvent.contentSize.height; const hasMore = !( paginationProps.totalPages === paginationProps.currentPage ); if (height > 1000 && y + PIXELS_TO_SCROLL > height && !businessesSearchList.loading && hasMore && businessesSearchList?.businesses?.length > 0) { handleSearchbusinessAndProducts(); } }, [businessesSearchList.loading, businessesSearchList?.businesses?.length]); const onChangeTermValue = (query: any) => { handleChangeTermValue(query) if (query) { events.emit('products_searched', query) } } useEffect(() => { if (filters.business_types?.length === 0 && filters.orderBy === 'default' && Object.keys(filters)?.length === 2 && !openFilters) { handleSearchbusinessAndProducts(true) } }, [filters, openFilters]) useEffect(() => { handleSearchbusinessAndProducts(true) }, []) const businessFiltered = useMemo(() => { return businessesSearchList.businesses?.filter((business: any) => business?.categories?.length > 0) }, [businessesSearchList.businesses]) return ( <> } ListHeaderComponent={} onScroll={(e: any) => handleScroll(e)} showsVerticalScrollIndicator={false} keyExtractor={(business: any, index: number) => `card-${business?.id}-${index}`} renderItem={({ item: business }: any) => ( {(business?.logo || theme.images?.dummies?.businessLogo) && ( )} {business?.name} {orderState?.options?.type === 1 && ( <> {t('DELIVERY_FEE', 'Delivery fee')}{' '} {business && parsePrice(business?.delivery_price)} )} {convertHoursToMinutes(orderState?.options?.type === 1 ? business?.delivery_time : business?.pickup_time)} {parseDistance(business?.distance)} onBusinessClick(business)} textStyle={{ fontSize: 10 }} text={t('GO_TO_STORE', 'Go to store')} style={{ borderRadius: 23, paddingLeft: 10, paddingRight: 10, height: 23, shadowOpacity: 0, borderWidth: 0 }} /> {business?.categories?.map((category: any) => category?.products?.map((product: any, i: number) => ( onProductClick(business, category?.id, product?.id, product)} productAddedToCartLength={0} handleUpdateProducts={(productId: number, changes: any) => handleUpdateProducts(productId, category?.id, business?.id, changes)} style={{ width: screenWidth - (category?.products?.length > 1 ? 120 : 80), maxWidth: screenWidth - (category?.products?.length > 1 ? 120 : 80), marginRight: 20 }} /> )))} )} /> {/* handleScroll(e)} showsVerticalScrollIndicator={false} > */} ) } export const BusinessListingSearch = (props: BusinessSearchParams) => { const BusinessListSearchProps = { ...props, UIComponent: BusinessListingSearchUI, lazySearch: true } return }