@pack/react

The @pack/react package provides SDKs and components to enable your React app to connect with Pack.

Quick Start

Install with a package manager:

npm install @pack/react

Here is a list of exports from this package:

import {
  registerSection,
  registerStorefrontSettingsSchema,
  useSiteSettings,
  PreviewProvider,
  RenderSections,
} from '@pack/react'

<PreviewProvider />

The <PreviewProvider /> component is a React provider for your app and will give context for important info such as siteSettings, previewInfo, and more.

<PreviewProvider/> props

interface PreviewContentProps {
  children: ReactNode;
  siteSettings: any;
  isPreviewModeEnabled?: boolean;
}

Example

  //root.tsx
  import { PreviewProvider } from '@pack/react';
  ...

  export default function App() {
    const { siteSettings, isPreviewModeEnabled } = useLoaderData();

    return (
      <html lang="en">
        <head>
          <meta charSet="utf-8" />
          <meta name="viewport" content="width=device-width,initial-scale=1" />
          <Seo />
          <Meta />
          <Links />
        </head>

        <body>
          <PreviewProvider
            isPreviewModeEnabled={isPreviewModeEnabled}
            siteSettings={siteSettings}
          >
              <Outlet />
          </PreviewProvider>
        </body>
      </html>
    );
  }


registerSection()

registerSection is a function that will register your React components to become Sections. If you create a component and want to make it an editable section on your storefront, it is important to register it with this function.

Usage

Here at Pack, we recommend creating a sections/ folder in the project where all your sections will live. This sections/ folder will export a registerSections utility function that makes it easy to register all your sections in the root of your app.

Here is an example from our Blueprint Theme of how to use registerSections() in your storefront's root.tsx.

Arguments

  • Name
    section
    Type
    React.ComponentType<any> & { Schema?: Schema }
    Description

    The React component that you want to become an interactable section in your storefront and the Customizer.

  • Name
    name
    Type
    string
    Description

    A unique name for this section.

Example

  import { registerSection } from '@pack/react';

  import { Hero } from './Hero';
  import { FiftyFiftyHero } from './FiftyFiftyHero';
  import { TextBlock } from './TextBlock';
  import { Image } from './Image';
  import { HTML } from './HTML';

  export { Hero, FiftyFiftyHero, TextBlock };

  export function registerSections() {
    registerSection(Hero, { name: 'hero' });
    registerSection(FiftyFiftyHero, { name: 'fifty-fifty-hero' });
    registerSection(TextBlock, { name: 'text-block' });
    registerSection(Image, { name: 'image-block' });
    registerSection(HTML, { name: 'html-block' });
  }

<RenderSections />

The <RenderSections /> component will take in your page content data and return an array of React components that you have registered as sections.

Example

  //_index.tsx
  import { useLoaderData } from '@remix-run/react';
  import { defer, LoaderArgs } from '@shopify/remix-oxygen';
  import { RenderSections } from '@pack/react';


  export async function loader({ context }: LoaderArgs) {
    const { data } = await context.pack.query(HOME_PAGE_QUERY);

    return defer({
      page: data.page,
    });
  }

  export default function Index() {
    const { page } = useLoaderData();

    return (
      <div className="grid gap-4">
        <RenderSections content={page} />
      </div>
    );
  }

registerStorefrontSettingsSchema()

Similar to registerSection, the registerStorefrontSettingsSchema is a function that will register your site settings schema to be editable withing the Customizer. This will allow you to create a global setting for your store to be used for headers, footers, etc. You can access these settings by using the useSiteSettings hook.

Usage

Here at Pack, we recommend creating a settings/ folder in the project where all your site settings will live. This settings/ folder will export a registerSiteSettings utility function that makes it easy to register all your settings in the root of your app.

Arguments

  • Name
    settings
    Type
    Array<Schema>
    Description

    An array of schemas that define your site settings. Note, the schema structure is the same as what you would use in a section.

Example

  import {registerStorefrontSettingsSchema} from '@pack/react';

  import footer from './footer';

  export function registerSiteSettings() {
    registerStorefrontSettingsSchema([footer]);
  }

useSiteSettings()

The useSiteSettings hook allows you to access the structured data that you defined with your site settings schema. This hook must be used with the <PreviewProvider/> component.

Usage

Here at Pack, we recommend creating a sections/ folder in the project where all your sections will live. This sections/ folder will export a registerSections utility function that makes it easy to register all your sections in the root of your app.

Example

  import {ReactNode} from 'react';
  import {Header} from './Header';
  import {Footer} from './Footer';
  import {useSiteSettings} from '@pack/react';

  export function Layout({
    children,
  }: {
    siteSettings?: Record<string, any>;
    children: ReactNode;
  }) {
    const siteSettings = useSiteSettings();
    return (
      <>
        <Header settings={siteSettings?.settings?.header} />
        <main role="main" id="mainContent" className="flex-grow py-4">
          {children}
        </main>
        <Footer settings={siteSettings?.settings?.footer} />
      </>
    );
  }

Was this page helpful?