Products

Show products

shopifyproductslist
import React from 'react';
import { Actionable, Flexbox, Button, Text, View, Swiper, Image } from '@evlop/native-components';
import { Money, ShopifyProduct, ShopifyImage } from '@evlop/shopify';

const ProductListItemBlock: NativeAppBlock = function ({data}) {
  const product: ShopifyProduct = data.product

  const [containerWidth, setContainerWidth] = React.useState(0);

  if (!product || product.isLoading) return <View style={{aspectRatio: 1}} width="100%" bg="gray-100" />;

  const images: ShopifyImage[] = product.images!

  const renderImage = ({ item }: { item: ShopifyImage }) => {

    return (
      <View key={item.id} style={{ width: containerWidth }}>
        <Image
          src={item}
          aspectRatio={1}
          borderTopRightRadius={10}
          borderTopLeftRadius={10}
          resizeMode="cover"
        />
      </View>
    );
  };

  return (
    <Flexbox flexDirection="column" gap={10}>
      <Flexbox
        flexDirection="column"
        style={{ width: '100%' }}
        onLayout={(e) => {
          const w = e.nativeEvent.layout.width;
          if (w && w !== containerWidth) setContainerWidth(w);
        }}
      >
        {images.length > 0 && containerWidth > 0 ? (
          <Swiper
            data={images}
            renderItem={renderImage}
            itemWidth={containerWidth}
            autoplay={false}
            paginationType="dash"
          />
        ) : null}

        <Button
          borderRadius={0}
          borderBottomRightRadius={10}
          borderBottomLeftRadius={10}
          py={8}
          variant="filled"
          color="black"
          icon="entypo:plus"
          label="Add to cart"
          size="sm"
          action={product?.actions?.addToCart}
        >
          Add to cart
        </Button>
      </Flexbox>
      <Actionable action={(product.actions && product.actions.openDetailsPage) || null}>
        <Flexbox flexDirection="column" gap={4}>
          <Text fontWeight="Bold" color="primary">
            <Money fontSize="2xl" color="primary" fontWeight="Bold" price={product?.priceRange?.minVariantPrice} />
          </Text>

          <Text fontWeight="bold" numberOfLines={1}>
            {product.vendor}
          </Text>

          <Text numberOfLines={2} fontSize="sm">
            {product.title}
          </Text>
        </Flexbox>
      </Actionable>
    </Flexbox>
  );
}

export default ProductListItemBlock;
Loading...