Added loader while loading transactions

This commit is contained in:
Umar Adilov 2025-05-14 20:21:29 +05:00
parent 64d2c12494
commit 4299f57e2d
6 changed files with 70 additions and 7 deletions

View File

@ -32,8 +32,11 @@ export function CorporateDashboard() {
page: 1, page: 1,
}); });
const { data: transactionsResponse, refetch } = const {
useFetchCorporateTransactionsQuery(request); data: transactionsResponse,
refetch,
isLoading,
} = useFetchCorporateTransactionsQuery(request);
useEffect(() => { useEffect(() => {
refetch(); refetch();
@ -160,6 +163,7 @@ export function CorporateDashboard() {
</div> </div>
<TransactionsTable <TransactionsTable
isLoading={isLoading}
data={ data={
transactionsResponse || { transactionsResponse || {
limit: 10, limit: 10,

View File

@ -33,8 +33,11 @@ export function CustomerDashboard() {
const { data, isLoading } = useFetchMyBonusInfoQuery({}); const { data, isLoading } = useFetchMyBonusInfoQuery({});
const { data: transactionsResponse, refetch } = const {
useFetchBonusTransactionsQuery(request); data: transactionsResponse,
refetch,
isLoading: isTransactionLoading,
} = useFetchBonusTransactionsQuery(request);
useEffect(() => { useEffect(() => {
refetch(); refetch();
@ -149,6 +152,7 @@ export function CustomerDashboard() {
</div> </div>
<TransactionsTable <TransactionsTable
isLoading={isTransactionLoading}
data={ data={
transactionsResponse || { transactionsResponse || {
limit: 10, limit: 10,

View File

@ -155,7 +155,10 @@ export default function LoginPage() {
<div className='mt-8 text-center text-sm text-gray-500'> <div className='mt-8 text-center text-sm text-gray-500'>
<p> <p>
{t('auth.loginIssues')}{' '} {t('auth.loginIssues')}{' '}
<Link href='mailto:info@oriyo.tj' className='text-red-600 hover:underline'> <Link
href='mailto:info@oriyo.tj'
className='text-red-600 hover:underline'
>
{t('auth.contactLink')} {t('auth.contactLink')}
</Link> </Link>
</p> </p>

View File

@ -0,0 +1,20 @@
import { Loader2 } from 'lucide-react';
import { cn } from '../lib/utils';
interface SpinnerProps {
className?: string;
size?: 'sm' | 'md' | 'lg';
}
export function Spinner({ className, size = 'md' }: SpinnerProps) {
const sizeClasses = {
sm: 'h-4 w-4',
md: 'h-6 w-6',
lg: 'h-8 w-8',
};
return (
<Loader2 className={cn(`animate-spin ${sizeClasses[size]}`, className)} />
);
}

View File

@ -0,0 +1,28 @@
import { cn } from '../lib/utils';
import { Spinner } from './spinner';
interface TableLoadingOverlayProps {
isLoading: boolean;
message?: string;
className?: string;
}
export default function TableLoadingOverlay({
isLoading,
message = 'Загрузка данных...',
className,
}: TableLoadingOverlayProps) {
if (!isLoading) return null;
return (
<div
className={cn(
'absolute inset-0 z-10 flex flex-col items-center justify-center bg-white/80 backdrop-blur-[1px] transition-opacity duration-200',
className,
)}
>
<Spinner size='lg' className='mb-2 text-red-600' />
<p className='font-medium text-gray-700'>{message}</p>
</div>
);
}

View File

@ -10,6 +10,7 @@ import {
TransactionResponse, TransactionResponse,
} from '@/entities/transactions/model/types'; } from '@/entities/transactions/model/types';
import TableLoadingOverlay from '@/shared/components/table-loading-overlay';
import { useTextController } from '@/shared/language/hooks/use-text-controller'; import { useTextController } from '@/shared/language/hooks/use-text-controller';
import { Button } from '@/shared/shadcn-ui/button'; import { Button } from '@/shared/shadcn-ui/button';
import { Calendar } from '@/shared/shadcn-ui/calendar'; import { Calendar } from '@/shared/shadcn-ui/calendar';
@ -39,11 +40,13 @@ import {
export interface TransactionsTableProps { export interface TransactionsTableProps {
onChange: (request: TransactionRequest) => void; onChange: (request: TransactionRequest) => void;
isLoading: boolean;
data: TransactionResponse; data: TransactionResponse;
} }
export const TransactionsTable = ({ export const TransactionsTable = ({
data, data,
isLoading,
onChange, onChange,
}: TransactionsTableProps) => { }: TransactionsTableProps) => {
const [startDate, setStartDate] = useState<Date | undefined>( const [startDate, setStartDate] = useState<Date | undefined>(
@ -98,7 +101,8 @@ export const TransactionsTable = ({
if (!data) return null; if (!data) return null;
return ( return (
<div className='space-y-6'> <div className='relative space-y-6'>
<TableLoadingOverlay isLoading={isLoading} />
<div className='flex flex-col items-start justify-between gap-4 md:flex-row md:items-center'> <div className='flex flex-col items-start justify-between gap-4 md:flex-row md:items-center'>
<h2 className='text-2xl font-bold'> <h2 className='text-2xl font-bold'>
{t('corporate.transactions.title')} {t('corporate.transactions.title')}
@ -169,7 +173,7 @@ export const TransactionsTable = ({
</div> </div>
</div> </div>
<div className='rounded-md border'> <div className='relative rounded-md border'>
<Table> <Table>
<TableHeader> <TableHeader>
<TableRow> <TableRow>