From 7e17191c1be00f3aa4c071591318bc84fe96bfdc Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Tue, 24 Feb 2026 12:14:02 +0330 Subject: [PATCH] ccredit user --- src/components/Select.tsx | 3 ++- src/pages/payment/PayInvoice.tsx | 28 ++++++++++++++++++++++++--- src/pages/user/hooks/useUserData.ts | 9 +++++++++ src/pages/user/service/UserService.ts | 7 +++++++ src/pages/user/types/Types.ts | 16 +++++++++++++++ 5 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 src/pages/user/hooks/useUserData.ts create mode 100644 src/pages/user/service/UserService.ts create mode 100644 src/pages/user/types/Types.ts diff --git a/src/components/Select.tsx b/src/components/Select.tsx index 0dc8874..28b422a 100644 --- a/src/components/Select.tsx +++ b/src/components/Select.tsx @@ -5,6 +5,7 @@ import { ArrowDown2 } from 'iconsax-react' export type ItemsSelectType = { value: string, label: string, + disabled?: boolean, } type Props = { className?: string, @@ -38,7 +39,7 @@ const Select: FC = (props: Props) => { { props.items?.map((item) => { return ( - ) diff --git a/src/pages/payment/PayInvoice.tsx b/src/pages/payment/PayInvoice.tsx index 184e323..9760c82 100644 --- a/src/pages/payment/PayInvoice.tsx +++ b/src/pages/payment/PayInvoice.tsx @@ -1,4 +1,4 @@ -import { type FC, useState } from 'react' +import { type FC, useState, useMemo, useEffect } from 'react' import { useFormik } from 'formik' import * as Yup from 'yup' import { useParams } from 'react-router-dom' @@ -17,10 +17,16 @@ import { toast } from '@/shared/toast' import type { ErrorType } from '@/helpers/types' import type { PayInvoiceParamsType } from './types/Types' import { PaymentGatewayEnum, PaymentMethodEnum } from './enum/Enum' -const methodItems: ItemsSelectType[] = [ +import { useGetMe } from '../user/hooks/useUserData' + +const getMethodItems = (userCredit: number): ItemsSelectType[] => [ { value: PaymentMethodEnum.Online, label: 'آنلاین' }, { value: PaymentMethodEnum.Cash, label: 'نقد' }, - { value: PaymentMethodEnum.Credit, label: 'اعتباری' }, + { + value: PaymentMethodEnum.Credit, + label: 'اعتباری', + disabled: userCredit <= 0, + }, ] const gatewayItems: ItemsSelectType[] = [ @@ -30,14 +36,26 @@ const gatewayItems: ItemsSelectType[] = [ const formatPrice = (num: number) => `${NumberFormat(num)} تومان` const PayInvoice: FC = () => { + + const { data: user } = useGetMe() const { id } = useParams() const { data, isPending } = useGetInvoiceDetail(id ?? '') const { mutate: payInvoice, isPending: isPaying } = usePayInvoice() const multiUpload = useMultiUpload() const [attachmentFiles, setAttachmentFiles] = useState([]) + const userCredit = user?.maxCredit ?? 0 + const methodItems = useMemo(() => getMethodItems(userCredit), [userCredit]) + const invoice = data?.data + useEffect(() => { + if (userCredit <= 0 && formik.values.method === PaymentMethodEnum.Credit) { + formik.setFieldValue('method', PaymentMethodEnum.Online) + } + // eslint-disable-next-line react-hooks/exhaustive-deps -- only run when userCredit is known + }, [userCredit]) + const formik = useFormik({ initialValues: { amount: invoice?.balance ?? 0, @@ -145,6 +163,10 @@ const PayInvoice: FC = () => { مانده: {formatPrice(invoice.balance)} +
+ اعتبار: + {formatPrice(userCredit)} +
diff --git a/src/pages/user/hooks/useUserData.ts b/src/pages/user/hooks/useUserData.ts new file mode 100644 index 0000000..c1292db --- /dev/null +++ b/src/pages/user/hooks/useUserData.ts @@ -0,0 +1,9 @@ +import { useQuery } from "@tanstack/react-query"; +import * as api from "../service/UserService"; + +export const useGetMe = () => { + return useQuery({ + queryKey: ["me"], + queryFn: api.getMe, + }); +}; diff --git a/src/pages/user/service/UserService.ts b/src/pages/user/service/UserService.ts new file mode 100644 index 0000000..e539ac9 --- /dev/null +++ b/src/pages/user/service/UserService.ts @@ -0,0 +1,7 @@ +import axios from "@/config/axios"; +import type { GetMeResponseType } from "@/pages/user/types/Types"; + +export const getMe = async (): Promise => { + const { data } = await axios.get("/public/users/me"); + return data.data; +}; diff --git a/src/pages/user/types/Types.ts b/src/pages/user/types/Types.ts new file mode 100644 index 0000000..e916604 --- /dev/null +++ b/src/pages/user/types/Types.ts @@ -0,0 +1,16 @@ +import type { BaseResponse } from "@/shared/types/Types"; + +export interface UserMeType { + id: string; + createdAt: string; + deletedAt: string | null; + firstName: string | null; + lastName: string | null; + isActive: boolean; + gender: boolean; + maxCredit: number; + addresse: string | null; + phone: string; +} + +export type GetMeResponseType = BaseResponse;