A React component library for rendering customizable e-commerce product forms for Merchi products. This package provides a seamless integration for Next.js applications, allowing for interactive product forms with various customization options.
- Interactive product form with real-time price calculations
- Customizable styling through extensive class name props
- Support for product variations, groups, and options
- File upload capability for product customizations
- Cart and quote request functionality
- Responsive design suitable for all devices
- Installation
- Quick Start
- Usage Example
- Component Props
- CSS Class Props
- Styling
- Advanced Usage
- Contributing
- License
# Using npm
npm install merchi_product_form
# Using yarn
yarn add merchi_product_form
import MerchiProductForm from 'merchi_product_form';
function ProductPage({ product }) {
return (
<MerchiProductForm
initProduct={product}
onBuyNow={(job) => console.log(job)}
onGetQuote={(job) => console.log(job)}
/>
);
}
Here's a complete example of how to use the MerchiProductForm
component in a Next.js page:
import MerchiProductForm from 'merchi_product_form';
import { notFound } from 'next/navigation';
export async function fetchProduct(id) {
const url = `https://api.merchi.co/v6/products/${id}/`;
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const responseJson = await response.json();
return responseJson.product;
} catch (e) {
throw new Error(e);
}
}
export default async function Page({ params: { id } }) {
const initProduct = await fetchProduct(id);
if (!initProduct) return notFound();
const onBuyNow = (job) => {
// Handle buy now action
console.log('Buy now job:', job);
};
const onGetQuote = (job) => {
// Handle quote request
console.log('Quote request job:', job);
};
return (
<div className="product-container">
<MerchiProductForm
initProduct={initProduct}
onBuyNow={onBuyNow}
onGetQuote={onGetQuote}
showCurrency={true}
/>
</div>
);
}
The MerchiProductForm
component accepts the following props:
Name | Type | Default | Description |
---|---|---|---|
apiUrl |
string? |
'https://api.merchi.co/v6/' |
The Merchi API endpoint URL |
initProduct |
Product |
required | The Merchi product object to use for the form |
allowAddToCart |
boolean? |
false |
Controls if the add to cart button is shown |
btnNameAddToCart |
string? |
"Add to Cart" |
The text on the add to cart button |
currentUser |
User? |
undefined |
A Merchi client object to be used as the form's client |
draftApproveCallback |
(job) => Promise<void> | null |
null |
Async callback function that is triggered when drafts are approved |
hideTitle |
boolean? |
false |
Hide the product title |
hideCost |
boolean? |
false |
Hide the cost (useful for quote requests) |
hideCountry |
boolean? |
false |
Hide the country flag |
hideCalculatedPrice |
boolean? |
false |
Hide calculated price (useful for quote requests) |
hideDomainName |
boolean? |
false |
Hide product domain |
hideQuantityField |
boolean? |
false |
Hide the quantity field |
hideRequestQuotationButton |
boolean? |
false |
Hide request quote button |
hidePaymentUpfrontButton |
boolean? |
false |
Hide buy now button |
isCartItem |
boolean? |
false |
Used if the product form is being used in cart item context |
initJob |
`job | cartItem` | undefined |
onAddToCart |
(job) => void? |
undefined |
Callback function for the add to cart button |
onBuyNow |
(job) => void? |
undefined |
Callback function for the buy now button |
onGetQuote |
(job) => void? |
undefined |
Callback function for the get quote button |
onSubmit |
(job) => void? |
undefined |
Callback function that returns the latest job data |
productFormId |
string? |
undefined |
Optional ID to be applied to the product form |
showCurrency |
boolean? |
false |
Show the currency symbol |
showCurrencyCode |
boolean? |
false |
Show the currency code |
showFeatureDeadline |
boolean? |
false |
Will display a countdown timer |
showGroupBuyStatus |
boolean? |
false |
Will show the group buy status bar |
showUnitPrice |
boolean? |
false |
Show the unit price to the user |
The component provides extensive CSS class customization options:
Name | Type | Default | Description |
---|---|---|---|
classNameAlertSellerEditable |
string? |
'alert alert-light' |
Class for the seller editable alert element |
classNameButtonSubmit |
string? |
'btn btn-primary w-100 merchi-embed-form_button-submit' |
Class for the Submit button element |
classNameButtonGroupAdd |
string? |
'btn btn-white' |
Class for the add group button element |
classNameButtonGroupRemove |
string? |
'btn btn-danger' |
Class for the delete group button element |
classNameButtonsSubmitContainer |
string? |
'merchi-product-buttons-submit-container' |
Class for the container of the submit buttons |
classNameButtonApproveDrafts |
string? |
'btn btn-success' |
Class for the approve drafts button element |
classNameButtonCloseDrafts |
string? |
'btn btn-secondary' |
Class for the close drafts button element |
classNameFileUploadContainer |
string? |
'merchi-input-file-container' |
Class for the input file container |
classNameFileUpload |
string? |
'merchi-embed-form_dropzone' |
Class for the dropzone container |
classNameFilePreviewContainer |
string? |
'uploaded-variation-file' |
Class for the file variation upload element |
classNameFileUploadTextContainer |
string? |
'merchi-embed-form_dropzone-text-container' |
Class for the dropzone text element |
classNameFilePreviewIconWrapper |
string? |
'uploaded-variation-file-icon-wrapper' |
Class for the upload variation icon wrapper |
classNameFileUploadButton |
string? |
'btn btn-sm btn-link ml-auto' |
Class for the file upload button element |
classNameFileUploadIcon |
string? |
'merchi-embed-form_dropzone-icon' |
Class for the form dropzone icon element |
classNameFileUploadIconSecond |
string? |
'merchi-embed-form_dropzone-icon-plus' |
Class for the form dropzone plus icon element |
classNameFileUploadIconContainer |
string? |
'merchi-embed-form_dropzone-icon-container' |
Class for the form dropzone icon container |
classNameFileListItem |
string? |
'list-group-item no-z-index-hover' |
Class for file list item element |
classNameFileButtonDownload |
string? |
'btn btn-sm btn-secondary' |
Class for the file download button element |
classNameFileButtonDelete |
string? |
'btn btn-sm btn-danger ml-2' |
Class for the file delete button element |
classNameFileListItemContainer |
string? |
'list-group' |
Class for the file item list |
classNameGroupsContainer |
string? |
'merchi-embed-form_product-group-container' |
Class for the product variation group container |
classNameGroupPriceContainer |
string? |
'merchi-embed-form_product-group-total-cost' |
Class for the variation group total cost |
classNameInput |
string? |
'form-control' |
Class for form inputs |
classNameInventoryStatus |
string? |
'flex-fill' |
Class for the inventory status element |
classNameInputContainer |
string? |
'merchi-embed-form_product-group-input-qty-container' |
Class for the input container |
classNameOptionContainer |
string? |
'merchi-embed-form_checkbox_radio-item' |
Class for the radio/checkbox container |
classNameOptionInput |
string? |
'merchi-embed-form_checkbox_radio-input' |
Class for the radio input |
classNameOptionLabel |
string? |
'merchi-embed-form_checkbox_radio-label' |
Class for the radio label |
classNameOptionSuper |
string? |
'merchi-embed-form_checkbox_radio-super' |
Class for the checkbox radio super |
classNameOptionsCheckboxRadioContainer |
string? |
'' |
Class for the option checkbox/radio container |
classNameOptionImage |
string? |
'merchi-embed-form_image-select-option-item-img' |
Class for the variation image select element |
classNameOptionImageContainer |
string? |
'merchi-embed-form_image-select-option-item-container' |
Class for the variation image container element |
classNameOptionColour |
string? |
'merchi-embed-form_color-select-option' |
Class for the variation colour element |
classNameOptionColourContainer |
string? |
'merchi-embed-form_color-select-item' |
Class for the variation colour container element |
classNameProductTitle |
string? |
'merchi-product-title' |
Class for the product title element |
classNameProductOriginTitle |
string? |
'merchi-product-origin-title' |
Class for the product origin title element |
classNameProductTotalContainer |
string? |
'merchi-embed-form_summary-product-cost-container' |
Class for the product total cost container element |
classNameProductTotal |
string? |
'merchi-embed-form_summary-product-cost' |
Class for the product total cost element |
classNameQuantityLabelContainer |
string? |
'merchi-embed-form_quantity-label-container' |
Class for the product quantity label element |
classNameUnitPrice |
string? |
undefined |
Class for the unit price element |
The component provides extensive customization options through class name props. Here are some of the most commonly used styling props:
<MerchiProductForm
initProduct={product}
classNameButtonSubmit="custom-submit-button"
classNameInput="custom-input"
classNameProductTitle="custom-product-title"
classNameProductTotal="custom-product-total"
/>
<MerchiProductForm
initProduct={product}
classNameGroupsContainer="custom-groups-container"
classNameOptionContainer="custom-option-container"
onBuyNow={handleBuyNow}
/>
<MerchiProductForm
initProduct={product}
classNameFileUploadContainer="custom-file-upload"
classNameFilePreviewContainer="custom-file-preview"
onGetQuote={handleQuoteRequest}
/>
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
For detailed information about all available props, please refer to the TypeScript definitions in the source code.