import { useEffect } from "react"; import { useFetcher } from "react-router"; import { useAppBridge } from "@shopify/app-bridge-react"; import { boundary } from "@shopify/shopify-app-react-router/server"; import { authenticate } from "../shopify.server"; export const loader = async ({ request }) => { await authenticate.admin(request); return null; }; export const action = async ({ request }) => { const { admin } = await authenticate.admin(request); const color = ["Red", "Orange", "Yellow", "Green"][ Math.floor(Math.random() * 4) ]; const response = await admin.graphql( `#graphql mutation populateProduct($product: ProductCreateInput!) { productCreate(product: $product) { product { id title handle status variants(first: 10) { edges { node { id price barcode createdAt } } } demoInfo: metafield(namespace: "$app", key: "demo_info") { jsonValue } } } }`, { variables: { product: { title: `${color} Snowboard`, metafields: [ { namespace: "$app", key: "demo_info", value: "Created by React Router Template", }, ], }, }, }, ); const responseJson = await response.json(); const product = responseJson.data.productCreate.product; const variantId = product.variants.edges[0].node.id; const variantResponse = await admin.graphql( `#graphql mutation shopifyReactRouterTemplateUpdateVariant($productId: ID!, $variants: [ProductVariantsBulkInput!]!) { productVariantsBulkUpdate(productId: $productId, variants: $variants) { productVariants { id price barcode createdAt } } }`, { variables: { productId: product.id, variants: [{ id: variantId, price: "100.00" }], }, }, ); const variantResponseJson = await variantResponse.json(); const metaobjectResponse = await admin.graphql( `#graphql mutation shopifyReactRouterTemplateUpsertMetaobject($handle: MetaobjectHandleInput!, $metaobject: MetaobjectUpsertInput!) { metaobjectUpsert(handle: $handle, metaobject: $metaobject) { metaobject { id handle title: field(key: "title") { jsonValue } description: field(key: "description") { jsonValue } } userErrors { field message } } }`, { variables: { handle: { type: "$app:example", handle: "demo-entry", }, metaobject: { fields: [ { key: "title", value: "Demo Entry" }, { key: "description", value: "This metaobject was created by the Shopify app template to demonstrate the metaobject API.", }, ], }, }, }, ); const metaobjectResponseJson = await metaobjectResponse.json(); return { product: responseJson.data.productCreate.product, variant: variantResponseJson.data.productVariantsBulkUpdate.productVariants, metaobject: metaobjectResponseJson.data.metaobjectUpsert.metaobject, }; }; export default function Index() { const fetcher = useFetcher(); const shopify = useAppBridge(); const isLoading = ["loading", "submitting"].includes(fetcher.state) && fetcher.formMethod === "POST"; useEffect(() => { if (fetcher.data?.product?.id) { shopify.toast.show("Product created"); } }, [fetcher.data?.product?.id, shopify]); const generateProduct = () => fetcher.submit({}, { method: "POST" }); return ( Generate a product This embedded app template uses{" "} App Bridge {" "} interface examples like an{" "} additional page in the app nav , as well as an{" "} Admin GraphQL {" "} mutation demo, to provide a starting point for app development. Generate a product with GraphQL and get the JSON output for that product. Learn more about the{" "} productCreate {" "} mutation in our API references. Includes a product{" "} metafield {" "} and{" "} metaobject . Generate a product {fetcher.data?.product && ( { shopify.intents.invoke?.("edit:shopify/Product", { value: fetcher.data?.product?.id, }); }} target="_blank" variant="tertiary" > Edit product )} {fetcher.data?.product && (
                  {JSON.stringify(fetcher.data.product, null, 2)}
                
productVariantsBulkUpdate mutation
                  {JSON.stringify(fetcher.data.variant, null, 2)}
                
metaobjectUpsert mutation
                  
                    {JSON.stringify(fetcher.data.metaobject, null, 2)}
                  
                
)}
Framework: React Router Interface: Polaris web components API: GraphQL Custom data: Metafields & metaobjects Database: Prisma Build an{" "} example app Explore Shopify's API with{" "} GraphiQL
); } export const headers = (headersArgs) => { return boundary.headers(headersArgs); };