'use client' import { useTariffsData } from '@/app/hooks/react-query/useTariffsData'; import { useEffect, useState } from 'react'; import { convertBytes } from '@/app/lib/convertBytes'; import { IconDoubleArrowRight, IconArrowRight, IconDoubleArrowLeft, IconArrowLeft } from '@/app/ui/icons/icons'; import ModalWindow from '@/app/components/modalWindow'; import { useQueryClient } from '@tanstack/react-query'; import { EditingTariff, TariffEditModal } from './TariffEditModal'; import { TariffCreateModal } from './TariffCreateModal'; import { TariffDeleteModal } from './TariffDeleteModal'; export default function TariffManagment() { const [currentPage, setCurrentPage] = useState(0); const [isModalOpen, setIsModalOpen] = useState(false); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [editingTariff, setEditingTariff] = useState(null); const [deletingTariff, setDeletingTariff] = useState<{ id: number; name: string } | null>(null); const { data: tariffData, isLoading, isError, isFetching, error } = useTariffsData(currentPage); const queryClient = useQueryClient(); useEffect(() => { console.log(tariffData); }, [tariffData]) useEffect(() => { if (tariffData && tariffData.page !== currentPage) { setCurrentPage(tariffData.page); } }, [tariffData, currentPage]); const handlePageChange = (newPage: number) => { if (tariffData && newPage >= 0 && newPage < tariffData.total_pages) { setCurrentPage(newPage); } }; const handleEditClick = (tariff: any) => { setEditingTariff({ id: tariff.id, name: tariff.name, type: tariff.type, price: tariff.price, tokens: tariff.tokens, maxFilesCount: tariff.maxFilesCount, diskSize: tariff.diskSize, maxUsers: tariff.maxUsers, description: tariff.description, tariffTerm: tariff.tariffTerm }); setIsModalOpen(true); }; const handleDeleteClick = (tariff: any) => { setDeletingTariff({ id: tariff.id, name: tariff.name || tariff.type }); setIsDeleteModalOpen(true); }; const formatPrice = (price: number) => { return new Intl.NumberFormat('ru-RU').format(price); }; const getDisplayName = (tariff: any) => { if (tariff.name) { return tariff.name.toUpperCase().replace(/_/g, ' '); } return tariff.type.replace(/_/g, ' '); }; if (isLoading) { return (

Управление тарифными планами

Загрузка тарифов...
); } if (isError) { return (

Управление тарифными планами

Ошибка загрузки тарифов: {error?.message || 'Неизвестная ошибка'}
); } return (

Управление тарифными планами

{tariffData?.tariffs?.map((tariff) => (
{getDisplayName(tariff)} {tariff.tariffTerm && ( {tariff.tariffTerm} )}
₽{formatPrice(tariff.price)}
{tariff.tokens > 0 && `${tariff.tokens.toLocaleString()} токенов`} {tariff.diskSize > 0 && ` • ${convertBytes(tariff.diskSize)}`} {tariff.maxFilesCount > 0 && ` • ${tariff.maxFilesCount} файлов`}
{tariff.description && (
{tariff.description}
)}
))}
{/* Пагинация */} {tariffData && tariffData.total_pages > 0 && (
Страница{' '} {currentPage + 1} из {tariffData.total_pages} | Показано {tariffData.tariffs?.length || 0} из {tariffData.total_elements}
{(() => { const totalPages = tariffData.total_pages; if (!totalPages || totalPages === 0) return null; const maxVisiblePages = 5; const visiblePagesCount = Math.min(maxVisiblePages, totalPages); let startPage = currentPage - Math.floor(maxVisiblePages / 2); startPage = Math.max(0, Math.min(startPage, totalPages - visiblePagesCount)); return Array.from({ length: visiblePagesCount }, (_, i) => { const pageIndex = startPage + i; return ( ); }); })()}
)}
{/* Модальное окно редактирования тарифа */} {editingTariff && ( setIsModalOpen(false)} onSuccess={() => { queryClient.invalidateQueries({ queryKey: ['tariffsData'] }); setIsModalOpen(false); }} /> )} {/* Модальное окно создания тарифа */} setIsCreateModalOpen(false)} onSuccess={() => { queryClient.invalidateQueries({ queryKey: ['tariffsData'] }); setIsCreateModalOpen(false); }} /> {/* Модальное окно удаления тарифа */} {deletingTariff && ( setIsDeleteModalOpen(false)} onSuccess={() => { queryClient.invalidateQueries({ queryKey: ['tariffsData'] }); setIsDeleteModalOpen(false); setDeletingTariff(null); }} /> )}
) }