2
respostas

Furnção Transform do Yup não funciona

Prezados, tentei implementar a função transform de acordo com o exemplo da aula, recebo o feedback do telefone inserido no input, mas a função transforma, que chama o formatarTelefone, não funciona. Dexei o código identico ao do exemplo, só retirei o matches.


import CustomButton from "@/Components/Button";
import Section from "@/Components/Section";
import Wrapper from "@/Components/Templates/Wrapper";
import { Fieldset, Label } from "@headlessui/react";
import { Field, Form, Formik, useFormik, useFormikContext } from "formik";
import * as Yup from 'yup';
import clsx from "clsx";

const formatarTelefone = (valor) => {
    if (!valor) return

    const telefone = valor.replace(/\D/g, "")

    return `(${telefone.slice(0, 2)}) ${telefone.slice(2, 7)}-${telefone.slice(7)}`
}

const schema = Yup.object().shape({
    telefone: Yup.string().required('Campo obrigatório').transform(formatarTelefone),
});


const TesteYup = () => {
    return (
        <Wrapper title='Teste' path='/teste' breadcumbText='Teste'>
            <Section title="Cadastrar Teste">
                <Fieldset
                    className={`w-full shadow py-6 p-6 gap-4 bg-principal-container text-texto`}>
                    <Formik
                        initialValues={{
                            telefone: "",


                        }}
                        validationSchema={schema}
                        onSubmit={(values, e) => {

                            alert(JSON.stringify(values, null, 2));

                        }}>
                        <Form>
                            <div className="flex flex-row gap-6 pb-4 flex-wrap md:flex-nowrap">
                                <Fieldset className="flex flex-row flex-wrap grow items-center justify-start w-full pb-4">
                                    <Label className="w-full p-2">Telefone</Label>
                                    <Field
                                        name="telefone"
                                        id="telefone"
                                        type="input"
                                        placeholder="(99)99999-9999"
                                        className={clsx('bg-secondary-container rounded-lg py-1.5 pr-14 pl-3 text-left text-sm/6 text-texto border-none outline-none focus:outline focus:outline-0', 'bg-principal-100', 'shadow')} />
                                </Fieldset>
                            </div>
                            <div className="align-middle justify-center flex pt-6">
                                <CustomButton type="submit" >Cadastrar</CustomButton>
                            </div>

                        </Form>
                    </Formik>
                </Fieldset>
            </Section>
        </Wrapper>
    )
}

export default TesteYup;
2 respostas

Olá Ighor!

Parece que você está tentando usar a função transform do Yup para formatar o número de telefone, mas está enfrentando dificuldades. Vamos tentar resolver isso juntos!

Pelo que você descreveu, a função transform não está funcionando como esperado. Isso pode estar acontecendo por algumas razões. Vou sugerir algumas verificações e ajustes que podem ajudar:

  1. Verifique o uso do transform: Certifique-se de que a função transform está sendo chamada corretamente. No seu caso, você está usando transform(formatarTelefone), o que parece correto. No entanto, é importante garantir que a função formatarTelefone está retornando o valor formatado corretamente.

  2. Formato de entrada: A função formatarTelefone está removendo todos os caracteres não numéricos e formatando o número. Certifique-se de que o valor que está sendo passado para essa função é uma string e contém apenas números, sem espaços ou outros caracteres.

  3. Validação do Yup: Se você retirou o matches, certifique-se de que o campo ainda está recebendo um valor válido. O matches ajuda a garantir que o valor tenha o formato esperado antes de ser transformado. Talvez seja interessante reintroduzir uma validação que garanta que o valor tenha o número correto de dígitos.

  4. Debugging: Adicione alguns console.log dentro da função formatarTelefone para verificar se ela está sendo chamada e qual é o valor de entrada e saída. Isso pode ajudar a identificar se o problema está na função ou na forma como ela está sendo usada.

Aqui está um exemplo de como você pode adicionar um console.log na função:

const formatarTelefone = (valor) => {
    if (!valor) return;
    
    console.log("Valor recebido:", valor); // Verifica o valor recebido pela função

    const telefone = valor.replace(/\D/g, "");
    const telefoneFormatado = `(${telefone.slice(0, 2)}) ${telefone.slice(2, 7)}-${telefone.slice(7)}`;

    console.log("Telefone formatado:", telefoneFormatado); // Verifica o valor formatado

    return telefoneFormatado;
}

Com essas verificações, espero que você consiga identificar o que está impedindo a função transform de funcionar corretamente.

Espero ter ajudado e bons estudos!

Fiz o que vc disse e o valor é formatado, porém quando realizo o submit o valor continua o valor "recebido".

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

No alert dentro do onsubmit eu recebo o seguinte retorno

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

Realizei o teste com um post também e o resultado é o mesmo, o que fazer para enviar o telefone "formatado"?