template-saas/apps/frontend/src/hooks/useWebhooks.ts
rckrdmrd 50a821a415
Some checks failed
CI / Backend CI (push) Has been cancelled
CI / Frontend CI (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / CI Summary (push) Has been cancelled
[SIMCO-V38] feat: Actualizar a SIMCO v3.8.0
- HERENCIA-SIMCO.md actualizado con directivas v3.7 y v3.8
- Actualizaciones de configuracion

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 08:53:08 -06:00

150 lines
4.1 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import {
webhooksApi,
Webhook,
WebhookDelivery,
WebhookEvent,
CreateWebhookRequest,
UpdateWebhookRequest,
DeliveryStatus,
PaginatedDeliveries,
} from '@/services/api';
// Query keys
const WEBHOOKS_KEY = ['webhooks'];
const WEBHOOK_KEY = (id: string) => ['webhooks', id];
const WEBHOOK_EVENTS_KEY = ['webhooks', 'events'];
const WEBHOOK_DELIVERIES_KEY = (id: string) => ['webhooks', id, 'deliveries'];
// List all webhooks
export function useWebhooks() {
return useQuery<Webhook[]>({
queryKey: WEBHOOKS_KEY,
queryFn: webhooksApi.list,
});
}
// Get single webhook
export function useWebhook(id: string) {
return useQuery<Webhook>({
queryKey: WEBHOOK_KEY(id),
queryFn: () => webhooksApi.get(id),
enabled: !!id,
});
}
// Get available events
export function useWebhookEvents() {
return useQuery<WebhookEvent[]>({
queryKey: WEBHOOK_EVENTS_KEY,
queryFn: async () => {
const response = await webhooksApi.getEvents();
return response.events;
},
staleTime: 1000 * 60 * 60, // 1 hour - events don't change often
});
}
// Get webhook deliveries
export function useWebhookDeliveries(
webhookId: string,
params?: { status?: DeliveryStatus; eventType?: string; page?: number; limit?: number }
) {
return useQuery<PaginatedDeliveries>({
queryKey: [...WEBHOOK_DELIVERIES_KEY(webhookId), params],
queryFn: () => webhooksApi.getDeliveries(webhookId, params),
enabled: !!webhookId,
});
}
// Create webhook
export function useCreateWebhook() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: CreateWebhookRequest) => webhooksApi.create(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: WEBHOOKS_KEY });
},
});
}
// Update webhook
export function useUpdateWebhook() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: string; data: UpdateWebhookRequest }) =>
webhooksApi.update(id, data),
onSuccess: (_, { id }) => {
queryClient.invalidateQueries({ queryKey: WEBHOOKS_KEY });
queryClient.invalidateQueries({ queryKey: WEBHOOK_KEY(id) });
},
});
}
// Delete webhook
export function useDeleteWebhook() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => webhooksApi.delete(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: WEBHOOKS_KEY });
},
});
}
// Toggle webhook active status
export function useToggleWebhook() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, isActive }: { id: string; isActive: boolean }) =>
webhooksApi.update(id, { isActive }),
onSuccess: (_, { id }) => {
queryClient.invalidateQueries({ queryKey: WEBHOOKS_KEY });
queryClient.invalidateQueries({ queryKey: WEBHOOK_KEY(id) });
},
});
}
// Regenerate secret
export function useRegenerateWebhookSecret() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => webhooksApi.regenerateSecret(id),
onSuccess: (_, id) => {
queryClient.invalidateQueries({ queryKey: WEBHOOK_KEY(id) });
},
});
}
// Test webhook
export function useTestWebhook() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, payload }: { id: string; payload?: { eventType?: string; payload?: Record<string, any> } }) =>
webhooksApi.test(id, payload),
onSuccess: (_, { id }) => {
queryClient.invalidateQueries({ queryKey: WEBHOOK_DELIVERIES_KEY(id) });
},
});
}
// Retry delivery
export function useRetryDelivery() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ webhookId, deliveryId }: { webhookId: string; deliveryId: string }) =>
webhooksApi.retryDelivery(webhookId, deliveryId),
onSuccess: (_, { webhookId }) => {
queryClient.invalidateQueries({ queryKey: WEBHOOK_DELIVERIES_KEY(webhookId) });
queryClient.invalidateQueries({ queryKey: WEBHOOK_KEY(webhookId) });
},
});
}