@adelant/react-mautic-forms
Version:
React components for Mautic form integration
454 lines (364 loc) • 11.8 kB
Markdown
A lightweight, flexible React component library for integrating Mautic forms into any React-based project. This library provides easy-to-use components for creating, styling, and handling Mautic form submissions.
[](https://www.npmjs.com/package/@adelant/react-mautic-forms)
[](https://www.npmjs.com/package/@adelant/react-mautic-forms)
[](https://opensource.org/licenses/MIT)
- 🚀 Framework agnostic - works with any React project
- 🧩 Modular components for maximum flexibility
- 📱 Responsive design with customizable styling
- 🔄 Automatic form reset on successful submission
- 📝 TypeScript support with comprehensive type definitions
- ⚡ Optimized for Next.js but works with any React setup
```bash
npm install @adelant/react-mautic-forms
yarn add @adelant/react-mautic-forms
pnpm add @adelant/react-mautic-forms
bun add @adelant/react-mautic-forms
```
```jsx
import {
MauticForm,
MauticInput,
MauticSubmitButton,
MauticTracking,
MauticFormScript,
} from "@adelant/react-mautic-forms";
function ContactForm() {
const handleSuccess = (formData) => {
console.log("Form submitted:", formData);
};
return (
<>
{/* Add these once in your app */}
<MauticTracking
mauticURL="https://mautic.example.com/mtc.js"
tags="example.com"
/>
<MauticFormScript
mauticDomain="https://mautic.example.com"
mauticFormURL="https://mautic.example.com/media/js/mautic-form.js"
/>
{/* Create your form */}
<MauticForm
formId="123"
formName="contact_form"
successCallback={handleSuccess}
>
<MauticInput
formName="contact_form"
name="email"
label="Email Address"
type="email"
required
validate="email"
/>
<MauticInput
formName="contact_form"
name="message"
label="Your Message"
type="textarea"
required
/>
<MauticSubmitButton
formName="contact_form"
className="px-4 py-2 bg-blue-500 text-white rounded"
>
Send Message
</MauticSubmitButton>
</MauticForm>
</>
);
}
```
```jsx
import {
MauticForm,
MauticInput,
MauticSubmitButton,
MauticTracking,
MauticFormScript,
} from "@adelant/react-mautic-forms";
function App() {
return (
<div>
<MauticTracking
mauticURL="https://mautic.example.com/mtc.js"
tags="example.com"
/>
<MauticFormScript
mauticDomain="https://mautic.example.com"
mauticFormURL="https://mautic.example.com/media/js/mautic-form.js"
/>
<MauticForm formId="1" formName="contact_form">
<MauticInput
formName="contact_form"
name="name"
label="Your Name"
required
/>
<MauticInput
formName="contact_form"
name="email"
label="Email Address"
type="email"
required
/>
<MauticSubmitButton formName="contact_form">Submit</MauticSubmitButton>
</MauticForm>
</div>
);
}
```
```jsx
// pages/_app.js
import { MauticTracking, MauticFormScript } from '@adelant/react-mautic-forms';
function MyApp({ Component, pageProps }) {
return (
<>
<Component {...pageProps} />
<MauticTracking
mauticURL="https://mautic.example.com/mtc.js"
tags="example.com"
/>
<MauticFormScript
mauticDomain="https://mautic.example.com"
mauticFormURL="https://mautic.example.com/media/js/mautic-form.js"
/>
</>
);
}
export default MyApp;
// pages/contact.js
import { MauticForm, MauticInput, MauticSubmitButton } from '@adelant/react-mautic-forms';
export default function Contact() {
return (
<div className="container mx-auto py-8">
<h1 className="text-2xl font-bold mb-6">Contact Us</h1>
<MauticForm formId="1" formName="contact_form">
{/* Form fields */}
<MauticSubmitButton formName="contact_form">Submit</MauticSubmitButton>
</MauticForm>
</div>
);
}
```
```jsx
// app/layout.jsx
import { MauticTracking, MauticFormScript } from '@adelant/react-mautic-forms';
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
{children}
<MauticTracking
mauticURL="https://mautic.example.com/mtc.js"
tags="example.com"
/>
<MauticFormScript
mauticDomain="https://mautic.example.com"
mauticFormURL="https://mautic.example.com/media/js/mautic-form.js"
/>
</body>
</html>
);
}
// app/contact/page.jsx - Note: Client Component
'use client';
import { MauticForm, MauticInput, MauticSubmitButton } from '@adelant/react-mautic-forms';
export default function ContactPage() {
return (
<div className="container mx-auto py-8">
<h1 className="text-2xl font-bold mb-6">Contact Us</h1>
<MauticForm formId="1" formName="contact_form">
<MauticInput
formName="contact_form"
name="email"
label="Email"
type="email"
required
/>
<MauticSubmitButton formName="contact_form">Submit</MauticSubmitButton>
</MauticForm>
</div>
);
}
```
Main container for Mautic forms that handles form submission and notifications.
```jsx
<MauticForm
formId="123" // Required: Mautic form ID
formName="contact_form" // Required: Unique form name
action="https://mautic.example.com/form/submit" // Optional: Custom submission URL
successCallback={(formData) => {}} // Optional: Function called on successful submission
errorCallback={(error, formData) => {}} // Optional: Function called on error
className="my-form" // Optional: CSS class for the wrapper
>
{/* Form elements go here */}
</MauticForm>
```
Component for creating various form input types.
```jsx
<MauticInput
formName="contact_form" // Required: Must match parent MauticForm's formName
name="email" // Required: Field name
label="Email Address" // Optional: Input label
type="email" // Optional: Input type (default: "text") or "textarea"
component="input" // Optional: "input" or "textarea". Defaults to inferring from type.
required={true} // Optional: Mark field as required
validate="email" // Optional: Validation type
validationType="email" // Optional: Additional validation params
className="custom-input" // Optional: CSS classes
errorMessage="Valid email required" // Optional: Custom error message
placeholder="Enter your email" // Optional: Placeholder text
autocomplete="email" // Optional: Autocomplete attribute
// ...other standard input/textarea props (onChange, onBlur, etc.)
/>
```
Supported input types: `text`, `email`, `tel`, `number`, `date`, `textarea`, and others supported by HTML input.
Customizable submit button for the form.
```jsx
<MauticSubmitButton
formName="contact_form" // Required: Must match parent MauticForm's formName
className="submit-button" // Optional: CSS classes
// ...other standard button props (disabled, onClick, etc.)
>
Send Message // Button text/content
</MauticSubmitButton>
```
Adds Mautic tracking to your application. Include this once, typically in your app layout.
```jsx
<MauticTracking
mauticURL="https://mautic.example.com/mtc.js"
tags="example.com"
enabled={true} // Optional: Explicitly enable/disable tracking. Defaults to !dev
/>
```
If you need complete control over the form rendering and logic, you can use the `useMauticForm` hook.
```jsx
import { useMauticForm } from "@adelant/react-mautic-forms";
function MyCustomForm() {
const { handleSubmit, isSubmitting, error } = useMauticForm({
formId: "123",
formName: "contact_form",
action: "https://mautic.example.com/form/submit",
successCallback: (formData) => console.log("Success!", formData),
errorCallback: (err) => console.error("Error!", err),
});
return (
<form onSubmit={handleSubmit}>
<input name="mauticform[email]" type="email" required />
{/* Required hidden fields for Mautic */}
<input type="hidden" name="mauticform[formId]" value="123" />
<input type="hidden" name="mauticform[return]" value="" />
<input type="hidden" name="mauticform[formName]" value="contact_form" />
<button disabled={isSubmitting}>
{isSubmitting ? "Sending..." : "Send"}
</button>
{error && <div className="error">{error.message}</div>}
</form>
);
}
```
Adds the Mautic form handler script to your application. Include this once, typically in your app layout.
```jsx
<MauticFormScript
mauticDomain="https://mautic.example.com"
mauticFormURL="https://mautic.example.com/media/js/mautic-form.js"
/>
```
All components accept `className` props for styling with Tailwind CSS, CSS modules, or any CSS framework.
```jsx
<MauticForm
formId="1"
formName="contact_form"
className="bg-gray-100 p-6 rounded-lg shadow-md"
>
<MauticInput
formName="contact_form"
name="email"
label="Email"
className="mb-4 border-gray-300 focus:ring-blue-500"
/>
<MauticSubmitButton
formName="contact_form"
className="px-6 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"
>
Submit
</MauticSubmitButton>
</MauticForm>
```
Customize what happens after successful form submission:
```jsx
<MauticForm
formId="1"
formName="contact_form"
successCallback={(formData) => {
// Access form data
console.log("Form data:", formData);
// Track event with analytics
window.gtag?.("event", "form_submission", {
form_name: "contact_form",
});
// Navigate to thank you page
router.push("/thank-you");
}}
>
{/* Form fields */}
</MauticForm>
```
You can use a custom Mautic instance by configuring the endpoint URL:
```jsx
<MauticForm
formId="1"
formName="contact_form"
action="https://your-mautic-instance.com/form/submit"
>
{/* Form fields */}
</MauticForm>
```
This library includes comprehensive TypeScript definitions. Import types directly:
```tsx
import { MauticFormProps, MauticInputProps } from "@adelant/react-mautic-forms";
const CustomInput = ({ ...props }: MauticInputProps) => {
return <MauticInput {...props} className="custom-styled-input" />;
};
```
- Chrome, Firefox, Safari, Edge: latest 2 versions
- IE: Not supported
Contributions are welcome! Please feel free to submit a Pull Request.
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the MIT License - see the LICENSE file for details.
## Acknowledgements
- Developed and maintained by [Adelant](https://adelant.com)
- Built with [Bun](https://bun.sh) and TypeScript