Added loader while loading transactions
This commit is contained in:
parent
64d2c12494
commit
4299f57e2d
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
20
src/shared/components/spinner.tsx
Normal file
20
src/shared/components/spinner.tsx
Normal 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)} />
|
||||||
|
);
|
||||||
|
}
|
||||||
28
src/shared/components/table-loading-overlay.tsx
Normal file
28
src/shared/components/table-loading-overlay.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user