Template
- Storefront customer operations in graphql/customer.js and a server-safe services/shopify/customer.ts - Session held in an httpOnly, sameSite=lax cookie set by the /api/account handlers; the access token never reaches client JS - Pages: /account/login, /register, /recover, /reset/[id]/[token] and /activate/[id]/[token] for Shopify's emailed links - /account renders order history as master-detail on one screen, since the Storefront API has no standalone order-by-id query for customers - Header user icon: links to sign-in when signed out, otherwise a menu with name, email, order history, and sign out - Login errors are collapsed and password recovery responds identically for known and unknown emails, so neither form enumerates accounts Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016jWbNNJLksC1QG8z8845FX
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { redirect } from 'next/navigation';
|
|
import Header from '@/components/shopify/header';
|
|
import Footer from '@/components/shopify/footer';
|
|
import OrderHistory from '@/components/shopify/order-history';
|
|
import { getSessionToken } from '@/services/shopify/session';
|
|
import { getCustomer } from '@/services/shopify/customer';
|
|
|
|
export const metadata = { title: 'Order history — Shop' };
|
|
|
|
export default async function Page() {
|
|
const token = await getSessionToken();
|
|
if (!token) redirect('/account/login');
|
|
|
|
const customer = await getCustomer(token, 20);
|
|
// An expired or revoked token reads as signed out.
|
|
if (!customer) redirect('/account/login');
|
|
|
|
return (
|
|
<>
|
|
<Header storeName="Shop" logoUrl="" />
|
|
|
|
<main className="max-w-screen-2xl mx-auto w-full px-8 py-12">
|
|
<h1 className="text-2xl md:text-3xl font-normal text-foreground">
|
|
Order history
|
|
</h1>
|
|
<p className="mt-1 text-sm text-muted-foreground">
|
|
{customer.displayName} · {customer.email}
|
|
</p>
|
|
|
|
<div className="mt-10">
|
|
<OrderHistory customer={customer} />
|
|
</div>
|
|
</main>
|
|
|
|
<Footer storeName="Shop" copyright="© 2026 Shop. All rights reserved." />
|
|
</>
|
|
);
|
|
}
|