Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"@heroicons/react": "^2.2.0",
"@microsoft/fetch-event-source": "^2.0.1",
"@next/third-parties": "^15.3.0",
"@pharmatech/sdk": "^0.4.20",
"@pharmatech/sdk": "^0.4.21",
"@radix-ui/react-slider": "^1.2.4",
"@react-google-maps/api": "^2.20.6",
"@types/google.maps": "^3.58.1",
Expand Down
51 changes: 5 additions & 46 deletions src/app/(shop)/user/order/[id]/detail/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,67 +4,26 @@ import { useParams } from 'next/navigation';
import { useEffect, useState } from 'react';
import UserOrderDetail from '@/components/User/Order/UserOrderDetail';
import { api } from '@/lib/sdkConfig';
import { OrderResponse, OrderDetailResponse } from '@pharmatech/sdk';
import { OrderDetailedResponse } from '@pharmatech/sdk';
import { useAuth } from '@/context/AuthContext';
import Loading from '@/app/loading';

interface OrderDetailData {
orderNumber: string;
products: OrderDetailResponse[];
subtotal: number;
discount: number;
tax: number;
total: number;
}

// Extends de OrderRespons para incluir detalles
type ExtendedOrderResponse = OrderResponse & {
details: OrderDetailResponse[];
};

export default function OrderDetailPage() {
const params = useParams();
const { token } = useAuth();
const id = Array.isArray(params?.id) ? params.id[0] : (params?.id ?? '');
const [orderData, setOrderData] = useState<OrderDetailData | null>(null);
const [orderData, setOrderData] = useState<OrderDetailedResponse>();
const [loading, setLoading] = useState(true);

useEffect(() => {
const fetchOrder = async () => {
if (!id || !token) return;

try {
const order: ExtendedOrderResponse = await api.order.getById(id, token);

const products: OrderDetailResponse[] = order.details;

const subtotal = products.reduce((sum, item) => sum + item.subtotal, 0);

const discount = products.reduce((acc, item) => {
const promo = item.productPresentation.promo;
if (promo) {
const originalPrice =
item.productPresentation.price * item.quantity;
const itemDiscount = originalPrice - item.subtotal;
return acc + itemDiscount;
}
return acc;
}, 0);

const tax = 0;
const total = order.totalPrice;

setOrderData({
orderNumber: order.id,
products,
subtotal,
discount,
tax,
total,
});
const order = await api.order.getById(id, token);
setOrderData(order);
} catch (error) {
console.error('Error al obtener detalles del pedido:', error);
setOrderData(null);
} finally {
setLoading(false);
}
Expand All @@ -78,7 +37,7 @@ export default function OrderDetailPage() {
{loading ? (
<Loading />
) : orderData ? (
<UserOrderDetail {...orderData} />
<UserOrderDetail order={orderData} />
) : (
<div className="mt-10 text-center text-gray-600">
Pedido no encontrado.
Expand Down
10 changes: 5 additions & 5 deletions src/components/Order/ProductOrderSummary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@
// Compute items, subtotal and discounts
const { items, subtotal, itemDiscount, total } = useMemo(() => {
const items = order.details.map((detail) => {
const price = detail.productPresentation.price;
const price = detail.price;
const qty = detail.quantity;
const promo = detail.productPresentation.promo?.discount || 0;
const promo = detail.discount || 0;
const discountedUnit = promo > 0 ? price * (1 - promo / 100) : price;
const lineSubtotal = discountedUnit * qty;
const lineSubtotal = detail.subtotal;
const lineDiscount = promo > 0 ? (price - discountedUnit) * qty : 0;
return {
detail,
Expand All @@ -31,11 +31,11 @@
});

const subtotal = items.reduce((sum, i) => sum + i.price * i.qty, 0);
const itemDiscount = items.reduce((sum, i) => sum + i.lineDiscount, 0);
const total = subtotal - itemDiscount;
const total = order.totalPrice;
const itemDiscount = subtotal - total;

return { items, subtotal, itemDiscount, total };
}, [order.details]);

Check warning on line 38 in src/components/Order/ProductOrderSummary.tsx

View workflow job for this annotation

GitHub Actions / ci

React Hook useMemo has a missing dependency: 'order.totalPrice'. Either include it or remove the dependency array

return (
<aside className="w-full max-w-[412px] space-y-6 p-6 font-['Poppins']">
Expand Down
85 changes: 30 additions & 55 deletions src/components/User/Order/UserOrderDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,56 +5,31 @@ import Link from 'next/link';
import { StarIcon } from '@heroicons/react/24/outline';
import CheckButton from '@/components/CheckButton';
import {
OrderDetailResponse,
OrderDetailProductPresentationResponse,
OrderDetailedResponse,
} from '@pharmatech/sdk';
import Button from '@/components/Button';
import { formatPrice } from '@/lib/utils/helpers/priceFormatter';

interface OrderDetailProps {
orderNumber: string;
products: OrderDetailResponse[];
subtotal: number;
total: number;
}

export default function UserOrderDetail({
orderNumber,
products,
subtotal,
total,
}: OrderDetailProps) {
const now = new Date();

const totalDiscount = products.reduce((acc, item) => {
const presentation: OrderDetailProductPresentationResponse =
item.productPresentation;
const promo = presentation.promo;
const basePrice = presentation.price;
const quantity = item.quantity;

const isPromoActive =
promo &&
new Date(promo.startAt) <= now &&
now < new Date(promo.expiredAt);

if (isPromoActive) {
const discountedPrice = basePrice * (1 - promo.discount / 100);
const discountAmount = (basePrice - discountedPrice) * quantity;
return acc + discountAmount;
}

return acc;
}, 0);
order,
}: {
order: OrderDetailedResponse;
}) {
const subtotal = order.details.reduce(
(acc, item) => acc + item.price * item.quantity,
0,
);
const totalDiscount = subtotal - order.totalPrice;

return (
<div className="mx-auto w-full max-w-[942px] bg-white px-2 py-6 sm:px-6">
{/* Header */}
<div className="space-around mb-4 flex items-center justify-between">
<h2 className="font-medium text-gray-500">
Pedido #{orderNumber.slice(0, 8)}
Pedido #{order.id.slice(0, 8)}
</h2>
<Link href={`/order/${orderNumber}`}>
<Link href={`/order/${order.id}`}>
<Button
className="rounded-md px-4 py-2 text-sm font-medium text-[#1C2143]"
width="auto"
Expand All @@ -69,18 +44,12 @@ export default function UserOrderDetail({

{/* Order Summary*/}
<div className="max-h-[460px] space-y-6 overflow-y-auto [-ms-overflow-style:none] [scrollbar-width:none] sm:max-h-none sm:overflow-visible [&::-webkit-scrollbar]:hidden">
{products.map((item, idx) => {
{order.details.map((item, idx) => {
const presentation: OrderDetailProductPresentationResponse =
item.productPresentation;
const product = presentation.product;
const basePrice = presentation.price;
const basePrice = item.price;
const quantity = item.quantity;
const promo = presentation.promo;

const discountedPrice = promo
? basePrice * (1 - promo.discount / 100)
: basePrice;

return (
<div
key={`${presentation.id}-${idx}`}
Expand Down Expand Up @@ -115,11 +84,13 @@ export default function UserOrderDetail({

<div className="mt-1 flex items-center justify-between">
<div className="flex flex-col">
<span className="text-xs text-gray-400 line-through">
${formatPrice(basePrice * quantity)}
</span>
{item.discount > 0 && (
<span className="text-xs text-gray-400 line-through">
${formatPrice(basePrice * quantity)}
</span>
)}
<span className="text-sm font-medium text-gray-900">
${formatPrice(discountedPrice * quantity)}
${formatPrice(item.subtotal)}
</span>
</div>
</div>
Expand Down Expand Up @@ -185,10 +156,12 @@ export default function UserOrderDetail({
<div className="flex items-center gap-10">
<div className="text-sm text-gray-500">{quantity}</div>
<div className="flex w-28 flex-col items-end text-right font-medium text-gray-900">
<span className="text-xs text-gray-400 line-through">
${formatPrice(basePrice * quantity)}
</span>
<span>${formatPrice(discountedPrice * quantity)}</span>
{item.discount > 0 && (
<span className="text-xs text-gray-400 line-through">
${formatPrice(basePrice * quantity)}
</span>
)}
<span>${formatPrice(item.subtotal)}</span>
</div>
</div>
</div>
Expand All @@ -204,7 +177,7 @@ export default function UserOrderDetail({
<div className="text-gray-700">
Subtotal{' '}
<span className="text-gray-500">
({products.length} productos)
({order.details.length} productos)
</span>
</div>
<div className="text-gray-700">${formatPrice(subtotal)}</div>
Expand All @@ -219,7 +192,9 @@ export default function UserOrderDetail({

<div className="flex items-center justify-between font-medium">
<div className="text-gray-900">TOTAL</div>
<div className="text-gray-900">${formatPrice(total)}</div>
<div className="text-gray-900">
${formatPrice(order.totalPrice)}
</div>
</div>

<div className="text-right text-xs text-gray-500">
Expand Down
Loading