UNPKG

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.22 kB
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import type { CartCreationData, CartUpdateData } from '../entities/Cart'; import { CartService } from '../services/CartService'; import type { CartPort } from '../ports/CartPort'; const QUERY_KEYS = { all: ['cart'] 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 useCartService(port: CartPort) { return new CartService(port); } export function useCartList(port: CartPort) { const service = useCartService(port); return useQuery({ queryKey: QUERY_KEYS.lists(), queryFn: () => service.getAll(), }); } export function useCartDetail(port: CartPort, id: string) { const service = useCartService(port); return useQuery({ queryKey: QUERY_KEYS.detail(id), queryFn: () => service.getById(id), enabled: !!id, }); } export function useCartCreate(port: CartPort) { const queryClient = useQueryClient(); const service = useCartService(port); return useMutation({ mutationFn: (data: CartCreationData) => service.create(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() }); }, }); } export function useCartUpdate(port: CartPort) { const queryClient = useQueryClient(); const service = useCartService(port); return useMutation({ mutationFn: ({ id, data }: { id: string; data: CartUpdateData }) => service.update(id, data), onSuccess: (_, { id }) => { queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() }); queryClient.invalidateQueries({ queryKey: QUERY_KEYS.detail(id) }); }, }); } export function useCartDelete(port: CartPort) { const queryClient = useQueryClient(); const service = useCartService(port); return useMutation({ mutationFn: (id: string) => service.delete(id), onSuccess: (_, id) => { queryClient.invalidateQueries({ queryKey: QUERY_KEYS.lists() }); queryClient.invalidateQueries({ queryKey: QUERY_KEYS.detail(id) }); }, }); }