transaction change

This commit is contained in:
hamid zarghami
2025-12-23 10:45:04 +03:30
parent 90bfada747
commit 2e8ed5ce1e
4 changed files with 56 additions and 75 deletions
@@ -23,10 +23,10 @@ import {
TableHeader,
TableRow
} from '@/components/ui/table'
import clsx from 'clsx'
import { ArrowLeft2, ArrowRight2 } from 'iconsax-react'
import { ef } from '@/lib/helpers/utfNumbers'
import { Transaction } from '../types/Types'
import Status from '@/components/utils/Status'
interface TransactionsTableProps {
transactions: Transaction[]
@@ -41,26 +41,6 @@ const formatDate = (dateString: string): string => {
});
};
const getStatusText = (status: string): string => {
const statusMap: Record<string, string> = {
'SUCCESS': 'موفق',
'FAILED': 'ناموفق',
'PENDING': 'در انتظار',
'CANCELLED': 'لغو شده',
};
return statusMap[status] || status;
};
const getStatusColor = (status: string): string => {
const colorMap: Record<string, string> = {
'SUCCESS': 'bg-[#00BA4B]',
'FAILED': 'bg-red-500',
'PENDING': 'bg-yellow-500',
'CANCELLED': 'bg-gray-500',
};
return colorMap[status] || 'bg-transparent border border-primary';
};
export const columns: ColumnDef<Transaction>[] = [
{
accessorKey: 'order.orderNumber',
@@ -102,20 +82,7 @@ export const columns: ColumnDef<Transaction>[] = [
header: () => <div className='text-center'>وضعیت</div>,
cell: ({ row }) => {
const status = row.original.status;
const statusText = getStatusText(status);
const statusColor = getStatusColor(status);
return (
<div className='text-right flex items-center justify-center gap-x-2'>
<span
className={clsx(
'size-2 rounded-full',
statusColor
)}
></span>
{statusText}
</div>
)
return <Status status={status} className='text-right' />
}
}
]
@@ -0,0 +1,6 @@
export const enum PaymentStatusEnum {
Pending = "pending",
Paid = "paid",
Failed = "failed",
Refunded = "refunded",
}
+5 -40
View File
@@ -1,50 +1,15 @@
'use client';
import { ef } from '@/lib/helpers/utfNumbers'
import {
MoneyRecive,
MoneySend,
Wallet
} from 'iconsax-react'
import React, { useMemo } from 'react'
import { useGetTransactions, useGetUserWallet } from './hooks/useTransactionData';
import { Transaction } from './types/Types';
import React from 'react'
import { useGetTransactions } from './hooks/useTransactionData';
import { TransactionsTable } from './components/TransactionsTable';
import LoadingOverlay from '@/components/overlays/LoadingOverlay';
function TransactionsReviewIndex() {
const { data: transactionsResponse, isLoading: isLoadingTransactions } = useGetTransactions();
const { data: walletResponse, isLoading: isLoadingWallet } = useGetUserWallet();
const transactions = transactionsResponse?.data || [];
const walletAmount = walletResponse?.data?.wallet || 0;
const stats = useMemo(() => {
if (!transactions.length) {
return {
totalDeposits: 0,
totalWithdrawals: 0,
};
}
const deposits = transactions
.filter((t: Transaction) => t.status === 'SUCCESS' && t.amount > 0)
.reduce((sum: number, t: Transaction) => sum + t.amount, 0);
const withdrawals = transactions
.filter((t: Transaction) => t.status === 'SUCCESS' && t.amount < 0)
.reduce((sum: number, t: Transaction) => sum + Math.abs(t.amount), 0);
return {
totalDeposits: deposits,
totalWithdrawals: withdrawals,
};
}, [transactions]);
const formatPrice = (amount: number) => {
return ef(amount.toLocaleString('fa-IR'));
};
const isLoading = isLoadingTransactions || isLoadingWallet;
const isLoading = isLoadingTransactions;
return (
<section className='flex flex-col h-full pb-10 pt-6 gap-4 relative'>
@@ -52,7 +17,7 @@ function TransactionsReviewIndex() {
<h1 className='font-medium text-base'>لیست تراکنش ها</h1>
<div className='grid grid-cols-3 gap-2 h-28'>
{/* <div className='grid grid-cols-3 gap-2 h-28'>
<div className='w-full h-full flex flex-col items-center justify-center p-2.5 text-center bg-container rounded-xl'>
<div className='size-8 bg-background rounded-full grid items-center'>
<MoneySend
@@ -89,7 +54,7 @@ function TransactionsReviewIndex() {
{formatPrice(walletAmount)} ریال
</span>
</div>
</div>
</div> */}
<div className='w-full h-full bg-container rounded-3xl mt-0'>
<TransactionsTable transactions={transactions} />
+43
View File
@@ -0,0 +1,43 @@
'use client';
import React from 'react';
import clsx from 'clsx';
type Props = {
status: string;
className?: string;
};
const getStatusConfig = (status: string): { text: string; color: string } => {
const statusUpper = status.toUpperCase();
const statusMap: Record<string, { text: string; color: string }> = {
'SUCCESS': { text: 'موفق', color: 'bg-[#00BA4B]' },
'FAILED': { text: 'ناموفق', color: 'bg-red-500' },
'PENDING': { text: 'در انتظار', color: 'bg-yellow-500' },
'CANCELLED': { text: 'لغو شده', color: 'bg-gray-500' },
'PAID': { text: 'پرداخت شده', color: 'bg-[#00BA4B]' },
'REFUNDED': { text: 'بازگشت شده', color: 'bg-gray-500' },
};
return statusMap[statusUpper] || { text: status, color: 'bg-transparent border border-primary' };
};
function Status({ status, className = '' }: Props) {
const { text, color } = getStatusConfig(status);
return (
<div className={clsx('flex items-center gap-x-2', className)}>
<span
className={clsx(
'size-2 rounded-full',
color
)}
></span>
{text}
</div>
);
}
export default Status;