Files
saksham 1a4c80958f Initial commit: CI Agent competitive-intelligence monitoring app
FastAPI + Celery + Next.js + Postgres/Redis app with company monitoring,
source collection, LLM-based change analysis, enrichment, and account
security (Turnstile, escalating lockout, email verification).
2026-08-05 10:48:20 -04:00

50 lines
1.3 KiB
TypeScript

"use client";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { api } from "@/lib/api-client";
import type { AlertListFilters, AlertUpdatePayload } from "@/lib/types";
export function useAlerts(filters: AlertListFilters = {}) {
return useQuery({
queryKey: ["alerts", filters],
queryFn: () => api.listAlerts(filters),
});
}
export function useAlert(alertId: string | undefined) {
return useQuery({
queryKey: ["alerts", "detail", alertId],
queryFn: () => api.getAlert(alertId as string),
enabled: Boolean(alertId),
});
}
function useInvalidateAlerts() {
const queryClient = useQueryClient();
return () => queryClient.invalidateQueries({ queryKey: ["alerts"] });
}
export function useUpdateAlert(alertId: string) {
const invalidate = useInvalidateAlerts();
return useMutation({
mutationFn: (payload: AlertUpdatePayload) => api.updateAlert(alertId, payload),
onSuccess: invalidate,
});
}
export function useMarkAlertRead() {
const invalidate = useInvalidateAlerts();
return useMutation({
mutationFn: (alertId: string) => api.markAlertRead(alertId),
onSuccess: invalidate,
});
}
export function useResolveAlert() {
const invalidate = useInvalidateAlerts();
return useMutation({
mutationFn: (alertId: string) => api.resolveAlert(alertId),
onSuccess: invalidate,
});
}