feat(frontend): Add customers API client

Created customers.ts API client following coupons pattern

Types:
 Customer - Full customer data
 CustomerAddress - Billing/shipping address
 CustomerStats - Order statistics
 CustomerListResponse - Paginated list response
 CustomerFormData - Create/update payload
 CustomerSearchResult - Autocomplete result

API Methods:
 list() - Get customers with pagination/search/filter
 get() - Get single customer with full details
 create() - Create new customer
 update() - Update customer data
 delete() - Delete customer
 search() - Autocomplete search

Next: Create CRUD pages (index, new, edit)
This commit is contained in:
dwindown
2025-11-20 22:44:29 +07:00
parent 829d9d0d8f
commit 8254e3e712

View File

@@ -0,0 +1,109 @@
import { api } from '../api';
export interface CustomerAddress {
first_name: string;
last_name: string;
company?: string;
address_1: string;
address_2?: string;
city: string;
state?: string;
postcode: string;
country: string;
phone?: string;
}
export interface CustomerStats {
total_orders: number;
total_spent: number;
}
export interface Customer {
id: number;
username: string;
email: string;
first_name: string;
last_name: string;
display_name: string;
registered: string;
role: string;
billing?: CustomerAddress;
shipping?: CustomerAddress;
stats?: CustomerStats;
}
export interface CustomerListResponse {
data: Customer[];
pagination: {
total: number;
total_pages: number;
current: number;
per_page: number;
};
}
export interface CustomerFormData {
email: string;
first_name: string;
last_name: string;
username?: string;
password?: string;
billing?: Partial<CustomerAddress>;
shipping?: Partial<CustomerAddress>;
send_email?: boolean;
}
export interface CustomerSearchResult {
id: number;
name: string;
email: string;
}
export const CustomersApi = {
/**
* List customers with pagination and filtering
*/
list: async (params?: {
page?: number;
per_page?: number;
search?: string;
role?: string;
}): Promise<CustomerListResponse> => {
return api.get('/customers', { params });
},
/**
* Get single customer
*/
get: async (id: number): Promise<Customer> => {
return api.get(`/customers/${id}`);
},
/**
* Create new customer
*/
create: async (data: CustomerFormData): Promise<Customer> => {
return api.post('/customers', data);
},
/**
* Update customer
*/
update: async (id: number, data: Partial<CustomerFormData>): Promise<Customer> => {
return api.put(`/customers/${id}`, data);
},
/**
* Delete customer
*/
delete: async (id: number): Promise<void> => {
return api.del(`/customers/${id}`);
},
/**
* Search customers (for autocomplete)
*/
search: async (query: string, limit?: number): Promise<CustomerSearchResult[]> => {
return api.get('/customers/search', { params: { q: query, limit } });
},
};