Add React editor project

This commit is contained in:
Rami Bitar
2026-08-09 16:00:10 -04:00
parent 909d99251a
commit 63ecc5e284
212 changed files with 20655 additions and 11571 deletions
+7
View File
@@ -0,0 +1,7 @@
import PageEditor from '@/components/page-editor';
// Editor for /policies/[handle]. Sitting under the route it edits means the preview
// resolves the same params the public page gets.
export default function EditorPage() {
return <PageEditor routeKey="/policies/[handle]" />;
}
+40
View File
@@ -0,0 +1,40 @@
{
"root": {
"props": {
"title": "Policy",
"description": "Store policies.",
"ogImage": ""
}
},
"content": [
{
"type": "header",
"props": {
"id": "header"
},
"synced": true
},
{
"type": "policy",
"props": {
"id": "policy-body",
"handle": "",
"title": "",
"notFoundMessage": "This policy has not been published yet."
}
},
{
"type": "footer",
"props": {
"id": "footer"
},
"synced": true
},
{
"type": "store-assistant",
"props": {
"id": "store-assistant"
}
}
]
}
+44
View File
@@ -0,0 +1,44 @@
import type { Metadata } from 'next';
import { notFound } from 'next/navigation';
import PageRender from '@/components/page-render';
import { pageMetadata } from '@/lib/page-metadata';
import { getShopPolicy, POLICY_HANDLES } from '@/hooks/use-shopify-policies';
import { site } from '@/config/site';
import page from './page.json';
export function generateStaticParams() {
return POLICY_HANDLES.map((handle) => ({ handle }));
}
export async function generateMetadata({
params,
}: {
params: Promise<{ handle: string }>;
}): Promise<Metadata> {
const { handle } = await params;
const policy = await getShopPolicy(handle).catch(() => null);
if (!policy) return pageMetadata(page);
return pageMetadata(page, {
title: policy.title,
description: `Read the ${policy.title.toLowerCase()} for ${site.storeName}.`,
path: `/policies/${policy.handle}`,
});
}
export default async function Page({
params,
}: {
params: Promise<{ handle: string }>;
}) {
const { handle } = await params;
// Keep the 404 for handles Shopify doesn't know, rather than rendering the
// policy block's "not published yet" state for a genuinely bad URL.
if (!POLICY_HANDLES.includes(handle as (typeof POLICY_HANDLES)[number])) {
notFound();
}
return <PageRender page={page} />;
}