Phase 0.4: split hooks.ts into separate API modules
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
/**
|
||||
* Attachment and address hooks.
|
||||
*/
|
||||
|
||||
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
||||
import { apiGet, apiPost, apiPatch, apiDelete, apiClient } from './client';
|
||||
|
||||
export interface Attachment {
|
||||
id: string;
|
||||
entity_type: string;
|
||||
entity_id: string;
|
||||
filename: string;
|
||||
file_path: string;
|
||||
mime_type: string;
|
||||
file_size: number;
|
||||
uploaded_by?: string | null;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
export interface Address {
|
||||
id: string;
|
||||
entity_type: string;
|
||||
entity_id: string;
|
||||
label: string;
|
||||
address_type: string;
|
||||
street: string | null;
|
||||
street_number: string | null;
|
||||
city: string | null;
|
||||
zip: string | null;
|
||||
state: string | null;
|
||||
country: string | null;
|
||||
is_default: boolean;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
// Attachments
|
||||
export function useAttachments(entityType?: string, entityId?: string) {
|
||||
return useQuery({
|
||||
queryKey: ['attachments', entityType, entityId],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (entityType) params.set('entity_type', entityType);
|
||||
if (entityId) params.set('entity_id', entityId);
|
||||
return apiGet<{ items: Attachment[]; total: number }>(`/attachments?${params.toString()}`);
|
||||
},
|
||||
enabled: !!entityType && !!entityId,
|
||||
});
|
||||
}
|
||||
|
||||
export function useUploadAttachment() {
|
||||
const queryClient = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: async ({ file, entityType, entityId }: { file: File; entityType: string; entityId: string }) => {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
formData.append('entity_type', entityType);
|
||||
formData.append('entity_id', entityId);
|
||||
const response = await apiClient.post('/attachments', formData, {
|
||||
headers: { 'Content-Type': 'multipart/form-data' },
|
||||
});
|
||||
return response.data;
|
||||
},
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['attachments'] });
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function useDeleteAttachment() {
|
||||
const queryClient = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (id: string) => apiDelete(`/attachments/${id}`),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['attachments'] });
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// Addresses
|
||||
export function useAddresses(entityType?: string, entityId?: string) {
|
||||
return useQuery({
|
||||
queryKey: ['addresses', entityType, entityId],
|
||||
queryFn: () =>
|
||||
apiGet<{ items: Address[]; total: number }>(
|
||||
`/addresses?entity_type=${entityType}&entity_id=${entityId}`
|
||||
),
|
||||
enabled: !!entityType && !!entityId,
|
||||
});
|
||||
}
|
||||
|
||||
export function useCreateAddress() {
|
||||
const queryClient = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (data: Partial<Address> & { entity_type: string; entity_id: string }) =>
|
||||
apiPost('/addresses', data),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['addresses'] });
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function useUpdateAddress() {
|
||||
const queryClient = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: ({ id, data }: { id: string; data: Partial<Address> }) =>
|
||||
apiPatch(`/addresses/${id}`, data),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['addresses'] });
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function useDeleteAddress() {
|
||||
const queryClient = useQueryClient();
|
||||
return useMutation({
|
||||
mutationFn: (id: string) => apiDelete(`/addresses/${id}`),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['addresses'] });
|
||||
},
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user