diff --git a/.nvmrc b/.nvmrc
index 3c032078a..209e3ef4b 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-18
+20
diff --git a/app/(auth)/authorize/page.tsx b/app/(auth)/authorize/page.tsx
new file mode 100644
index 000000000..806e5c47e
--- /dev/null
+++ b/app/(auth)/authorize/page.tsx
@@ -0,0 +1,27 @@
+import { headers } from 'next/headers';
+
+export const runtime = 'edge';
+
+export default async function AuthorizationPage() {
+ const headersList = headers();
+ const access = headersList.get('x-shop-access');
+ if (!access) {
+ console.log('ERROR: No access header');
+ throw new Error('No access header');
+ }
+ console.log('Authorize Access code header:', access);
+ if (access === 'denied') {
+ console.log('Access Denied for Auth');
+ throw new Error('No access allowed');
+ }
+
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/app/(auth)/login/page.tsx b/app/(auth)/login/page.tsx
new file mode 100644
index 000000000..d8748e347
--- /dev/null
+++ b/app/(auth)/login/page.tsx
@@ -0,0 +1,17 @@
+import { LoginMessage } from 'components/auth/login-message';
+
+export const runtime = 'edge';
+
+export default async function LoginPage() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/app/(auth)/logout/page.tsx b/app/(auth)/logout/page.tsx
new file mode 100644
index 000000000..3b7080c25
--- /dev/null
+++ b/app/(auth)/logout/page.tsx
@@ -0,0 +1,13 @@
+export const runtime = 'edge';
+
+export default async function LogoutPage() {
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/app/[page]/page.tsx b/app/[page]/page.tsx
index 0781a6edc..35ac63867 100644
--- a/app/[page]/page.tsx
+++ b/app/[page]/page.tsx
@@ -38,7 +38,7 @@ export default async function Page({ params }: { params: { page: string } }) {
{page.title}
-
+
{page.metaobjects?.map((content) => (
@@ -48,7 +48,7 @@ export default async function Page({ params }: { params: { page: string } }) {
))}
-
+
>
);
}
diff --git a/app/account/layout.tsx b/app/account/layout.tsx
new file mode 100644
index 000000000..db15d4d52
--- /dev/null
+++ b/app/account/layout.tsx
@@ -0,0 +1,3 @@
+export default function Layout({ children }: { children: React.ReactNode }) {
+ return {children}
;
+}
diff --git a/app/account/loading.tsx b/app/account/loading.tsx
new file mode 100644
index 000000000..c932332d5
--- /dev/null
+++ b/app/account/loading.tsx
@@ -0,0 +1,34 @@
+import Divider from 'components/divider';
+import Heading from 'components/ui/heading';
+import Skeleton from 'components/ui/skeleton';
+
+export default function Loading() {
+ return (
+
+ );
+}
diff --git a/app/account/orders/[id]/loading.tsx b/app/account/orders/[id]/loading.tsx
new file mode 100644
index 000000000..da845d7d3
--- /dev/null
+++ b/app/account/orders/[id]/loading.tsx
@@ -0,0 +1,29 @@
+import Skeleton from 'components/ui/skeleton';
+
+export default function Loading() {
+ return (
+
+ );
+}
diff --git a/app/account/orders/[id]/page.tsx b/app/account/orders/[id]/page.tsx
new file mode 100644
index 000000000..51fb47237
--- /dev/null
+++ b/app/account/orders/[id]/page.tsx
@@ -0,0 +1,276 @@
+import { CheckCircleIcon, TruckIcon, ArrowLeftIcon } from '@heroicons/react/24/outline';
+import Image from 'next/image';
+import { Button } from 'components/button';
+import { Card } from 'components/ui/card';
+import Heading from 'components/ui/heading';
+import Label from 'components/ui/label';
+import { getCustomerOrder } from 'lib/shopify';
+import { Fulfillment, Order } from 'lib/shopify/types';
+import Text from 'components/ui/text';
+import Price from 'components/price';
+import Badge from 'components/ui/badge';
+import Link from 'next/link';
+import OrderSummaryMobile from 'components/account/orders/order-summary-mobile';
+import { Suspense } from 'react';
+import OrderSummary from 'components/account/orders/order-summary';
+
+export const runtime = 'edge';
+
+function toPrintDate(date: string) {
+ return new Date(date).toLocaleDateString('en-US', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric'
+ });
+}
+
+function Unfulfilled({ order }: { order: Order }) {
+ // Build a map of line item IDs to quantities fulfilled
+ const fulfilledLineItems = order.fulfillments.reduce