1. Iremos agora criar o card do produto que vamos ter na home. Aqui nós vamos também criar algumas coisas temporárias para que a gente possa visualizar como ficará no final.

  2. Dentro de components vamos criar uma pasta chamada “ProductCard” dentro de “common”.

  3. Dentro de “ProductCard” vamos criar um “index.tsx” e um “styled.ts”

  4. Vamos começar montando o container onde vamos envolver tudo. (Dentro de “styled.ts”

    import styled from "styled-components/native";
    
    export const Container = styled.TouchableOpacity`
      width: 90%;
      margin: 10px auto;
      flex-direction: row;
    `;
    
  5. Com o container criado vamos criar a base da imagem e em seguida o container das informações, que fica ao lado das imagens

    import styled from "styled-components/native";
    
    export const Container = styled.TouchableOpacity`
      width: 90%;
      margin: 10px auto;
      flex-direction: row;
    `;
    
    export const ProductImage = styled.Image`
      width: 120px;
    	min-height: 140px;
      border-top-left-radius: 5px;
      border-bottom-left-radius: 5px;
    `;
    
    export const ProductInfoContainer = styled.View`
      flex: 1;
      border-top-right-radius: 5px;
      border-bottom-right-radius: 5px;
      border: 1px solid ${({ theme }) => theme.colors.borderColor};
      padding: 10px;
    	justify-content: space-between;
    `;
    
  6. Podemos já usar e ter algum retorno visual da imagem.

    import React from "react";
    import { Container, ProductImage, ProductInfoContainer } from "./styled";
    
    const ProductCard = () => {
      return (
        <Container>
          <ProductImage
            source={{
              uri: "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
            }}
          />
          <ProductInfoContainer></ProductInfoContainer>
        </Container>
      );
    };
    
    export default ProductCard;
    
  7. Agora precisamos visualizar o que criamos. Vamos importar isso em “Home”, e por enquanto teremos apenas 1 para visualizar.

    import React from "react";
    import { Container } from "./styled";
    
    import Header from "../../components/common/Header";
    import NavBar from "../../components/common/NavBar";
    import ProductCard from "../../components/home/ProductCard";
    
    const Home = () => {
      return (
        <Container>
          <Header />
          <ProductCard />
          <NavBar />
        </Container>
      );
    };
    
    export default Home;
    
  8. Podemos começar a criar os textos no styled.ts para poder preencher

    export const ProductPrice = styled.Text`
      font-size: 12px;
      color: ${({ theme }) => theme.colors.secondaryText};
      margin-bottom: 10px;
    `;
    
    export const ProductTitle = styled.Text`
      font-size: 14px;
      color: ${({ theme }) => theme.colors.primaryText};
      font-weight: bold;
    `;
    
  9. Vamos usar eles e ter algum retorno visual de agora sobre esses textos

    import React from "react";
    import {
      Container,
      ProductImage,
      ProductInfoContainer,
      ProductPrice,
      ProductTitle,
    } from "./styled";
    
    const ProductCard = () => {
      return (
        <Container>
          <ProductImage
            source={{
              uri: "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
            }}
          />
          <ProductInfoContainer>
            <ProductPrice>R$ 2.600</ProductPrice>
            <ProductTitle numberOfLines={2}>Playstation 4 seminovo</ProductTitle>
          </ProductInfoContainer>
        </Container>
      );
    };
    
    export default ProductCard;
    
  10. Vamos colocar informações agora do usuário com mais algumas coisas, como o botão do like e tempo do produto.

    export const InfoLikeContainer = styled.View`
      flex-direction: row;
      justify-content: space-between;
    `;
    
    export const SellerInfoContainer = styled.View``;
    
    export const PublishedText = styled.Text`
      font-size: 10px;
      color: ${({ theme }) => theme.colors.secondaryText};
    `;
    
    export const SellerName = styled.Text`
      font-size: 14px;
      font-weight: bold;
      color: ${({ theme }) => theme.colors.primaryText};
    `;
    
    export const LikeButton = styled.TouchableOpacity``;
    
    export const LikeImage = styled.Image.attrs({
      resizeMode: "contain",
    })`
      width: 30px;
    `;
    
  11. Agora vamos usar e completar o que precisamos com as informações adicionais.

    import React from "react";
    import { Alert } from "react-native";
    import {
      Container,
      InfoLikeContainer,
      LikeButton,
      LikeImage,
      ProductImage,
      ProductInfoContainer,
      ProductPrice,
      ProductTitle,
      PublishedText,
      SellerInfoContainer,
      SellerName,
    } from "./styled";
    
    const likeImage = require("../../../../assets/icons/like.png");
    
    const ProductCard = () => {
      return (
        <Container>
          <ProductImage
            source={{
              uri: "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
            }}
          />
          <ProductInfoContainer>
            <ProductPrice>R$ 2.600</ProductPrice>
            <ProductTitle numberOfLines={2}>Playstation 4 seminovo</ProductTitle>
            <InfoLikeContainer>
              <SellerInfoContainer>
                <PublishedText>Publicado em 20/08/22 por:</PublishedText>
                <SellerName>Lucas Queiroga</SellerName>
              </SellerInfoContainer>
              <LikeButton
                onPress={() => {
                  Alert.alert("Liked");
                }}
                activeOpacity={0.85}
              >
                <LikeImage source={likeImage} />
              </LikeButton>
            </InfoLikeContainer>
          </ProductInfoContainer>
        </Container>
      );
    };
    
    export default ProductCard;
    
  12. Agora que temos tudo pronto, podemos usar o flatlist para renderizar as informações de forma dinâmica. Nós iremos usar um data dentro do arquivo, para facilitar.

    const DATA = [
      {
        _id: "1",
        productImage:
          "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
        price: "2600",
        name: "Playstation 4 Pro, seminovo",
        publishedData: "14/02/23",
        SellerName: "Lucas Queiroga",
        liked: false,
      },
      {
        _id: "2",
        productImage:
          "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
        price: "3600",
        name: "Playstation 4 Pro, seminovo",
        publishedData: "14/02/23",
        SellerName: "Lucas Queiroga",
        liked: true,
      },
      {
        _id: "3",
        productImage:
          "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
        price: "3600",
        name: "Playstation 4 Pro, seminovo",
        publishedData: "14/02/23",
        SellerName: "Lucas Queiroga",
        liked: false,
      },
      {
        _id: "4",
        productImage:
          "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
        price: "3600",
        name: "Playstation 4 Pro, seminovo",
        publishedData: "14/02/23",
        SellerName: "Lucas Queiroga",
        liked: true,
      },
      {
        _id: "5",
        productImage:
          "<https://http2.mlstatic.com/D_NQ_NP_715237-MLA45308505060_032021-O.jpg>",
        price: "3600",
        name: "Playstation 4 Pro, seminovo",
        publishedData: "14/02/23",
        SellerName: "Lucas Queiroga",
        liked: false,
      },
    ];
    
  13. Vamos criar o Item o renderItem, que serão usados no flatlist. Como estamos usando o typescript, não iremos usar o flatlist dentro do styled, pois ele da erro de tipagem que no momento da gravação da aula não teve atualização para resolver.

    import React from "react";
    import { useNavigation } from "@react-navigation/native";
    import { Alert, FlatList, ListRenderItem } from "react-native";
    import { PropsStack } from "../../../routes";
    import {
      Container,
      InfoLikeContainer,
      LikeButton,
      LikeImage,
      ProductImage,
      ProductInfoContainer,
      ProductPrice,
      ProductTitle,
      PublishedText,
      SellerInfoContainer,
      SellerName,
    } from "./styled";
    
    const likeImage = require("../../../../assets/icons/like.png");
    const likedImage = require("../../../../assets/icons/liked.png");
    
    export interface ProductType {
      _id: string;
      productImage: string;
      price: string;
      name: string;
      publishedData: string;
      SellerName: string;
      liked: boolean;
    }
    
    const Data = [
    ];
    
    const ProductCard = () => {
      const navigation = useNavigation<PropsStack>();
    
      const handleNavProduct = () => {
        navigation.navigate("Home");
      };
    
      const Item = ({ data }: { data: ItemProps }) => (
        <Container
          activeOpacity={0.85}
          onPress={() => {
            handleNavProduct();
          }}
        >
          <ProductImage source={{ uri: data.productImage }} />
          <ProductInfoContainer>
            <ProductPrice>R$ {data.price}</ProductPrice>
            <ProductTitle numberOfLines={2}>{data.name}</ProductTitle>
            <InfoLikeContainer>
              <SellerInfoContainer>
                <PublishedText>
                  Publicado em {data.publishedData} por:
                </PublishedText>
                <SellerName>{data.SellerName}</SellerName>
              </SellerInfoContainer>
              <LikeButton
                onPress={() => {
                  Alert.alert("Liked");
                }}
                activeOpacity={0.85}
              >
                {!data.liked ? (
                  <LikeImage source={likeImage} />
                ) : (
                  <LikeImage source={likedImage} />
                )}
              </LikeButton>
            </InfoLikeContainer>
          </ProductInfoContainer>
        </Container>
      );
    
      const renderItem: ListRenderItem<ItemProps> = ({ item }) => (
        <Item data={item} />
      );
    
      return <FlatList />;
    };
    
    export default ProductCard;
    
  14. Vamos colocar então as informações que temos no flatList.

    return (
      <FlatList
        data={Data}
        keyExtractor={(item: ItemProps) => item.id}
        renderItem={renderItem}
        showsVerticalScrollIndicator={false}
        contentContainerStyle={{ paddingBottom: 80 }}
      />
    );
    
  15. Com isso que temos agora, nós conseguimos visualizar a nossa lista na home, com as informações que colocamos nos dados. Depois quando puxarmos a real, vamos modificar algumas coisas, porém por enquanto podemos deixar dessa forma.