Files
protekauto-frontend/src/pages/payment/success.tsx

220 lines
7.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useEffect, useState } from "react";
import Footer from "@/components/Footer";
import { useRouter } from "next/router";
import { useMutation, ApolloProvider } from "@apollo/client";
import { gql } from "@apollo/client";
import { apolloClient } from "@/lib/apollo";
import toast from "react-hot-toast";
import MetaTags from "../../components/MetaTags";
import { getMetaByPath } from "../../lib/meta-config";
const CONFIRM_PAYMENT = gql`
mutation ConfirmPayment($orderId: ID!) {
confirmPayment(orderId: $orderId) {
id
orderNumber
status
}
}
`;
function PaymentSuccessContent() {
const router = useRouter();
const [paymentId, setPaymentId] = useState<string | null>(null);
const [orderId, setOrderId] = useState<string | null>(null);
const [confirmPayment] = useMutation(CONFIRM_PAYMENT);
useEffect(() => {
// Получаем параметры из URL
const { payment_id, orderId, orderNumber } = router.query;
if (payment_id) {
setPaymentId(payment_id as string);
}
if (orderId) {
setOrderId(orderId as string);
// Проверяем авторизацию перед обновлением статуса
const userData = localStorage.getItem('userData');
console.log('PaymentSuccess: userData из localStorage:', userData);
if (!userData) {
console.log('PaymentSuccess: пользователь не авторизован, пропускаем обновление статуса');
return;
}
// Автоматически подтверждаем оплату заказа
console.log('PaymentSuccess: подтверждаем оплату заказа', orderId);
confirmPayment({
variables: {
orderId: orderId as string
}
}).then(() => {
console.log('Оплата заказа подтверждена');
toast.success('Оплата успешно подтверждена!', {
duration: 3000,
icon: '✅',
});
}).catch((error: any) => {
console.error('Ошибка подтверждения оплаты:', error);
toast.error('Ошибка подтверждения оплаты: ' + error.message, {
duration: 5000,
});
});
}
}, [router.query, confirmPayment]);
const handleContinueShopping = () => {
router.push('/catalog');
};
const handleViewOrders = () => {
router.push('/profile-orders');
};
return (
<>
<div className="w-layout-blockcontainer container info w-container">
<div className="w-layout-vflex flex-block-9">
<div className="w-layout-hflex flex-block-7">
<a href="/" className="link-block w-inline-block">
<div>Главная</div>
</a>
<div className="text-block-3"></div>
<div className="text-block-3">Оплата завершена</div>
</div>
</div>
</div>
<section className="main">
<div className="w-layout-blockcontainer container w-container">
<div className="w-layout-vflex" style={{ alignItems: 'center', textAlign: 'center', padding: '4rem 0' }}>
{/* Иконка успеха */}
<div style={{
width: 80,
height: 80,
borderRadius: '50%',
backgroundColor: '#10B981',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
marginBottom: '2rem'
}}>
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 12L11 14L15 10M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z"
stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
</svg>
</div>
{/* Заголовок */}
<h1 className="heading" style={{ marginBottom: '1rem', color: '#10B981' }}>
Оплата прошла успешно!
</h1>
{/* Описание */}
<div className="text-block-4" style={{ marginBottom: '2rem', maxWidth: 600 }}>
Спасибо за ваш заказ! Оплата была успешно обработана.
Мы отправили подтверждение на вашу электронную почту.
</div>
{/* Информация о заказе */}
{(paymentId || orderId) && (
<div style={{
backgroundColor: '#F9FAFB',
border: '1px solid #E5E7EB',
borderRadius: 8,
padding: '1.5rem',
marginBottom: '2rem',
maxWidth: 400,
width: '100%'
}}>
<h3 style={{ margin: '0 0 1rem 0', fontSize: '1.1rem', fontWeight: 600 }}>
Детали платежа
</h3>
{orderId && (
<div style={{ marginBottom: '0.5rem' }}>
<strong>Номер заказа:</strong> {orderId}
</div>
)}
{paymentId && (
<div>
<strong>ID платежа:</strong> {paymentId}
</div>
)}
</div>
)}
{/* Кнопки действий */}
<div className="w-layout-hflex" style={{ gap: '1rem', flexWrap: 'wrap', justifyContent: 'center' }}>
<button
className="submit-button fill w-button"
onClick={handleViewOrders}
style={{ minWidth: 200 }}
>
Мои заказы
</button>
<button
className="submit-button w-button"
onClick={handleContinueShopping}
style={{
minWidth: 200,
backgroundColor: 'transparent',
border: '2px solid var(--_button---primary)',
color: 'var(--_button---primary)'
}}
>
Продолжить покупки
</button>
</div>
{/* Дополнительная информация */}
<div style={{
marginTop: '3rem',
padding: '1.5rem',
backgroundColor: '#FEF3C7',
border: '1px solid #F59E0B',
borderRadius: 8,
maxWidth: 600,
width: '100%'
}}>
<h4 style={{ margin: '0 0 1rem 0', color: '#92400E' }}>
Что дальше?
</h4>
<ul style={{ margin: 0, paddingLeft: '1.5rem', color: '#92400E' }}>
<li>Мы обработаем ваш заказ в течение 1-2 рабочих дней</li>
<li>Вы получите уведомление о статусе заказа на email</li>
<li>Отслеживать заказ можно в разделе "Мои заказы"</li>
<li>При вопросах обращайтесь в службу поддержки</li>
</ul>
</div>
</div>
</div>
</section>
<Footer />
</>
);
}
export default function PaymentSuccess() {
const metaConfig = getMetaByPath('/payment/success');
return (
<>
<MetaTags
title={metaConfig.title}
description={metaConfig.description}
keywords={metaConfig.keywords}
ogTitle={metaConfig.ogTitle}
ogDescription={metaConfig.ogDescription}
/>
<ApolloProvider client={apolloClient}>
<PaymentSuccessContent />
</ApolloProvider>
</>
);
}