import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { api } from '../lib/api'; import type { ApiResponse } from '../lib/api'; /** * روش‌های پرداختِ **محیط فعال** (حساب بانکی + کارت‌خوان) برای صفحهٔ «مدیریت پرداخت». * منبع: /api/v1/my/payment-methods/... — این رکوردها بعداً از فاکتور مراجعه‌کننده * برای ثبت روش پرداختِ یک سرویس ارجاع داده می‌شوند. * * از فاز ۶، کارت‌ها به محیط تعلق دارند نه به کاربر: با تعویض محیط، فهرست عوض * می‌شود. کارت‌های بازمانده‌ای که هنوز محیطی ندارند با entity_type = null در همین * فهرست می‌آیند و باید پیش از استفاده به محیطی منتسب شوند. */ /** null یعنی «محیطش هنوز تعیین نشده». */ export type PaymentMethodEnvironment = 'doctor' | 'clinic' | null; export interface BankAccount { uuid: string; bank_name: string; card_number: string | null; account_number: string; shaba_number: string | null; is_active: boolean; created_at: number; entity_type: PaymentMethodEnvironment; } export interface Pos { uuid: string; bank_name: string; serial_number: string | null; terminal_number: string; account_number: string | null; is_active: boolean; created_at: number; entity_type: PaymentMethodEnvironment; } export interface BankAccountInput { bank_name: string; account_number: string; card_number?: string; shaba_number?: string; } export interface PosInput { bank_name: string; terminal_number: string; serial_number?: string; account_number?: string; } const BANK_KEY = ['payment-methods', 'bank-accounts'] as const; const POS_KEY = ['payment-methods', 'pos'] as const; // ── Bank accounts ──────────────────────────────────────────────────────────── export function useBankAccounts() { return useQuery>({ queryKey: BANK_KEY, queryFn: () => api.get('/api/v1/my/payment-methods/bank-accounts'), }); } export function useCreateBankAccount() { const qc = useQueryClient(); return useMutation, unknown, BankAccountInput>({ mutationFn: (body) => api.post('/api/v1/my/payment-methods/bank-accounts', body), onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }), }); } export function useUpdateBankAccount() { const qc = useQueryClient(); return useMutation, unknown, { uuid: string; body: BankAccountInput }>({ mutationFn: ({ uuid, body }) => api.put(`/api/v1/my/payment-methods/bank-accounts/${uuid}`, body), onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }), }); } export function useToggleBankAccountStatus() { const qc = useQueryClient(); return useMutation, unknown, string>({ mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/bank-accounts/${uuid}/status`, {}), onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }), }); } /** کارتِ بی‌محیط را به محیط فعال می‌چسباند؛ پیش از آن قابل ویرایش نیست. */ export function useAssignBankAccountEnvironment() { const qc = useQueryClient(); return useMutation, unknown, string>({ mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/bank-accounts/${uuid}/environment`, {}), onSuccess: () => qc.invalidateQueries({ queryKey: BANK_KEY }), }); } // ── POS devices ────────────────────────────────────────────────────────────── export function usePosDevices() { return useQuery>({ queryKey: POS_KEY, queryFn: () => api.get('/api/v1/my/payment-methods/pos'), }); } export function useCreatePos() { const qc = useQueryClient(); return useMutation, unknown, PosInput>({ mutationFn: (body) => api.post('/api/v1/my/payment-methods/pos', body), onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }), }); } export function useUpdatePos() { const qc = useQueryClient(); return useMutation, unknown, { uuid: string; body: PosInput }>({ mutationFn: ({ uuid, body }) => api.put(`/api/v1/my/payment-methods/pos/${uuid}`, body), onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }), }); } export function useTogglePosStatus() { const qc = useQueryClient(); return useMutation, unknown, string>({ mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/pos/${uuid}/status`, {}), onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }), }); } /** قرینهٔ useAssignBankAccountEnvironment برای کارت‌خوان. */ export function useAssignPosEnvironment() { const qc = useQueryClient(); return useMutation, unknown, string>({ mutationFn: (uuid) => api.patch(`/api/v1/my/payment-methods/pos/${uuid}/environment`, {}), onSuccess: () => qc.invalidateQueries({ queryKey: POS_KEY }), }); }