fetch, with React state for handling submission status.
Basic Example
import React, { useState } from 'react';
export default function ContactForm() {
const [status, setStatus] = useState('idle'); // idle | submitting | success | error
const [message, setMessage] = useState('');
const handleSubmit = async (e) => {
e.preventDefault();
setStatus('submitting');
const formData = new FormData(e.target);
try {
const response = await fetch('https://pipedform.com/f/{form_id}', {
method: 'POST',
body: formData,
headers: {
Accept: 'application/json',
},
});
const data = await response.json();
if (response.ok) {
setStatus('success');
setMessage('Form submitted successfully');
e.target.reset();
} else {
setStatus('error');
setMessage(data.message ?? 'Something went wrong. Please try again.');
}
} catch (error) {
setStatus('error');
setMessage('Network error. Please check your connection.');
}
};
return (
<form onSubmit={handleSubmit}>
<label htmlFor="name">Name</label>
<input id="name" name="name" required />
<label htmlFor="email">Email</label>
<input id="email" name="email" type="email" required />
<label htmlFor="message">Message</label>
<textarea id="message" name="message" required></textarea>
<button type="submit" disabled={status === 'submitting'}>
{status === 'submitting' ? 'Sending...' : 'Submit'}
</button>
{status === 'success' && <p style={{ color: 'green' }}>{message}</p>}
{status === 'error' && <p style={{ color: 'red' }}>{message}</p>}
</form>
);
}
