dressed_for_succes_store/frontend old/components/AddToCartButton.tsx
2025-03-11 22:42:30 +07:00

92 lines
3.0 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 { useState } from 'react';
import { useRouter } from 'next/router';
import { ShoppingCart, Check, AlertCircle } from 'lucide-react';
import cartService from '../services/cart';
import authService from '../services/auth';
interface AddToCartButtonProps {
variantId: number;
quantity?: number;
className?: string;
onAddToCart?: () => void;
}
export default function AddToCartButton({ variantId, quantity = 1, className = '', onAddToCart }: AddToCartButtonProps) {
const router = useRouter();
const [loading, setLoading] = useState(false);
const [success, setSuccess] = useState(false);
const [error, setError] = useState<string | null>(null);
const handleAddToCart = async () => {
// Проверяем, авторизован ли пользователь
if (!authService.isAuthenticated()) {
// Сохраняем текущий URL для редиректа после авторизации
const currentPath = router.asPath;
router.push(`/login?redirect=${encodeURIComponent(currentPath)}`);
return;
}
setLoading(true);
setError(null);
try {
await cartService.addToCart({
variant_id: variantId,
quantity: quantity
});
setSuccess(true);
// Вызываем колбэк, если он передан
if (onAddToCart) {
onAddToCart();
}
// Сбрасываем состояние успеха через 2 секунды
setTimeout(() => {
setSuccess(false);
}, 2000);
} catch (err) {
console.error('Ошибка при добавлении в корзину:', err);
setError('Не удалось добавить товар в корзину');
// Сбрасываем состояние ошибки через 3 секунды
setTimeout(() => {
setError(null);
}, 3000);
} finally {
setLoading(false);
}
};
return (
<div className="relative">
<button
onClick={handleAddToCart}
disabled={loading || variantId === 0}
className={`flex items-center justify-center px-6 py-3 bg-black text-white rounded-md hover:bg-gray-800 transition-colors ${loading ? 'opacity-70 cursor-not-allowed' : ''} ${variantId === 0 ? 'opacity-50 cursor-not-allowed' : ''} ${className}`}
>
{loading ? (
<div className="animate-spin rounded-full h-5 w-5 border-t-2 border-b-2 border-white"></div>
) : success ? (
<>
<Check className="w-5 h-5 mr-2" />
Добавлено
</>
) : (
<>
<ShoppingCart className="w-5 h-5 mr-2" />
{variantId === 0 ? 'Нет в наличии' : 'В корзину'}
</>
)}
</button>
{error && (
<div className="absolute top-full left-0 right-0 mt-2 bg-red-100 text-red-700 p-2 rounded-md text-sm flex items-center">
<AlertCircle className="w-4 h-4 mr-1 flex-shrink-0" />
<span>{error}</span>
</div>
)}
</div>
);
}