1. Nós vamos criar o serviço de categoria nessa aula, iremos começar criando o arquivo categoryService.ts

  2. Ao criar, podemos criar a estrutura, já importando o api também

    import api from "./api";
    
    const categoriesService = {
    };
    
    export default categoriesService;
    
  3. E agora que está criada a base, podemos criar ela de fato

    import api from "./api";
    
    const categoriesService = {
      getCategories: async () => {
        const res = await api.get("/categories");
    
        return res;
      },
    };
    
    export default categoriesService;
    
  4. Vamos então na tela de allCategories criar um state chamado de categories que começará como um array vazio, e também o loading, que começa como true.

    const AllCategories = () => {
      const [loading, setLoading] = useState(true);
      const [categories, setCategories] = useState([]);
    
  5. Depois, nós vamos criar e chamar a função

    const AllCategories = () => {
      const [loading, setLoading] = useState(true);
      const [categories, setCategories] = useState([]);
    
      const handleGetCategories = async () => {
        const res = await categoriesService.getCategories();
        setCategories(res.data);
    
        setLoading(false);
      };
    
      useEffect(() => {
        handleGetCategories();
      }, []);
    
  6. Agora nós podemos colocar o loader aqui na tela

    return (
      <>
        {!loading ? (
          <>
            <Container contentContainerStyle={{ paddingBottom: 100 }}>
              <DefaultTitle title="TODAS AS CATEGORIAS" fontSize={20} />
    
              {Data.map(({ categorie }: Categorie) => (
                <CategorieList key={categorie._id} categorie={categorie} />
              ))}
            </Container>
            <NavBar />
          </>
        ) : (
          <Loader />
        )}
      </>
    );
    
  7. Nós podemos trocar o Data pelo categories, e vamos ajeitar aqui nossas tipagens, começando pela tipagem de Categorie, vamos remover o “categorie” e colocar o product de verdade

    export interface Category {
      _id: string;
      products: Product[];
    }
    
    {categories.map((category: Categorie) => (
    	<CategorieList key={category._id} category={category} />
    ))}
    
  8. Agora, nós vamos lá para a pasta de AllCategories e vamos entrar na lista, e dentro dela, vamos começar alterando o tipo de category e de product

    interface CategoryProps {
      category: Category;
    }
    
    const CategorieList = ({ category }: CategoryProps) => {
      const navigation = useNavigation<PropsStack>();
    
      const renderItem: ListRenderItem<Product> = ({ item }) => (
    
  9. Agora, precisamos alterar por dentro tudo que estamos usando

    const CategorieList = ({ category }: CategoryProps) => {
      const navigation = useNavigation<PropsStack>();
    
      const renderItem: ListRenderItem<Product> = ({ item }) => (
        <CategorieCard product={item} key={item._id} />
      );
    
      return (
        <Container>
          <TitleContainer>
            <Title>{category._id}</Title>
            <SeeMore
              onPress={() => {
                navigation.navigate("Category", {
                  _id: category._id,
                  products: category.products,
                });
              }}
            >
              Ver mais
            </SeeMore>
          </TitleContainer>
    
          <FlatList
            data={category.products}
            renderItem={renderItem}
            horizontal
            showsHorizontalScrollIndicator={false}
          />
        </Container>
      );
    };
    
  10. Ao fazer isso, nós colocamos as categorias já funcionando, precisamos entrar agora no card para deixar funcionando certinho também

    interface ProductProps {
      product: Product;
    }
    
    return (
      <Container>
        <Image source={{ uri: product.images[0].url }} />
        <TextContainer>
          <Title>{product.name}</Title>
    
  11. Agora já está tudo certo com todas as nossas categorias, vamos só precisar navegar, por algum motivo, aqui no meu a rota de Category sumiu durante o processo, então vamos lá e vamos adicionar ela

  12. A primeira coisa que faremos será organizar aqui a tipagem do categoryList, que é a forma que vamos exibir os conteúdos únicos para o usuário

    interface CategoryProps {
      products: Product[];
    }
    
  13. Agora, iremos entrar em CategoryCard para poder mudar e deixar tudo de acordo com a nova tipagem

    interface ProductProps {
      product: Product;
    }
    
    const likeImage = require("../../../../../assets/icons/like.png");
    
    const CategoryCard = ({ product }: ProductProps) => {
      return (
        <Container activeOpacity={0.85} onPress={() => {}}>
          <Image source={{ uri: product.images[0].url }} />
          <InfoContainer>
            <Price>R$ {product.price}</Price>
            <Title numberOfLines={2}>{product.name}</Title>
    
  14. Vamos agora para CategoryCard dentro de CategoryList para fazer a navegação

    const CategoryCard = ({ product }: ProductProps) => {
      const navigation = useNavigation<PropsStack>();
    
      return (
        <Container
          onPress={() => {
            navigation.navigate("Product", {
              ...product,
            });
          }}
        >
    
  15. Vamos fazer a mesma coisa com o category individual

    const CategoryCard = ({ product }: ProductProps) => {
      const navigation = useNavigation<PropsStack>();
    
      return (
        <Container
          activeOpacity={0.85}
          onPress={() => {
            navigation.navigate("Product", {
              ...product,
            });
          }}
        >