1. Para criar esse campo vamos começar criando dentro de components uma pasta chamada “AddProduct” e dentro dela vamos criar uma pasta chamada “UploadImages” com os arquivos.

  2. Vamos começar criando o container do “input” que iremos ter de upload de imagem

    import styled from "styled-components/native";
    
    export const Container = styled.TouchableOpacity`
      width: 90%;
      height: 50px;
      margin: 10px auto;
      border: 1px dashed ${({ theme }) => theme.colors.borderColor};
      border-radius: 5px;
      padding: 0 15px;
      background-color: ${({ theme }) => theme.colors.background};
      flex-direction: row;
      align-items: center;
      justify-content: space-between;
    `;
    
  3. Agora nós iremos criar a imagem e também o texto que ficará dentro do container que criamos

    export const Icon = styled.Image.attrs({
      resizeMode: "contain",
    })`
      width: 30px;
    `;
    
    export const Title = styled.Text`
      font-size: 18px;
      color: white;
      font-weight: bold;
    `;
    
  4. Podemos criar agora esse input, e já vamos poder usar ele lá no nosso form. Iremos criar com um fragmento envolta, para que a gente possa depois colocar as imagens upadas abaixo do input.

    import React from "react";
    import { UploadContainer, UploadIcon, UploadText } from "./styled";
    
    const uploadImage = require("../../../../assets/icons/arrow-right.png");
    
    const UploadInput = () => {
      return (
        <>
          <Container>
            <Title>Adicione até 6 fotos</Title>
            <Icon source={uploadImage} />
          </Container>
        </>
      );
    };
    
    export default UploadInput;
    
  5. Agora a gente pode colocar lá no form

    return (
      <Container contentContainerStyle={{ paddingBottom: 120 }}>
        <DefaultTitle title="CADASTRO DO ANÚNCIO" fontSize={18} />
    
        <InputContainer>
          <Input placeholder="Título" />
        </InputContainer>
    
        <InputContainer>
          <Input placeholder="Preço" keyboardType="numeric" />
        </InputContainer>
    
        <DescriptionContainer>
          <Input placeholder="Descrição" />
        </DescriptionContainer>
    
        <UploadInput />
    
        <DropDownComponent
          data={Categorie}
          placeholder="Selecione a categoria"
          setSelected={setCategorie}
        />
    
        <DropDownComponent
          data={Address}
          placeholder="Selecione o endereço"
          setSelected={setAddress}
        />
    
        <DefaultButton
          buttonText="CADASTRAR E PUBLICAR"
          buttonHandle={() => {}}
          buttonType="primary"
          marginVertical={20}
        />
    
        <Division>ou</Division>
    
        <DefaultButton
          buttonText="SALVAR COMO RASCUNHO"
          buttonHandle={() => {}}
          buttonType="secondary"
          marginVertical={20}
        />
      </Container>
    );
    
  6. Podemos ver que estamos com o input do jeito que queremos. Podemos agora configurar o seu funcionamento com uma função que iremos pegar as imagens.

    const handlePickImage = async () => {
      let result = await ImagePicker.launchImageLibraryAsync({
        mediaTypes: ImagePicker.MediaTypeOptions.Images,
        allowsMultipleSelection: true,
        selectionLimit: 6,
        aspect: [4, 3],
        quality: 1,
      });
    };
    
  7. Agora, iremos criar um state para salvar essas imagens e vamos em seguida exibir para o usuário, só que iremos criar esse state lá dentro da screen (AddProduct)

    import { ImagePickerAsset } from "expo-image-picker";
    
    const AddProduct = () => {
      const [categorie, setCategorie] = useState("");
      const [address, setAddress] = useState("");
      const [images, setImages] = useState<ImagePickerAsset[]>([]);
    
      return (
    
  8. E iremos passar para o nosso componente como props.

    <UploadImage images={images} setImages={setImages} />
    
  9. Agora basta receber esses parâmetros lá no componente.

    interface ImagesParams {
      images: ImagePicker.ImagePickerAsset[];
      setImages: React.Dispatch<SetStateAction<ImagePicker.ImagePickerAsset[]>>;
    }
    
    const UploadImage = ({ images, setImages }: ImagesParams) => {
    
  10. Agora a gente pode complementar o código setando as imagens no array, e depois exibiremos as imagens, porém não agora.

    const UploadImage = ({ images, setImages }: ImagesParams) => {
      const handlePickImage = async () => {
        let result = await ImagePicker.launchImageLibraryAsync({
          mediaTypes: ImagePicker.MediaTypeOptions.Images,
          allowsMultipleSelection: true,
          selectionLimit: 6,
          aspect: [4, 3],
          quality: 1,
        });
    
        if (result.assets) {
          setImages(result.assets);
        } else {
          Alert.alert("Você não selecionou nenhuma imagem");
        }
      };
    
  11. Então, se o resultado existir, a gente vai setar as imagens, e se não existir significa que o usuário saiu da área de seleção, então iremos dar um alert.

  12. E agora a gente só precisa colocar um onPress no “input”.

    return (
      <>
        <UploadContainer onPress={handlePickImage}>
          <UploadText>Adicione até 6 fotos</UploadText>
          <UploadIcon source={uploadImage} />
        </UploadContainer>
      </>
    );
    
  13. E agora está funcionando 100% o nosso input, junto com o set e também o alert, caso a gente saia sem selecionar nada.