"use client"; import { useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { Button, Dialog, FormField, Input, PageHeader, Select, EmptyState, } from "@/components/ds"; import { loyaltyApi } from "@/modules/loyalty/services/loyalty-api"; import { useTenantId } from "@/hooks/useTenantId"; import { LoyaltyBreadcrumbs } from "@/modules/loyalty/components/LoyaltyBreadcrumbs"; import { LoyaltyPageLoader, LoyaltyPageError } from "@/modules/loyalty/pages/shared"; import { LoyaltyTablePage, LoyaltyStatusChip } from "@/modules/loyalty/design-system"; export default function PointTransactionsPage() { const { tenantId } = useTenantId(); const [accountId, setAccountId] = useState(""); const [active, setActive] = useState(""); const [op, setOp] = useState<"earn" | "redeem" | "adjust" | "expire" | null>(null); const [amount, setAmount] = useState("10"); const [reason, setReason] = useState(""); const qc = useQueryClient(); const accountsQ = useQuery({ queryKey: ["loyalty", tenantId, "point-accounts"], queryFn: () => loyaltyApi.pointAccounts.list(tenantId!, { page: 1, page_size: 500 }), enabled: !!tenantId, }); const balanceQ = useQuery({ queryKey: ["loyalty", tenantId, "point-balance", active], queryFn: () => loyaltyApi.pointAccounts.balance(tenantId!, active), enabled: !!tenantId && !!active, }); const ledgerQ = useQuery({ queryKey: ["loyalty", tenantId, "point-ledger", active], queryFn: () => loyaltyApi.pointAccounts.ledger(tenantId!, active, { offset: 0, limit: 100 }), enabled: !!tenantId && !!active, }); const mut = useMutation({ mutationFn: async () => { const body = { amount: Number(amount), reason: reason || undefined }; if (op === "earn") return loyaltyApi.pointAccounts.earn(tenantId!, active, body); if (op === "redeem") return loyaltyApi.pointAccounts.redeem(tenantId!, active, body); if (op === "adjust") return loyaltyApi.pointAccounts.adjust(tenantId!, active, { amount: Number(amount), reason: reason || "adjust", }); return loyaltyApi.pointAccounts.expirePoints(tenantId!, active, body); }, onSuccess: async () => { toast.success("تراکنش ثبت شد"); setOp(null); await qc.invalidateQueries({ queryKey: ["loyalty", tenantId, "point-"] }); }, onError: (e: Error) => toast.error(e.message), }); if (!tenantId || accountsQ.isLoading) return ; if (accountsQ.error) return accountsQ.refetch()} />; const ledgerItems = ledgerQ.data && "items" in ledgerQ.data ? ledgerQ.data.items : (ledgerQ.data as never) ?? []; return (
{active ? ( <> ) : null}
{balanceQ.data ? (

موجودی: {balanceQ.data.balance} {balanceQ.data.currency_name}

) : null} {!active ? : null} {active && ledgerQ.isLoading ? : null} {active && ledgerQ.data ? ( }, { key: "amount", header: "مبلغ" }, { key: "balance_after", header: "مانده" }, { key: "reason", header: "دلیل" }, { key: "created_at", header: "زمان" }, ]} rows={ledgerItems as unknown as Record[]} /> ) : null} setOp(null)} title="ثبت تراکنش">
setAmount(e.target.value)} /> setReason(e.target.value)} />
); }