import React, { useState, useEffect } from 'react' import { useAuth } from './auth/AuthContext' import LoadingError from './LoadingError' import './Wishlist.css' const API_URL = '/api/wishlist' function Wishlist({ onNavigate, refreshTrigger = 0 }) { const { authFetch } = useAuth() const [items, setItems] = useState([]) const [completed, setCompleted] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [completedExpanded, setCompletedExpanded] = useState(false) const [completedLoading, setCompletedLoading] = useState(false) const [selectedItem, setSelectedItem] = useState(null) useEffect(() => { fetchWishlist() }, []) // Обновляем данные при изменении refreshTrigger useEffect(() => { if (refreshTrigger > 0) { fetchWishlist() // Если завершённые развёрнуты, обновляем и их if (completedExpanded) { fetchWishlist(true) } } }, [refreshTrigger]) const fetchWishlist = async (includeCompleted = false) => { try { if (includeCompleted) { setCompletedLoading(true) } else { setLoading(true) } const url = includeCompleted ? `${API_URL}?include_completed=true` : API_URL const response = await authFetch(url) if (!response.ok) { throw new Error('Ошибка при загрузке желаний') } const data = await response.json() // Объединяем разблокированные и заблокированные в один список const allItems = [...(data.unlocked || []), ...(data.locked || [])] setItems(allItems) if (includeCompleted) { setCompleted(data.completed || []) } setError('') } catch (err) { setError(err.message) setItems([]) if (includeCompleted) { setCompleted([]) } } finally { setLoading(false) setCompletedLoading(false) } } const handleToggleCompleted = () => { const newExpanded = !completedExpanded setCompletedExpanded(newExpanded) if (newExpanded && completed.length === 0) { fetchWishlist(true) } } const handleAddClick = () => { onNavigate?.('wishlist-form', { wishlistId: undefined }) } const handleItemClick = (item) => { onNavigate?.('wishlist-detail', { wishlistId: item.id }) } const handleMenuClick = (item, e) => { e.stopPropagation() setSelectedItem(item) } const handleEdit = () => { if (selectedItem) { onNavigate?.('wishlist-form', { wishlistId: selectedItem.id }) setSelectedItem(null) } } const handleDelete = async () => { if (!selectedItem) return try { const response = await authFetch(`${API_URL}/${selectedItem.id}`, { method: 'DELETE', }) if (!response.ok) { throw new Error('Ошибка при удалении') } setSelectedItem(null) await fetchWishlist(completedExpanded) } catch (err) { setError(err.message) setSelectedItem(null) } } const handleComplete = async () => { if (!selectedItem) return try { const response = await authFetch(`${API_URL}/${selectedItem.id}/complete`, { method: 'POST', }) if (!response.ok) { throw new Error('Ошибка при завершении') } setSelectedItem(null) await fetchWishlist(completedExpanded) } catch (err) { setError(err.message) setSelectedItem(null) } } const formatPrice = (price) => { return new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(price) } const renderUnlockCondition = (item) => { if (item.unlocked || item.completed) return null if (!item.first_locked_condition) return null const condition = item.first_locked_condition const moreCount = item.more_locked_conditions || 0 let conditionText = '' if (condition.type === 'task_completion') { conditionText = condition.task_name || 'Задача' } else { const points = condition.required_points || 0 const project = condition.project_name || 'Проект' let period = '' if (condition.period_type) { const periodLabels = { week: 'за неделю', month: 'за месяц', year: 'за год', } period = ' ' + periodLabels[condition.period_type] || '' } conditionText = `${points} в ${project}${period}` } return (
{conditionText}
{item.price && (
{formatPrice(item.price)}
)}
) } const renderItem = (item) => { const isFaded = (!item.unlocked && !item.completed) || item.completed return (
handleItemClick(item)} >
{item.image_url ? ( {item.name} ) : (
)}
{item.name}
{isFaded && !item.completed ? ( renderUnlockCondition(item) ) : ( item.price &&
{formatPrice(item.price)}
)}
) } if (loading) { return (
Загрузка...
) } if (error) { return (
fetchWishlist()} />
) } return (
{/* Кнопка добавления */} {/* Основной список (разблокированные и заблокированные вместе) */} {items.length > 0 && (
{items.map(renderItem)}
)} {/* Завершённые */}
{completedExpanded && ( <> {completedLoading ? (
) : (
{completed.map(renderItem)}
)} )} {/* Модальное окно для действий */} {selectedItem && (
setSelectedItem(null)}>
e.stopPropagation()}>

{selectedItem.name}

{!selectedItem.completed && selectedItem.unlocked && ( )}
)}
) } export default Wishlist