Skip to main content

๐Ÿงช Examples for getProduct()

Here are practical usage examples to help you understand how to use getProduct() effectively with typed metafields, error handling, and optional rendering logic.


๐Ÿ”น Basic Usage with Handleโ€‹

import { getProduct } from "@/lib/NextShopKit/client";

const { data, error } = await getProduct({
handle: "solar-kit-9kw",
customMetafields: [
{ field: "custom.brand", type: "single_line_text" },
{ field: "custom.weight", type: "decimal" },
],
options: {
resolveFiles: true,
camelizeKeys: true,
renderRichTextAsHtml: false,
},
});

if (error || !data) {
console.error("โŒ Failed to load product:", error);
} else {
console.log("โœ… Product:", data.title);
}

โš ๏ธ Error Handling Patternโ€‹

Always check for error and data. If either is missing, show a fallback:

if (!data || error) {
return <p>Product not found or unavailable.</p>;
}

๐Ÿ“ฆ Accessing Parsed Metafieldsโ€‹

<p>Brand: {data.metafields.custom.brand}</p>
<p>Weight: {data.metafields.custom.weight} kg</p>

๐ŸŽจ Rendering Rich Text (HTML)โ€‹

const { data } = await getProduct({
handle: "solar-kit-3kw",
customMetafields: [{ field: "custom.description", type: "rich_text" }],
options: {
renderRichTextAsHtml: true,
},
});
<div
className="product-description"
dangerouslySetInnerHTML={{
__html: data.metafields.custom.description,
}}
/>

๐Ÿ“ File Metafieldsโ€‹

customMetafields: [
{ field: "custom.certificates", type: "File" }
],
options: {
resolveFiles: true
}
{
data.metafields.custom.certificates.map((file: any) => (
<a key={file.id} href={file.url} target="_blank">
{file.alt || "View File"}
</a>
));
}

โœ… Best Practicesโ€‹

  • Always use handle or id โ€” never both
  • Wrap file downloads or rich text safely in the UI
  • Use camelizeKeys to make keys easier to work with
  • Prefer server-side fetching for better performance and SEO
  • Use client-side approaches only when you need real-time updates

Next: Types โ†’