import { useEffect } from "react"; import type { ActionFunctionArgs, HeadersFunction, LoaderFunctionArgs, } from "react-router"; import { useFetcher } from "react-router"; import { useAppBridge } from "@shopify/app-bridge-react"; import { authenticate } from "../shopify.server"; import { boundary } from "@shopify/shopify-app-react-router/server"; export const loader = async ({ request }: LoaderFunctionArgs) => { await authenticate.admin(request); return null; }; export const action = async ({ request }: ActionFunctionArgs) => { 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 } } } } } }`, { variables: { product: { title: `${color} Snowboard`, }, }, }, ); 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(); return { product: responseJson!.data!.productCreate!.product, variant: variantResponseJson!.data!.productVariantsBulkUpdate!.productVariants, }; }; 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. 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)}
                
)}
Framework: React Router Interface: Polaris web components API: GraphQL Database: Prisma Build an{" "} example app Explore Shopify's API with{" "} GraphiQL
); } export const headers: HeadersFunction = (headersArgs) => { return boundary.headers(headersArgs); };