Skip to content

Commit

Permalink
Merge pull request #56 from Shopify/fd-pages
Browse files Browse the repository at this point in the history
Add pages route
  • Loading branch information
frandiox committed Oct 4, 2022
2 parents 21d8747 + 7e952aa commit b5bcb98
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 0 deletions.
33 changes: 33 additions & 0 deletions app/data/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import type {
CustomerUpdateInput,
CustomerUpdatePayload,
UserError,
Page,
} from "@shopify/hydrogen-ui-alpha/storefront-api-types";
import {
getPublicTokenHeaders,
Expand Down Expand Up @@ -1035,6 +1036,38 @@ export async function getArticle(variables: {
return data.blog.articleByHandle;
}

const PAGE_QUERY = `#graphql
query PageDetails($languageCode: LanguageCode, $handle: String!)
@inContext(language: $languageCode) {
page(handle: $handle) {
id
title
body
seo {
description
title
}
}
}
`;

export async function getPageData(variables: {
language: LanguageCode;
handle: string;
}) {
const { data } = await getStorefrontData<{ page: Page }>({
query: PAGE_QUERY,
variables,
});

invariant(data, "No data returned from Shopify API");
if (!data.page) {
throw new Response("Not found", { status: 404 });
}

return data.page;
}

const NOT_FOUND_QUERY = `#graphql
${PRODUCT_CARD_FRAGMENT}
query homepage($country: CountryCode, $language: LanguageCode)
Expand Down
57 changes: 57 additions & 0 deletions app/routes/pages/$pageHandle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import {
json,
LoaderArgs,
MetaFunction,
SerializeFrom,
} from "@remix-run/cloudflare";
import { useLoaderData } from "@remix-run/react";
import invariant from "tiny-invariant";
import { PageHeader } from "~/components";
import { getPageData } from "~/data";

export async function loader({ params }: LoaderArgs) {
// TODO figure out localization
const languageCode = "EN";

invariant(params.pageHandle, "Missing page handle");

const page = await getPageData({
handle: params.pageHandle,
language: languageCode,
});

return json(
{ page },
{
headers: {
// TODO cacheLong()
},
}
);
}

export const meta: MetaFunction = ({
data,
}: {
data: SerializeFrom<typeof loader> | undefined;
}) => {
return {
title: data?.page?.seo?.title ?? "Page",
description: data?.page?.seo?.description,
};
};

export default function Page() {
const { page } = useLoaderData<typeof loader>();

return (
<>
<PageHeader heading={page.title}>
<div
dangerouslySetInnerHTML={{ __html: page.body }}
className="prose dark:prose-invert"
/>
</PageHeader>
</>
);
}

0 comments on commit b5bcb98

Please sign in to comment.