fix: order layout

This commit is contained in:
paolosantarsiero 2025-01-15 16:29:46 +01:00
parent a16571aca0
commit 177ab89884
8 changed files with 67 additions and 65 deletions

View File

@ -1,16 +0,0 @@
import { ThreeItemGridItem } from 'components/grid/three-items';
import { Product } from 'lib/woocomerce/models/product';
import { woocommerce } from 'lib/woocomerce/woocommerce';
export default async function ProductPage(props: { params: Promise<{ name: string }> }) {
const params = await props.params;
const products: Product[] = await woocommerce.get('products', { category: params.name });
return (
<section className="mx-auto grid max-w-screen-2xl gap-4 px-4 pb-4 md:grid-cols-6 md:grid-rows-2 lg:max-h-[calc(100vh-200px)]">
{products.map((product, index) => (
<ThreeItemGridItem key={product.id} size={index === 0 ? 'full' : 'half'} item={product} />
))}
</section>
);
}

View File

@ -0,0 +1,25 @@
import { ProductCard } from 'components/product/product-card';
import { Product } from 'lib/woocomerce/models/product';
import { woocommerce } from 'lib/woocomerce/woocommerce';
export default async function ProductPage(props: { params: Promise<{ slug: string }> }) {
const slug = (await props.params).slug;
const category = (await woocommerce.get('products/categories', { slug }))?.[0];
const products: Product[] = await woocommerce.get('products', { category: category.id.toString() });
return (
<div>
<div className="mb-2 mt-6 flex items-center justify-between px-4">
<span className="text-2xl font-bold">{category.name}</span>
</div>
<div className="mb-6 px-4">
<span>{category.description}</span>
</div>
<section className="mx-auto grid max-w-screen-2xl flex-col gap-4 px-4 pb-4 md:grid-cols-8 md:grid-rows-2">
{products.map((product) => (
<ProductCard key={product.id} product={product} />
))}
</section>
</div>
);
}

View File

