// src/hooks/useGetInvoices.ts
import { useQuery, UseQueryOptions } from "@tanstack/react-query";
export type Invoice = {
_id: string,
invoiceNumber: string,
customerId: string,
subscriptionId?: string,
status: "draft" | "open" | "paid" | "void" | "uncollectible",
amount: number,
currency: string,
dueDate: string,
issuedDate: string,
pdfUrl?: string,
metadata?: Record<string, any>,
[key: string]: any,
};
export type GetInvoicesResponse = {
invoice?: Invoice,
invoices?: Invoice[],
};
export type GetInvoicesFilters = {
invoiceId?: string,
customerId?: string,
subscriptionId?: string,
status?: string,
};
const useApiKey = () => {
// !! REPLACE THIS PLACEHOLDER !!
const apiKey = 'YOUR_CREDIBILL_API_KEY';
return apiKey;
};
const CREDIBILL_URL = 'https://giant-goldfish-922.convex.site';
const ENDPOINT = '/api/v1/invoices';
type UseGetInvoicesOptions = Omit<UseQueryOptions<
GetInvoicesResponse,
Error
> , 'queryFn' | 'queryKey'>;
/\*\*
- Custom React Query hook for fetching invoice(s)
- @param filters - Optional filters (invoiceId, customerId, subscriptionId, status)
- @param options - Optional configuration options for useQuery
- @returns The query object provided by TanStack Query
\*/
export const useGetInvoices = (
filters?: GetInvoicesFilters,
options?: UseGetInvoicesOptions
) => {
const apiKey = useApiKey();
return useQuery<GetInvoicesResponse, Error>({
queryKey: ['invoices', filters],
queryFn: async () => {
if (!apiKey) {
throw new Error("API Key is required for authentication.");
}
const url = new URL(`${CREDIBILL_URL}${ENDPOINT}`);
if (filters?.invoiceId) {
url.searchParams.append('invoiceId', filters.invoiceId);
}
if (filters?.customerId) {
url.searchParams.append('customerId', filters.customerId);
}
if (filters?.subscriptionId) {
url.searchParams.append('subscriptionId', filters.subscriptionId);
}
if (filters?.status) {
url.searchParams.append('status', filters.status);
}
const response = await fetch(url.toString(), {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`,
},
});
if (!response.ok) {
const errorBody = await response.json();
throw new Error(errorBody.error || `HTTP error! Status: ${response.status}`);
}
return response.json();
},
...options,
});
};