The React framework for production with server-side rendering, static generation, and more.
Get started with Next.js and StaticBox in minutes:
Create a new Next.js project or use your existing one.
npx create-next-app@latest my-staticbox-app
cd my-staticbox-app
npm installAdd a contact form component that submits to StaticBox.
// components/ContactForm.tsx
'use client';
import { useState } from 'react';
export default function ContactForm() {
const [isSubmitting, setIsSubmitting] = useState(false);
const [isSubmitted, setIsSubmitted] = useState(false);
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
setIsSubmitting(true);
const form = e.currentTarget;
const formData = new FormData(form);
try {
const response = await fetch('https://staticbox.io/api/forms/[your-project-id]/[slug-name]/submit', {
method: 'POST',
body: formData,
});
if (response.ok) {
setIsSubmitted(true);
form.reset();
}
} catch (error) {
console.error('Error submitting form:', error);
} finally {
setIsSubmitting(false);
}
};
if (isSubmitted) {
return (
<div className="p-6 bg-green-50 rounded-lg">
<h3 className="text-lg font-semibold text-green-800">Thank you!</h3>
<p className="text-green-600">Your message has been sent successfully.</p>
</div>
);
}
return (
<form onSubmit={handleSubmit} className="space-y-4">
<div>
<label htmlFor="name" className="block text-sm font-medium mb-1">
Name
</label>
<input
type="text"
id="name"
name="name"
required
className="w-full px-3 py-2 border rounded-md"
/>
</div>
<div>
<label htmlFor="email" className="block text-sm font-medium mb-1">
Email
</label>
<input
type="email"
id="email"
name="email"
required
className="w-full px-3 py-2 border rounded-md"
/>
</div>
<div>
<label htmlFor="message" className="block text-sm font-medium mb-1">
Message
</label>
<textarea
id="message"
name="message"
rows={4}
required
className="w-full px-3 py-2 border rounded-md"
/>
</div>
<button
type="submit"
disabled={isSubmitting}
className="w-full bg-blue-600 text-white py-2 px-4 rounded-md hover:bg-blue-700 disabled:opacity-50"
>
{isSubmitting ? 'Sending...' : 'Send Message'}
</button>
</form>
);
}Import and use your contact form in any page.
// app/contact/page.tsx
import ContactForm from '../components/ContactForm';
export default function ContactPage() {
return (
<div className="max-w-md mx-auto py-12">
<h1 className="text-2xl font-bold mb-6">Contact Us</h1>
<ContactForm />
</div>
);
}Use Next.js Server Actions for form submission.
// app/actions.ts
'use server';
export async function submitContact(formData: FormData) {
const response = await fetch('https://staticbox.io/api/forms/[your-project-id]/[slug-name]/submit', {
method: 'POST',
body: formData,
});
return response.ok;
}
// app/contact/page.tsx
import { submitContact } from '../actions';
export default function ContactPage() {
return (
<form action={submitContact}>
<input name="name" placeholder="Name" required />
<input name="email" type="email" placeholder="Email" required />
<textarea name="message" placeholder="Message" required />
<button type="submit">Send</button>
</form>
);
}Proxy form submissions through Next.js API routes.
// app/api/contact/route.ts
import { NextRequest } from 'next/server';
export async function POST(request: NextRequest) {
const formData = await request.formData();
const response = await fetch('https://staticbox.io/api/forms/[your-project-id]/[slug-name]/submit', {
method: 'POST',
body: formData,
});
return Response.json({ success: response.ok });
}Create your StaticBox project and start building with Next.js today.
Create Project