1. Para colocar os produtos do usuário aqui, é simples, nós vamos dentro de userProfile, e ao invés de passar o Data para o nosso UserAds, passamos o “userInfo.products”

    <UserAds products={userInfo.products} seller={false} />
    
  2. Agora precisamos ir lá em UserAds ajustar o recebimento

    interface ProductProps {
      products: Product[];
      seller: boolean;
    }
    
    const UserAds = ({ products, seller }: ProductProps) => {
    
  3. Agora podemos modificar as coisas dentro do card

    const UserAds = ({ products, seller }: ProductProps) => {
      return (
        <Container>
          <TotalAds>
            Você tem {products.length.toString().padStart(2, "0")} anúncios
          </TotalAds>
          {products.length > 0 ? (
            products.map((product) => (
              <Card
                activeOpacity={0.85}
                onPress={() => {
                  Alert.alert("Você clicou no produto!");
                }}
                key={product._id}
              >
                <Image
                  source={{
                    uri: product?.images[0].url,
                  }}
                />
                <InfoContainer>
                  <PriceTitleContainer>
                    <Price>R$ {product.price}</Price>
                    <Title numberOfLines={2}>{product.name}</Title>
                  </PriceTitleContainer>
                  <InfoIconContainer>
                    <PublishedText>
                      Publicado em {getDate(product.createdAt)}
                    </PublishedText>
    
                    {!seller ? (
                      <IconButton
                        onPress={() => {
                          Alert.alert("Item para ser excluído");
                        }}
                        activeOpacity={0.85}
                      >
                        <Icon source={trashIcon} />
                      </IconButton>
                    ) : (
                      <IconButton
                        onPress={() => {
                          Alert.alert("Item para ser excluído");
                        }}
                        activeOpacity={0.85}
                      >
                        <Icon source={hearthIcon} />
                      </IconButton>
                    )}
                  </InfoIconContainer>
                </InfoContainer>
              </Card>
            ))
          ) : (
            <NoAds>Por enquanto você não criou anúncios</NoAds>
          )}
        </Container>
      );
    };
    
  4. Com isso feito, nós já temos certinho a questão de ver os nossos produtos. Podemos agora criar o serviço de atualizar esses produtos. O método será basicamente o mesmo do de add, tirando que as imagens, temos que mandar separado em outro método

    interface UpdateParams {
      _id: string;
      name: string;
      price: string;
      description: string;
      category: string;
      addressId: string;
      published: string;
    }
    
    {/* Outros códigos */}
    
    updateProduct: async (params: UpdateParams) => {
      const token = await SecureStore.getItemAsync("onebitshop-token");
    
      const { _id, name, description, price, category, addressId, published } = params;
    
      const data = {
        name,
        description,
        price,
        category,
        addressId,
        published
      };
    
      const res = await api.put(`/products/${_id}`, data, {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      });
    
      return res;
    },
    
  5. Nós vamos copiar a pasta de AddProduct e renomear tudo para UpdateProduct, pois será basicamente a mesma tela, porém nós vamos modificar coisas fundamentais

  6. Agora podemos ir para routes, e iremos criar a rota de UpdateProduct, para que não fique na mesma rota e faça com que a gente precise modificar todo o app

    UpdateProduct: {
      _id: string;
      name: string;
      price: string;
      images: Image[];
      description: string;
      category: string;
      addressId: string;
    };
    
    {/* Outros códigos */}
    
    <Stack.Screen name="UpdateProduct" component={UpdateProduct} />
    
  7. Dessa forma a gente vai ter como enviar as informações para o AddProduct, e caso a gente esteja navegando pela navbar, a gente pode mandar null

  8. Agora no onPress de card nós vamos colocar a nossa navegação

    <Card
      activeOpacity={0.85}
      onPress={() => {
        navigation.navigate("UpdateProduct", {
          _id: product._id,
          name: product.name,
          price: product.price,
          images: product.images,
          description: product.description,
          category: product.category,
          addressId: product.address._id,
        });
      }}
      key={product._id}
    >
    
  9. Agora, vamos receber as props nessa nova tela

    type Props = NativeStackScreenProps<PropsNavigationStack, "UpdateProduct">;
    
    const UpdateProduct = ({ route }: Props) => {
    
  10. E agora vamos dar um set nos fields de acordo com o que recebemos deles

    useEffect(() => {
      setFields({
        name: route.params.name,
        price: route.params.price,
        description: route.params.description,
        images: route.params.images,
        category: route.params.category,
        addressId: route.params.addressId,
      });
    
      const convertedImages = route.params.images.map((image: Image) => ({
        assetId: image.filename,
        uri: image.url,
        width: 200,
        height: 200,
      }));
    
      setImages(convertedImages);
      setCategorie(route.params.category);
    }, []);
    
    return (
    
  11. Agora, iremos fazer uma verificação no endereço para enviar ele

    const handleGetAddress = async () => {
      const res = await addressService.getAddress();
    
      const addressObj = res.data.find(
        (address: Address) => address._id === route.params.addressId
      );
    
      if (addressObj) {
        setAddressId(`${addressObj.street} Nº${addressObj.number}`);
      }
    
      const value = res.data.map((address: Address) => {
        return {
          key: address._id,
          value: `${address.street} Nº${address.number}`,
        };
      });
    
      setAddress(value);
    };
    
    <DropDownComponent
      data={Category}
      placeholder={categorie}
      setSelected={setCategorie}
      saveMethod="value"
    />
    
    <DropDownComponent
      data={address}
      placeholder={addressId}
      setSelected={setAddressId}
      saveMethod="key"
    />
    
  12. Agora com isso feito, nós podemos navegar para cá já com tudo alterado, então a gente já consegue ver todos os campos preenchidos. Vamos agora fazer a atualização no lugar de submiteProduct

  13. Agora nós iremos deixar apenas o parâmetro sem imagem, pois a imagem a gente vai colocar depois

    const handleSubmitProduct = async (post: string) => {
      if (
        Object.values(fields).some((value) => !value) ||
        !fields.images.length
      ) {
        Alert.alert("Um dos seus campos não está preenchido");
        return;
      }
    
      let params = {
    		_id: route.params._id,
        ...fields,
        published: post,
      };
    
      const { status } = await productService.updateProduct(params);
    
      if (status === 201) {
        Alert.alert("Seu produto foi atualizado com sucesso!");
        navigation.navigate("Home");
      }
    };
    
  14. E agora nós podemos modificar as informações base dos produtos sem mexer nas imagens ainda, inclusive deixando ela pública ou privada de acordo com o que a gente selecionar aqui

  15. Vamos agora começar criando o serviço de deletar o produto

    interface DeleteParams {
      _id: string;
    }
    
    {/* Outros códigos */}
    
    deleteProduct: async (params: any) => {
      const token = await SecureStore.getItemAsync("onebitshop-token");
    
      const { _id } = params;
    
      const res = await api.delete(`/products/${_id}`, {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      });
    
      return res;
    },
    
  16. E agora vamos criar um handle dentro de userAds para deletar

    const handleDeleteProduct = async (_id: string) => {
      const params = {
        _id,
      };
    
      const res = await productService.deleteProduct(params);
    
      if (res.status === 204) {
        Alert.alert("Produto deletado com sucesso");
        navigation.navigate("Home");
      }
    };
    
    {/* Outros códigos */}
    
    {!seller ? (
      <IconButton
        onPress={() => {
          Alert.alert(
            "Você tem certeza?",
            "Ao fazer isso você deleterá o produto permanentemente.",
            [
              {
                text: "Sim",
                onPress: () => {
                  handleDeleteProduct(product._id);
                },
              },
              {
                text: "Não",
              },
            ]
          );
        }}
        activeOpacity={0.85}
      >
        <Icon source={trashIcon} />
      </IconButton>
    ) : (
      <IconButton
        onPress={() => {
          Alert.alert("Item para ser excluído");
        }}
        activeOpacity={0.85}
      >
        <Icon source={hearthIcon} />
      </IconButton>
    )}
    
  17. Com isso, a gente vai chamar a função enviando o id do produto para o serviço e vamos ser redirecionados para a home em seguida