diff --git a/frontend/app/(main)/page.tsx b/frontend/app/(main)/page.tsx
index 4ab7e4e..d082c0d 100644
--- a/frontend/app/(main)/page.tsx
+++ b/frontend/app/(main)/page.tsx
@@ -49,7 +49,7 @@ export default function HomePage() {
id: 2,
name: "Chik & Active",
description: "Комфортные комплекты для активного отдыха, спорта и расслабленных выходных.",
- image: "/placeholder.svg?height=800&width=600",
+ image: "/images/home/drops/DFS_chik&active.svg",
status: "Скоро",
isAvailable: false,
},
@@ -57,7 +57,7 @@ export default function HomePage() {
id: 3,
name: "Home & Sleep",
description: "Уютные вещи для дома, отдыха и приятных сновидений.",
- image: "/placeholder.svg?height=800&width=600",
+ image: "/images/home/drops/DFS_home&sleep.svg",
status: "Скоро",
isAvailable: false,
},
@@ -92,7 +92,7 @@ export default function HomePage() {
}}
>
{/* Изображение коллекции */}
-
+
@@ -430,9 +431,9 @@ export default function HomePage() {
-
+ {/*
Кристина, создательница бренда
-
+ */}
@@ -487,9 +488,9 @@ export default function HomePage() {
{/* Левая колонка - Фото */}
-
+
-
+
{/* Левая колонка - Фото */}
-
+
s.value === status) ||
+ return ORDER_STATUSES.find(s => s.value === status) ||
{ value: status, label: status, color: 'bg-gray-100 text-gray-800' };
}
@@ -171,6 +171,10 @@ function formatDate(dateString?: string): string {
export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
const router = useRouter();
+ // Используем React.use() для доступа к свойствам params
+ const resolvedParams = React.use(params);
+ const orderId = resolvedParams.id;
+
const [order, setOrder] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
@@ -195,16 +199,16 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
setError(null);
try {
- const orderId = parseInt(params.id);
- if (isNaN(orderId)) {
+ const id = parseInt(orderId);
+ if (isNaN(id)) {
throw new Error('Неверный ID заказа');
}
- const response = await api.get(`/orders/${orderId}`);
-
+ const response = await api.get(`/orders/${id}`);
+
// Обработка ответа API
let orderData: Order | null = null;
-
+
if (response && typeof response === 'object') {
if ('success' in response && response.success && 'order' in response) {
// Если API вернул объект вида { success: true, order: {...} }
@@ -220,7 +224,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
orderData = response as Order;
}
}
-
+
if (orderData) {
// Адаптация полей варианта
if (orderData.items) {
@@ -232,7 +236,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
variant_color: item.color // Добавим обработку цвета, если он есть
}));
}
-
+
setOrder(orderData);
setUpdatedStatus(orderData.status || '');
setUpdatedTrackingNumber(orderData.tracking_number || '');
@@ -251,9 +255,9 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
// Обновление заказа
const updateOrder = async () => {
if (!order) return;
-
+
setIsActionLoading(true);
-
+
try {
// В реальности здесь был бы запрос к API
// const response = await api.patch(`/orders/${order.id}`, {
@@ -261,7 +265,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
// tracking_number: updatedTrackingNumber,
// notes: updatedNotes
// });
-
+
// Имитация успешного обновления
const updatedOrder = {
...order,
@@ -270,9 +274,9 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
notes: updatedNotes,
updated_at: new Date().toISOString()
};
-
+
setOrder(updatedOrder);
-
+
// Добавляем запись в историю заказа об обновлении статуса
if (updatedStatus !== order.status) {
const newHistoryItem: OrderHistoryItem = {
@@ -283,29 +287,29 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
created_at: new Date().toISOString(),
created_by: 'Администратор'
};
-
+
setOrderHistory([...orderHistory, newHistoryItem]);
}
-
+
// При обновлении отслеживания также добавляем запись в историю
if (updatedTrackingNumber && updatedTrackingNumber !== order.tracking_number) {
const trackingHistoryItem: OrderHistoryItem = {
id: Date.now() + 1, // уникальный id
order_id: order.id,
status: updatedStatus,
- comment: order.tracking_number
- ? `Номер отслеживания изменен на "${updatedTrackingNumber}"`
+ comment: order.tracking_number
+ ? `Номер отслеживания изменен на "${updatedTrackingNumber}"`
: `Добавлен номер отслеживания "${updatedTrackingNumber}"`,
created_at: new Date().toISOString(),
created_by: 'Администратор'
};
-
+
setOrderHistory([...orderHistory, trackingHistoryItem]);
}
-
+
setIsEditing(false);
toast.success('Заказ успешно обновлен');
-
+
// Если статус изменился на "Отправлен", предложить отправить письмо клиенту
if (updatedStatus === 'shipped' && order.status !== 'shipped') {
// Разместите эту функциональность в следующем релизе
@@ -329,46 +333,46 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
// Обработка объекта адреса в разных форматах
let addressLines = [];
-
+
if (address.address_line1) {
addressLines.push(address.address_line1);
}
-
+
if (address.address_line2) {
addressLines.push(address.address_line2);
}
-
+
if (address.city || address.state || address.postal_code) {
let cityLine = [address.city, address.state, address.postal_code].filter(Boolean).join(', ');
if (cityLine) addressLines.push(cityLine);
}
-
+
if (address.country) {
addressLines.push(address.country);
}
-
+
// Если нет данных адреса в стандартных полях, попробуем другие форматы
if (addressLines.length === 0) {
if (address.full_address) {
return address.full_address;
}
-
+
if (address.street) {
addressLines.push(`${address.street} ${address.house || ''} ${address.apartment ? `, кв. ${address.apartment}` : ''}`);
}
-
+
if (address.city || address.postal_code) {
addressLines.push(`${address.city || ''} ${address.postal_code || ''}`);
}
}
-
+
return addressLines.join(', ');
};
// Отправка письма клиенту со статусом заказа
const handleSendEmail = async (type: 'status' | 'invoice' | 'tracking') => {
if (!order) return;
-
+
setIsActionLoading(true);
try {
// Подготовка данных для отправки в зависимости от типа письма
@@ -376,13 +380,13 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
order_id: order.id,
email_type: type
};
-
+
// В реальном приложении вызов API для отправки письма
// const response = await api.post(`/orders/${order.id}/send-email`, emailData);
-
+
// Имитация запроса к API
await new Promise(resolve => setTimeout(resolve, 1000));
-
+
toast.success(`Письмо успешно отправлено на ${order.user_email || 'email клиента'}`);
} catch (error) {
console.error('Ошибка при отправке письма:', error);
@@ -391,11 +395,11 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
setIsActionLoading(false);
}
};
-
+
// Копирование информации о заказе в буфер обмена
const handleCopyOrderInfo = () => {
if (!order) return;
-
+
const orderInfo = `
Заказ #${order.id}
Клиент: ${order.user_name || `Пользователь #${order.user_id}`}
@@ -404,16 +408,16 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
Дата создания: ${formatDate(order.created_at)}
Общая сумма: ${formatPrice(order.total_amount)}
`;
-
+
navigator.clipboard.writeText(orderInfo)
.then(() => toast.success('Информация о заказе скопирована в буфер обмена'))
.catch(() => toast.error('Не удалось скопировать информацию'));
};
-
+
// Обновление данных заказа
const handleRefreshOrder = async () => {
if (!order) return;
-
+
setIsActionLoading(true);
try {
await loadOrder(); // Используем существующую функцию загрузки заказа
@@ -430,7 +434,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
const getOrderProgress = () => {
const statuses = ['pending', 'processing', 'shipped', 'delivered'];
const currentIndex = statuses.indexOf(order?.status || '');
-
+
if (currentIndex === -1) return 0;
return (currentIndex / (statuses.length - 1)) * 100;
};
@@ -438,11 +442,11 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
// Загрузка истории заказа
const loadOrderHistory = async () => {
if (!order) return;
-
+
try {
// В реальном приложении здесь будет запрос к API
// const response = await api.get(`/orders/${order.id}/history`);
-
+
// Имитация данных истории заказа для примера
const mockHistory: OrderHistoryItem[] = [
{
@@ -454,7 +458,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
created_by: 'Система'
}
];
-
+
// Добавляем запись об обновлении статуса, если заказ был обновлен
if (order.updated_at && order.updated_at !== order.created_at) {
mockHistory.push({
@@ -466,14 +470,14 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
created_by: 'Администратор'
});
}
-
+
setOrderHistory(mockHistory);
} catch (error) {
console.error('Ошибка при загрузке истории заказа:', error);
// Не показываем ошибку пользователю, так как это не критичная функция
}
};
-
+
// Загружаем историю при изменении заказа
useEffect(() => {
if (order) {
@@ -484,20 +488,20 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
// Использование функции в useEffect
useEffect(() => {
loadOrder();
- }, [params.id]);
+ }, [orderId]);
// Добавление комментария к истории заказа
const addComment = async () => {
if (!order || !newComment.trim()) return;
-
+
setIsCommentLoading(true);
-
+
try {
// В реальном приложении здесь будет запрос к API
// const response = await api.post(`/orders/${order.id}/history`, {
// comment: newComment,
// });
-
+
// Имитация успешного ответа
const newHistoryItem: OrderHistoryItem = {
id: Date.now(), // временный id
@@ -507,14 +511,14 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
created_at: new Date().toISOString(),
created_by: 'Администратор'
};
-
+
// Добавляем новый комментарий в историю
setOrderHistory([...orderHistory, newHistoryItem]);
-
+
// Сбрасываем форму и закрываем диалог
setNewComment('');
setCommentDialogOpen(false);
-
+
toast.success('Комментарий добавлен к истории заказа');
} catch (error) {
console.error('Ошибка при добавлении комментария:', error);
@@ -527,16 +531,16 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
// Экспорт истории заказа в PDF
const exportOrderHistory = async () => {
if (!order || orderHistory.length === 0) return;
-
+
setIsExporting(true);
-
+
try {
// В реальном приложении здесь был бы код для генерации PDF
// Например, с использованием библиотеки jsPDF или запрос к бэкенду
-
+
// Имитация экспорта для демонстрации
await new Promise(resolve => setTimeout(resolve, 1500));
-
+
toast.success('История заказа экспортирована');
} catch (error) {
console.error('Ошибка при экспорте истории заказа:', error);
@@ -549,14 +553,14 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
// Печать информации о заказе
const printOrder = () => {
if (!order) return;
-
+
// Открываем новое окно для печати
const printWindow = window.open('', '_blank');
if (!printWindow) {
toast.error('Не удалось открыть окно печати. Проверьте настройки блокировки всплывающих окон в браузере.');
return;
}
-
+
// Формируем HTML для печати
const printContent = `
@@ -587,7 +591,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
Заказ #${order.id}
${new Date().toLocaleDateString('ru-RU')}
-
+
Дата создания:
@@ -613,7 +617,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
${order.user_email}
` : ''}
-
+
Товары
@@ -660,7 +664,7 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
-
+
${order.shipping_address ? `
Адрес доставки
@@ -673,11 +677,11 @@ export default function OrderDetailsPage({ params }: OrderDetailsPageProps) {
].filter(Boolean).join(', ')}
${order.shipping_address.country || ''}
` : ''}
-
+
${order.notes ? `
Примечания
${order.notes.replace(/\n/g, '
')}
` : ''}
-
+
-
+