@ -32,9 +32,6 @@ async function ProductsByCategory() {
<div className="mb-2 mt-6 flex items-center justify-between px-4"> <div className="mb-2 mt-6 flex items-center justify-between px-4">
<span className="text-2xl font-bold">{category.name}</span> <span className="text-2xl font-bold">{category.name}</span>
</div> </div>
<div className="mb-6 px-4">
<span>{category.description}</span>
</div>
<Suspense <Suspense
fallback={ fallback={
<div className="mx-auto grid max-w-screen-2xl gap-4 px-4 pb-4 md:grid-cols-6 md:grid-rows-2"> <div className="mx-auto grid max-w-screen-2xl gap-4 px-4 pb-4 md:grid-cols-6 md:grid-rows-2">

View File

@ -8,6 +8,7 @@ import { ProductDescription } from 'components/product/product-description';
import { VariantSelector } from 'components/product/variant-selector'; import { VariantSelector } from 'components/product/variant-selector';
import Prose from 'components/prose'; import Prose from 'components/prose';
import { HIDDEN_PRODUCT_TAG } from 'lib/constants'; import { HIDDEN_PRODUCT_TAG } from 'lib/constants';
import { isStrinInteger } from 'lib/utils';
import { Image } from 'lib/woocomerce/models/base'; import { Image } from 'lib/woocomerce/models/base';
import { Product, ProductVariations } from 'lib/woocomerce/models/product'; import { Product, ProductVariations } from 'lib/woocomerce/models/product';
import { woocommerce } from 'lib/woocomerce/woocommerce'; import { woocommerce } from 'lib/woocomerce/woocommerce';
@ -18,9 +19,12 @@ export async function generateMetadata(props: {
params: Promise<{ name: string }>; params: Promise<{ name: string }>;
}): Promise<Metadata> { }): Promise<Metadata> {
const params = await props.params; const params = await props.params;
const product: Product | undefined = ( let product: Product | undefined = undefined;
await woocommerce.get('products', { slug: params.name }) if (isStrinInteger(params.name)) {
)?.[0]; product = await woocommerce.get(`products/${params.name}`);
} else {
product = (await woocommerce.get('products', { slug: params.name }))?.[0];
}
if (!product) return notFound(); if (!product) return notFound();
@ -79,9 +83,12 @@ async function RelatedProducts({ product }: { product: Product }) {
export default async function ProductPage(props: { params: Promise<{ name: string }> }) { export default async function ProductPage(props: { params: Promise<{ name: string }> }) {
const params = await props.params; const params = await props.params;
const product: Product | undefined = ( let product: Product | undefined = undefined;
await woocommerce.get('products', { slug: params.name }) if (isStrinInteger(params.name)) {
)?.[0]; product = await woocommerce.get(`products/${params.name}`);
} else {
product = (await woocommerce.get('products', { slug: params.name }))?.[0];
}
let variations: ProductVariations[] = []; let variations: ProductVariations[] = [];
if (product?.variations?.length) { if (product?.variations?.length) {
variations = await woocommerce.get(`products/${product?.id}/variations`); variations = await woocommerce.get(`products/${product?.id}/variations`);
@ -89,10 +96,6 @@ export default async function ProductPage(props: { params: Promise<{ name: strin
if (!product) return notFound(); if (!product) return notFound();
const relatedProducts = await Promise.all(
product.related_ids?.map(async (id) => woocommerce.get(`products/${id}`)) || []
);
const productJsonLd = { const productJsonLd = {
'@context': 'https://schema.org', '@context': 'https://schema.org',
'@type': 'Product', '@type': 'Product',

View File

@ -13,28 +13,27 @@ export default async function OrdersPage() {
<section className="mt-4 grid max-w-screen-2xl gap-4 px-4 pb-4"> <section className="mt-4 grid max-w-screen-2xl gap-4 px-4 pb-4">
<h1 className="text-2xl font-bold">Orders</h1> <h1 className="text-2xl font-bold">Orders</h1>
{orders.map((order) => ( {orders.map((order) => (
<Link href={`/profile/orders/${order.id}`} key={order.id} className="flex flex-col"> <div key={order.id} className="flex flex-col rounded border border-neutral-300 dark:border-neutral-700 p-4">
<div className="mt-4"> <div className="grid grid-cols-3 gap-6">
<label <div className="flex flex-col">
htmlFor="name" <span>ID ORDINE:</span>
className="block text-sm font-medium text-gray-700 dark:text-gray-300" <span>{order.id}</span>
> </div>
Name <div className="flex flex-col">
</label> <span>EFFETTUATO IL:</span>
<input <span>{new Date(order.date_created).toLocaleDateString()}</span>
type="text" </div>
id="name" <div className="flex flex-col">
value={order.order_key} <span>TOTALE:</span>
className="mt-1 block w-full rounded-md border-gray-300 p-3 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-lg" <span>{order.total} {order.currency}</span>
disabled </div>
/>
</div> </div>
{order.line_items.map((item, i) => ( {order.line_items.map((item, i) => (
<li <li
key={i} key={i}
className="flex w-full flex-col border-b border-neutral-300 dark:border-neutral-700" className="flex w-full flex-col"
> >
<div className="relative flex w-full flex-row justify-between px-1 py-4"> <Link href={`/product/${item.product_id}`} className="flex w-full flex-row justify-between px-1 py-4">
<div className="flex flex-row"> <div className="flex flex-row">
<div className="relative h-16 w-16 overflow-hidden rounded-md border border-neutral-300 bg-neutral-300 dark:border-neutral-700 dark:bg-neutral-900 dark:hover:bg-neutral-800"> <div className="relative h-16 w-16 overflow-hidden rounded-md border border-neutral-300 bg-neutral-300 dark:border-neutral-700 dark:bg-neutral-900 dark:hover:bg-neutral-800">
<Image <Image
@ -45,7 +44,7 @@ export default async function OrdersPage() {
src={item.image?.src || ''} src={item.image?.src || ''}
/> />
</div> </div>
<div className="flex flex-1 flex-col text-base"> <div className="flex flex-1 flex-col ms-4 text-base hover:underline">
<span className="leading-tight">{item.name}</span> <span className="leading-tight">{item.name}</span>
</div> </div>
</div> </div>
@ -56,25 +55,13 @@ export default async function OrdersPage() {
currencyCode={order.currency} currencyCode={order.currency}
/> />
</div> </div>
</div> </Link>
</li> </li>
))} ))}
<div className="mt-4"> <div className="flex flex-row-reverse mt-4">
<label <Link href={`/profile/orders/${order.id}`} className="hover:text-indigo-500">Vedi dettagli</Link>
htmlFor="total"
className="block text-sm font-medium text-gray-700 dark:text-gray-300"
>
Total
</label>
<input
type="text"
id="total"
value={order.total}
className="mt-1 block w-full rounded-md border-gray-300 p-3 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-lg"
disabled
/>
</div> </div>
</Link> </div>
))} ))}
</section> </section>
); );

View File

@ -26,7 +26,7 @@ export default async function Footer() {
}, },
...categories.map((category) => ({ ...categories.map((category) => ({
title: category.name, title: category.name,
path: path.join('/collection', category.id.toString()) path: path.join('/collection', category.slug.toString())
})) }))
] as Menu[]; ] as Menu[];
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();

View File

@ -25,7 +25,7 @@ export async function Navbar() {
}, },
...categories.map((category) => ({ ...categories.map((category) => ({
title: category.name, title: category.name,
path: path.join('/collection', category.id.toString()) path: path.join('/collection', category.slug)
})) }))
] as Menu[]; ] as Menu[];

View File

@ -16,3 +16,9 @@ export const getCountries = (): { name: string; icon: string }[] =>
name: country, name: country,
icon: flag_base64 icon: flag_base64
})); }));
export const isStrinInteger = (value: string) => {
const parsed = parseInt(value, 10);
return !isNaN(parsed) && parsed.toString() === value.trim();
}