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

View File

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

View File

@ -155,7 +155,10 @@ export default function LoginPage() {
<div className='mt-8 text-center text-sm text-gray-500'>
<p>
{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')}
</Link>
</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,
} from '@/entities/transactions/model/types';
import TableLoadingOverlay from '@/shared/components/table-loading-overlay';
import { useTextController } from '@/shared/language/hooks/use-text-controller';
import { Button } from '@/shared/shadcn-ui/button';
import { Calendar } from '@/shared/shadcn-ui/calendar';
@ -39,11 +40,13 @@ import {
export interface TransactionsTableProps {
onChange: (request: TransactionRequest) => void;
isLoading: boolean;
data: TransactionResponse;
}
export const TransactionsTable = ({
data,
isLoading,
onChange,
}: TransactionsTableProps) => {
const [startDate, setStartDate] = useState<Date | undefined>(
@ -98,7 +101,8 @@ export const TransactionsTable = ({
if (!data) return null;
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'>
<h2 className='text-2xl font-bold'>
{t('corporate.transactions.title')}
@ -169,7 +173,7 @@ export const TransactionsTable = ({
</div>
</div>
<div className='rounded-md border'>
<div className='relative rounded-md border'>
<Table>
<TableHeader>
<TableRow>