'use client' import { useGetReferralPayments } from '@/app/hooks/react-query/useGetReferralPayments'; import { useEffect, useState, useMemo } from 'react'; import { useReactTable, getCoreRowModel, getSortedRowModel, getPaginationRowModel, getFilteredRowModel, ColumnDef, SortingState, ColumnFiltersState } from '@tanstack/react-table'; import { IconDoubleArrowRight, IconArrowRight, IconDoubleArrowLeft, IconArrowLeft, IconArrowUp, IconArrowDown, IconFilter } from '@/app/ui/icons/icons'; import { useTranslations, useLocale } from 'next-intl'; import DropDownList from '@/app/components/DropDownList'; import { pluralize } from '@/app/lib/pluralize'; import { ReferralPayments } from '@/app/hooks/react-query/useGetReferralPayments'; import { formatDate } from '@/app/lib/formatDate'; export default function PaymentsHistory() { const { data: paymentsData, isLoading, isError, error, } = useGetReferralPayments(); // Состояния const [sorting, setSorting] = useState([]); const [columnFilters, setColumnFilters] = useState([]); const [dateFilter, setDateFilter] = useState('all'); const [statusFilter, setStatusFilter] = useState('all'); const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10, }); const t = useTranslations("Global"); const locale = useLocale(); // Определение колонок const columns = useMemo[]>( () => [ { accessorKey: 'amount', header: ({ column }) => (
{t('amount')}
), cell: ({ row }) => (
{row.original.amount ?? '-'}
), }, { accessorKey: 'method', header: ({ column }) => (
{t('method')}
), cell: ({ row }) => (
{/* {row.original.size !== undefined ? convertBytes(row.original.size) : '-'} */} {/* {row.original.email} */} ---
), }, { accessorKey: 'status', header: ({ column }) => (
{t('status')}
), cell: ({ row }) => { return (
{row.original.status}
) }, }, { accessorKey: 'request-date', header: ({ column }) => (
{t('request-date')}
), cell: ({ row }) => { return (
{formatDate(row.original.createdAt) ? formatDate(row.original.createdAt) : '---'}
) }, enableColumnFilter: false, }, { accessorKey: 'processed', header: ({ column }) => (
{t('processed')}
), cell: ({ row }) => { return (
{row.original.updatedAt ? formatDate(row.original.updatedAt) : '---'}
) }, enableColumnFilter: false, } ], [] ); // Фильтрация по типу файла и дате const filteredData = useMemo(() => { let result = paymentsData?.payments; if (!result) { return []; } // Фильтр по типу файла if (statusFilter !== 'all') { result = result.filter(item => item.status === statusFilter); } // Фильтр по дате /* if (dateFilter !== 'all') { const now = Date.now(); const oneDay = 24 * 60 * 60 * 1000; const sevenDays = 7 * oneDay; const thirtyDays = 30 * oneDay; switch (dateFilter) { case 'today': const todayStart = new Date().setHours(0, 0, 0, 0); result = result.filter(item => { if (item.registrationData) { return item.registrationData >= todayStart } else { return 0 } }); break; case 'week': const weekAgo = now - sevenDays; result = result.filter(item => { if (item.registrationData) { return item.registrationData >= weekAgo; } }); break; case 'month': const monthAgo = now - thirtyDays; result = result.filter(item => { if (item.registrationData) { return item.registrationData >= monthAgo; } }); break; case 'older': const monthAgo2 = now - thirtyDays; result = result.filter(item => { if (item.registrationData) { return item.registrationData < monthAgo2; } }); break; } } */ return result; }, [paymentsData, statusFilter, dateFilter]); useEffect(() => { const currentPageRows = table.getRowModel().rows; const pageCount = table.getPageCount(); if (currentPageRows.length === 0 && pagination.pageIndex > 0 && pageCount > 0) { table.setPageIndex(pagination.pageIndex - 1); } }, [filteredData, pagination.pageIndex]); // Создание таблицы const table = useReactTable({ data: filteredData, columns, state: { sorting, columnFilters, pagination }, autoResetPageIndex: false, onPaginationChange: setPagination, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), getFilteredRowModel: getFilteredRowModel(), initialState: { pagination: { pageSize: 10, }, }, }); const pluralizeFiles = (number: number) => { const translate = [t('file'), t('files-few'), t('files')]; return pluralize(number, translate[0], translate[1], translate[2], locale); }; return (

{t('payment-history')}

{/* Фильтры */}
{t('date-filter')}:
{ switch (dateFilter) { case 'all': return t('all-dates') case 'week': return t('for-a-week') case 'month': return t('for-a-month') case 'older': return t('older-than-a-month') default: return t('today') } })()} callBack={setDateFilter} >
  • {t('all-dates')}
  • {t('today')}
  • {t('for-a-week')}
  • {t('for-a-month')}
  • {t('older-than-a-month')}
  • {t('items-per-page')}:
    {[5, 10, 20, 50, 100].map(pageSize => (
  • {t('show')} {pageSize}
  • ))}
    {/* Таблица */}
    {table.getHeaderGroups().map(headerGroup => ( {headerGroup.headers.map(header => ( ))} ))} {table.getRowModel().rows.length > 0 ? ( table.getRowModel().rows.map(row => ( {row.getVisibleCells().map(cell => ( ))} )) ) : ( )}
    {header.isPlaceholder ? null : typeof header.column.columnDef.header === 'function' ? header.column.columnDef.header(header.getContext()) : header.column.columnDef.header as string}
    {typeof cell.column.columnDef.cell === 'function' ? cell.column.columnDef.cell(cell.getContext()) : cell.getValue() as string}
    {t('no-data-for-selected-filters')}
    {/* Пагинация */}
    {/* {t('page')}{' '} {table.getState().pagination.pageIndex + 1} {t('out-of')} {table.getPageCount() ? table.getPageCount() : 1} | {t('shown')} {table.getRowModel().rows.length} {t('out-of')} {filteredData.length} {pluralizeFiles(filteredData.length || 0)} */}
    {table.getCanPreviousPage() && ( )} {table.getCanPreviousPage() && ( )}
    {Array.from({ length: Math.min(5, table.getPageCount()) }, (_, i) => { const pageIndex = Math.max( 0, Math.min( table.getPageCount() - 5, table.getState().pagination.pageIndex - 2 ) ) + i; if (pageIndex < table.getPageCount()) { return ( ); } return null; })}
    {table.getCanNextPage() && ( )} {table.getCanNextPage() && ( )}
    ); }