TorbatYar/frontend/modules/payment/features/psp.tsx
Mortezakoohjani 4451b32a33 feat(payment-frontend): ship Torbat Pay admin portal for MVP 14.0-14.5
Add payment module, BFF proxy, hub/dashboard/ops/PSP/merchant screens wired to real APIs, and mark payment-frontend complete in project status.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 18:35:07 +03:30

49 lines
1.8 KiB
TypeScript

"use client";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import { Button } from "@/components/ds";
import { PaymentListPage } from "@/modules/payment/components/PaymentListPage";
import { paymentApi } from "@/modules/payment/services/payment-api";
import { useTenantId } from "@/hooks/useTenantId";
import type { PaymentRecord } from "@/modules/payment/types";
function TestConnectionButton({ row, refresh }: { row: PaymentRecord; refresh: () => void }) {
const { tenantId } = useTenantId();
const qc = useQueryClient();
const testM = useMutation({
mutationFn: () => paymentApi.pspConnections.test(tenantId!, String(row.id)),
onSuccess: () => {
toast.success("تست اتصال موفق");
refresh();
qc.invalidateQueries({ queryKey: ["payment", tenantId] });
},
onError: (e: Error) => toast.error(e.message),
});
return (
<Button size="sm" variant="outline" loading={testM.isPending} onClick={() => testM.mutate()}>
تست
</Button>
);
}
export const PaymentPsp = function PaymentPspPage() {
return (
<PaymentListPage
title="مدیریت درگاه PSP"
description="اتصالات BYO-PSP — نیازمند باندل payment.byo_psp.basic"
resourceKey="psp-connections"
fetcher={(tenantId) => paymentApi.pspConnections.list(tenantId)}
columns={[
{ key: "provider_code", header: "ارائه‌دهنده" },
{ key: "name", header: "نام" },
{ key: "status", header: "وضعیت", type: "status" },
{ key: "created_at", header: "تاریخ", type: "datetime" },
]}
rowActions={(row, refresh) => <TestConnectionButton row={row} refresh={refresh} />}
/>
);
};
export default PaymentPsp;