From 6653cba5a0c39076cce2495b6a3ab8f81c723d24 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Mon, 8 Dec 2025 10:28:53 +0330 Subject: [PATCH] my coupon --- .../(Main)/transactions/discount/page.tsx | 86 +++++++++++++------ .../transactions/hooks/useTransactionData.ts | 9 ++ src/app/[name]/(Main)/transactions/page.tsx | 2 +- .../service/TransactionService.ts | 7 ++ .../[name]/(Main)/transactions/types/Types.ts | 27 ++++++ 5 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 src/app/[name]/(Main)/transactions/hooks/useTransactionData.ts create mode 100644 src/app/[name]/(Main)/transactions/service/TransactionService.ts create mode 100644 src/app/[name]/(Main)/transactions/types/Types.ts diff --git a/src/app/[name]/(Main)/transactions/discount/page.tsx b/src/app/[name]/(Main)/transactions/discount/page.tsx index 3449886..74ab2bc 100644 --- a/src/app/[name]/(Main)/transactions/discount/page.tsx +++ b/src/app/[name]/(Main)/transactions/discount/page.tsx @@ -1,7 +1,31 @@ +'use client'; import { Button } from '@/components/ui/button' -import React from 'react' +import React, { useCallback } from 'react' +import { useGetMyCoupons } from '../hooks/useTransactionData'; +import { toast } from '@/components/Toast'; +import type { Coupon } from '../types/Types'; function TransactionsIndex() { + const { data: myCoupons, isLoading } = useGetMyCoupons(); + + const handleCopyCode = useCallback(async (code: string) => { + try { + await navigator.clipboard.writeText(code); + toast('کد تخفیف با موفقیت کپی شد', 'success'); + } catch { + toast('خطا در کپی کردن کد تخفیف', 'error'); + } + }, []); + + const formatDiscount = useCallback((coupon: Coupon) => { + if (coupon.type === 'PERCENTAGE') { + return `${coupon.value}%`; + } + return `${coupon.value.toLocaleString('fa-IR')} تومان`; + }, []); + + const coupons = myCoupons?.data ?? []; + return (

کدهای تخفیف

@@ -59,30 +83,42 @@ function TransactionsIndex() {
-
- {[1, 2, 3].map((_, i) => ( -
-
-

مبلغ تخفیف: 50,000 تومان

-

قابل استفاده برای همه‌ی منوها و محصولات

- -
-
-

- F12BB587 -

-
-
- ))} -
+ {isLoading ? ( +
+ +

در حال دریافت کدهای تخفیف...

+
+ ) : coupons.length === 0 ? ( +
+

کد تخفیفی موجود نیست

+
+ ) : ( +
+ {coupons.map((coupon) => ( +
+
+

مبلغ تخفیف: {formatDiscount(coupon)}

+

{coupon.description || 'قابل استفاده برای همه‌ی منوها و محصولات'}

+ +
+
+

+ {coupon.code} +

+
+
+ ))} +
+ )} ) } diff --git a/src/app/[name]/(Main)/transactions/hooks/useTransactionData.ts b/src/app/[name]/(Main)/transactions/hooks/useTransactionData.ts new file mode 100644 index 0000000..314e4a9 --- /dev/null +++ b/src/app/[name]/(Main)/transactions/hooks/useTransactionData.ts @@ -0,0 +1,9 @@ +import { useQuery } from "@tanstack/react-query"; +import * as api from "../service/TransactionService"; + +export const useGetMyCoupons = () => { + return useQuery({ + queryKey: ["my-coupons"], + queryFn: api.getMyCoupons, + }); +}; diff --git a/src/app/[name]/(Main)/transactions/page.tsx b/src/app/[name]/(Main)/transactions/page.tsx index dadc3de..b365f1b 100644 --- a/src/app/[name]/(Main)/transactions/page.tsx +++ b/src/app/[name]/(Main)/transactions/page.tsx @@ -9,7 +9,7 @@ import { } from 'iconsax-react' import React from 'react' -function TransactionsReviewIndex () { +function TransactionsReviewIndex() { return (

لیست تراکنش ها

diff --git a/src/app/[name]/(Main)/transactions/service/TransactionService.ts b/src/app/[name]/(Main)/transactions/service/TransactionService.ts new file mode 100644 index 0000000..f9fb91d --- /dev/null +++ b/src/app/[name]/(Main)/transactions/service/TransactionService.ts @@ -0,0 +1,7 @@ +import { api } from "@/config/axios"; +import { CouponsResponse } from "../types/Types"; + +export const getMyCoupons = async (): Promise => { + const { data } = await api.get("/public/coupons/me"); + return data; +}; diff --git a/src/app/[name]/(Main)/transactions/types/Types.ts b/src/app/[name]/(Main)/transactions/types/Types.ts new file mode 100644 index 0000000..b37f3b2 --- /dev/null +++ b/src/app/[name]/(Main)/transactions/types/Types.ts @@ -0,0 +1,27 @@ +import { BaseResponse } from "@/app/[name]/(Main)/types/Types"; + +export interface Coupon { + id: string; + createdAt: string; + updatedAt: string; + deletedAt: string | null; + restaurant: string; + code: string; + name: string; + description: string; + type: "PERCENTAGE" | "FIXED"; + value: number; + maxDiscount: number | null; + minOrderAmount: number; + maxUses: number; + usedCount: number; + maxUsesPerUser: number | null; + startDate: string | null; + endDate: string | null; + isActive: boolean; + foodCategories: unknown | null; + foods: unknown | null; + userPhone: string | null; +} + +export type CouponsResponse = BaseResponse;