ruch
Version:
Revolutionary React TypeScript CLI with hexagonal architecture & AI-powered development assistance. Create maintainable, scalable applications with domain-driven design and integrated AI tooling.
69 lines (62 loc) • 2.31 kB
text/typescript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import type { PaymentCreationData, PaymentUpdateData } from '../entities/Payment';
import { PaymentService } from '../services/PaymentService';
import type { PaymentPort } from '../ports/PaymentPort';
const QUERY_KEYS = {
all: ['payment'] as const,
lists: () => [...QUERY_KEYS.all, 'list'] as const,
list: (filters: string) => [...QUERY_KEYS.lists(), { filters }] as const,
details: () => [...QUERY_KEYS.all, 'detail'] as const,
detail: (id: string) => [...QUERY_KEYS.details(), id] as const,
};
export function usePaymentService(port: PaymentPort) {
return new PaymentService(port);
}
export function usePaymentList(port: PaymentPort) {
const service = usePaymentService(port);
return useQuery({
queryKey: QUERY_KEYS.lists(),
queryFn: () => service.getAll(),
});
}
export function usePaymentDetail(port: PaymentPort, id: string) {
const service = usePaymentService(port);
return useQuery({
queryKey: QUERY_KEYS.detail(id),
queryFn: () => service.getById(id),
enabled: !!id,
});
}
export function usePaymentCreate(port: PaymentPort) {
const queryClient = useQueryClient();
const service = usePaymentService(port);
return useMutation({
mutationFn: (data: PaymentCreationData) => service.create(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() });
},
});
}
export function usePaymentUpdate(port: PaymentPort) {
const queryClient = useQueryClient();
const service = usePaymentService(port);
return useMutation({
mutationFn: ({ id, data }: { id: string; data: PaymentUpdateData }) =>
service.update(id, data),
onSuccess: (_, { id }) => {
queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() });
queryClient.invalidateQueries({ queryKey: QUERY_KEYS.detail(id) });
},
});
}
export function usePaymentDelete(port: PaymentPort) {
const queryClient = useQueryClient();
const service = usePaymentService(port);
return useMutation({
mutationFn: (id: string) => service.delete(id),
onSuccess: (_, id) => {
queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() });
queryClient.invalidateQueries({ queryKey: QUERY_KEYS.detail(id) });
},
});
}