erp-core-frontend-web/src/features/partners/hooks/usePartners.ts
2025-12-12 14:39:31 -06:00

142 lines
3.8 KiB
TypeScript

import { useState, useCallback, useEffect } from 'react';
import { partnersApi } from '../api';
import type { Partner, PartnerFilters, CreatePartnerDto, UpdatePartnerDto } from '../types';
interface UsePartnersState {
partners: Partner[];
total: number;
page: number;
totalPages: number;
isLoading: boolean;
error: string | null;
}
interface UsePartnersReturn extends UsePartnersState {
filters: PartnerFilters;
setFilters: (filters: PartnerFilters) => void;
refresh: () => Promise<void>;
createPartner: (data: CreatePartnerDto) => Promise<Partner>;
updatePartner: (id: string, data: UpdatePartnerDto) => Promise<Partner>;
deletePartner: (id: string) => Promise<void>;
activatePartner: (id: string) => Promise<void>;
deactivatePartner: (id: string) => Promise<void>;
}
export function usePartners(initialFilters?: PartnerFilters): UsePartnersReturn {
const [state, setState] = useState<UsePartnersState>({
partners: [],
total: 0,
page: 1,
totalPages: 1,
isLoading: true,
error: null,
});
const [filters, setFilters] = useState<PartnerFilters>(initialFilters || { page: 1, limit: 10 });
const fetchPartners = useCallback(async () => {
setState((prev) => ({ ...prev, isLoading: true, error: null }));
try {
const response = await partnersApi.getAll(filters);
setState({
partners: response.data,
total: response.meta.total,
page: response.meta.page,
totalPages: response.meta.totalPages,
isLoading: false,
error: null,
});
} catch (err) {
setState((prev) => ({
...prev,
isLoading: false,
error: err instanceof Error ? err.message : 'Error al cargar partners',
}));
}
}, [filters]);
useEffect(() => {
fetchPartners();
}, [fetchPartners]);
const createPartner = async (data: CreatePartnerDto): Promise<Partner> => {
const partner = await partnersApi.create(data);
await fetchPartners();
return partner;
};
const updatePartner = async (id: string, data: UpdatePartnerDto): Promise<Partner> => {
const partner = await partnersApi.update(id, data);
await fetchPartners();
return partner;
};
const deletePartner = async (id: string): Promise<void> => {
await partnersApi.delete(id);
await fetchPartners();
};
const activatePartner = async (id: string): Promise<void> => {
await partnersApi.activate(id);
await fetchPartners();
};
const deactivatePartner = async (id: string): Promise<void> => {
await partnersApi.deactivate(id);
await fetchPartners();
};
return {
...state,
filters,
setFilters,
refresh: fetchPartners,
createPartner,
updatePartner,
deletePartner,
activatePartner,
deactivatePartner,
};
}
// Hook for single partner
export function usePartner(id: string | undefined) {
const [partner, setPartner] = useState<Partner | null>(null);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const fetchPartner = useCallback(async () => {
if (!id) {
setIsLoading(false);
return;
}
setIsLoading(true);
setError(null);
try {
const data = await partnersApi.getById(id);
setPartner(data);
} catch (err) {
setError(err instanceof Error ? err.message : 'Error al cargar partner');
} finally {
setIsLoading(false);
}
}, [id]);
useEffect(() => {
fetchPartner();
}, [fetchPartner]);
return { partner, isLoading, error, refresh: fetchPartner };
}
// Hook for customers only
export function useCustomers(initialFilters?: PartnerFilters) {
return usePartners({ ...initialFilters, isCustomer: true });
}
// Hook for suppliers only
export function useSuppliers(initialFilters?: PartnerFilters) {
return usePartners({ ...initialFilters, isSupplier: true });
}