Published on

Formulario de contacto sin backend

Authors

Ocuparemos la API de https://formsubmit.co/ para crear un formulario de contacto sin backend directo a tu email.

El primer paso es revisar https://formsubmit.co/ y obtener una cuenta @altmails.com en https://altmails.com/.

const onSubmit = (data) => {
const $form = document.querySelector('.contact-form'),
$loader = document.querySelector('.contact-form-loader'),
$response = document.querySelector('.contact-form-response')
$loader.classList.remove('none')
fetch('https://formsubmit.co/ajax/me.pablosolana@altmails.com', {
method: 'POST',
body: new FormData($form),
})

En el formulario se tienen unas clases de control '.contact-form' el contenido lo meto a la variable $form y luego hago un fetch a formsubmit del tipo POST con el contenido del formulario.

.then((res) => (res.ok ? res.json() : Promise.reject(res)))
.then((json) => {
window.location.hash = '#gracias'
$form.reset()
})
.catch((err) => {
console.log(err)
let message = err.statusText || 'Ocurrió un error al enviar, intenta nuevamente'
$response.querySelector('h3').innerHTML = `Error ${err.status}: ${message}`
})
.finally(() => {
$loader.classList.add('none')
setTimeout(() => {
window.location.hash = '#close'
}, 3000)
})

El truco es agregar clases para activar los mensajes modales, en el ejemplo #gracias y #close se encargan de controlar el mensaje.

<div className="max-w-6xl mx-auto">
<form className="max-w-md p-2 mx-auto contact-form" onSubmit="{handleSubmit(onSubmit)}">
<div className="text-center">
<p className="p-4">
Si quieres trabajar conmigo en tu próximo proyecto, no dudes en ponerse en contacto
</p>
</div>
<input type="text" name="name" placeholder=" Ingresa tu nombre" id="name"
{...register('Nombre')} patter="^[A-Za-zÑñÁáÉéÍíÓóÚúÜü\s]+$" className="w-4/5" required />
<input type="email" {...register('email')} name="email" id="email" placeholder=" No olvides tu
correo" title="email no valido"
pattern="^[a-z0-9]+(\.[_a-z0-9]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,15})$" className="w-4/5"
required/> <textarea name="coments" id="coments" {...register('coments')} cols="30" rows="5"
placeholder=" Platicame de tus ideas de desarrollo " className="w-4/5" required/>
<div className="contact-form-loader">
{errors.exampleRequired && <span>This field is required</span>}
<svg
xmlns="http://www.w3.org/2000/svg"
width="38"
height="38"
stroke="#d90062"
viewBox="0 0 38 38"
>
<g fill="none" fillRule="evenodd" strokeWidth="2" transform="translate(1 1)">
<circle cx="18" cy="18" r="18" strokeOpacity="0.5"></circle>
<path d="M36 18c0-9.94-8.06-18-18-18">
<animateTransform
attributeName="transform"
dur="1s"
from="0 18 18"
repeatCount="indefinite"
to="360 18 18"
type="rotate"
></animateTransform>
</path>
</g>
</svg>
</div>
<input
type="submit"
value="Enviar mensaje"
className="p-3 btn-reverse hover:text-white"
onSubmit="{handleSubmit}"
/>
</form>
<article id="gracias" className="modal transparente5">
<div className="relative px-6 py-4 mb-4 text-white bg-green-500 border-0 rounded">
<span className="inline-block mr-5 text-xl align-middle">
<i className="fas fa-bell" />
</span>
<span className="inline-block mr-8 align-middle">
<b className="capitalize">¡Enviado! </b> En breve estaremos en contacto
</span>
<button
className="absolute top-0 right-0 mt-4 mr-6 text-2xl font-semibold leading-none bg-transparent outline-none focus:outline-none"
>
<span>×</span>
</button>
</div>
</article>
</div>

Al utilizar react-hook-form tenemos todos las funciones de formularios.

.modal {
position: fixed;
z-index: 999;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
background-color: var(--black-alpha-color);
opacity: 0;
pointer-events: none;
transition: all 1s;
color: var(--orange);
}
.modal-close {
position: absolute;
top: 1rem;
right: 1rem;
}
.modal-close svg {
width: 3rem;
height: 3rem;
fill: var(--first-color);
}
.modal#gracias:target {
opacity: 1;
background-color: var(--black);
color: var(--orange);
pointer-events: auto;
}
.contact-form-loader {
text-align: center;
display: none;
}

Te dejo el repositorio por si gustas ver a detalle el código y la API funcionado.

Saludos.