102 lines
3.4 KiB
TypeScript
102 lines
3.4 KiB
TypeScript
import { api } from './client';
|
|
|
|
export type TicketingManualPaymentSettings = {
|
|
enabled: boolean;
|
|
manualQrMode: 'upload' | 'dynamic';
|
|
upiQrImageUrl: string;
|
|
upiId: string;
|
|
payeeName: string;
|
|
instructions: string;
|
|
platformFeeInr: number;
|
|
platformFeeInrIsDefault: boolean;
|
|
/** One-time unlock fee (INR) — same as charged in checkout-order. */
|
|
enablementFeeInr: number;
|
|
enablementPaid: boolean;
|
|
enablementPaidAt: string | null;
|
|
};
|
|
|
|
export type TicketManualOrderRow = {
|
|
_id: string;
|
|
status: string;
|
|
createdAt?: string;
|
|
purchaserEmail: string;
|
|
screenshotUrl: string;
|
|
buyerNote?: string;
|
|
quote: Record<string, unknown> | null;
|
|
currency: string;
|
|
ticket: { _id: string; name: string } | null;
|
|
reviewedAt?: string;
|
|
rejectReason?: string;
|
|
fulfillmentParticipantIds?: string[];
|
|
};
|
|
|
|
export type PatchTicketingManualPayload = Partial<{
|
|
enabled: boolean;
|
|
manualQrMode: 'upload' | 'dynamic';
|
|
upiQrImageUrl: string;
|
|
upiId: string;
|
|
payeeName: string;
|
|
instructions: string;
|
|
platformFeeInr: number | null;
|
|
}>;
|
|
|
|
export const eventTicketingManualApi = {
|
|
async get(eventId: string): Promise<TicketingManualPaymentSettings> {
|
|
const r = await api.get<{ ticketingManualPayment: TicketingManualPaymentSettings }>(
|
|
`/events/${eventId}/ticketing-manual-payment`,
|
|
);
|
|
if (r.error || !r.data?.ticketingManualPayment) throw new Error(r.error ?? 'Failed to load manual payment settings');
|
|
return r.data.ticketingManualPayment;
|
|
},
|
|
|
|
async patch(eventId: string, payload: PatchTicketingManualPayload): Promise<TicketingManualPaymentSettings> {
|
|
const r = await api.patch<{ ticketingManualPayment: TicketingManualPaymentSettings }>(
|
|
`/events/${eventId}/ticketing-manual-payment`,
|
|
payload,
|
|
);
|
|
if (r.error || !r.data?.ticketingManualPayment) throw new Error(r.error ?? 'Failed to save');
|
|
return r.data.ticketingManualPayment;
|
|
},
|
|
|
|
async checkoutEnablementOrder(eventId: string): Promise<{
|
|
keyId: string;
|
|
orderId: string;
|
|
amount: number;
|
|
currency: string;
|
|
transactionId: string;
|
|
checkoutSource: string;
|
|
enablementFeeInr: number;
|
|
}> {
|
|
const r = await api.post<{
|
|
keyId: string;
|
|
orderId: string;
|
|
amount: number;
|
|
currency: string;
|
|
transactionId: string;
|
|
checkoutSource: string;
|
|
enablementFeeInr: number;
|
|
}>(`/events/${eventId}/ticketing-manual-enablement/checkout-order`, {});
|
|
if (r.error || !r.data) throw new Error(r.error ?? 'Failed to create payment order');
|
|
return r.data;
|
|
},
|
|
};
|
|
|
|
export const ticketManualOrdersApi = {
|
|
async list(eventId: string, status: 'pending_review' | 'approved' | 'rejected' | 'all' = 'pending_review') {
|
|
const q = status === 'pending_review' ? '' : `?status=${encodeURIComponent(status)}`;
|
|
const r = await api.get<{ orders: TicketManualOrderRow[] }>(`/events/${eventId}/ticket-manual-orders${q}`);
|
|
if (r.error) throw new Error(r.error);
|
|
return r.data?.orders ?? [];
|
|
},
|
|
|
|
async approve(eventId: string, orderId: string): Promise<void> {
|
|
const r = await api.post<{ ok: boolean }>(`/events/${eventId}/ticket-manual-orders/${orderId}/approve`, {});
|
|
if (r.error) throw new Error(r.error);
|
|
},
|
|
|
|
async reject(eventId: string, orderId: string, reason?: string): Promise<void> {
|
|
const r = await api.post<{ ok: boolean }>(`/events/${eventId}/ticket-manual-orders/${orderId}/reject`, { reason });
|
|
if (r.error) throw new Error(r.error);
|
|
},
|
|
};
|