Files
Charon/frontend/src/hooks/useDNSDetection.ts

67 lines
1.9 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import {
detectDNSProvider,
getDetectionPatterns,
type DetectionResult,
type NameserverPattern,
} from '../api/dnsDetection'
/** Query key factory for DNS detection */
const queryKeys = {
all: ['dns-detection'] as const,
results: () => [...queryKeys.all, 'results'] as const,
result: (domain: string) => [...queryKeys.results(), domain] as const,
patterns: () => [...queryKeys.all, 'patterns'] as const,
}
/**
* Hook for detecting DNS provider for a domain.
* Results are cached for 1 hour per domain.
* @returns Mutation function with detection result
*/
export function useDetectDNSProvider() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (domain: string) => detectDNSProvider(domain),
onSuccess: (result, domain) => {
// Cache result for 1 hour
queryClient.setQueryData(queryKeys.result(domain), result, {
updatedAt: Date.now(),
})
},
})
}
/**
* Hook for fetching cached detection result for a domain.
* @param domain - Domain to get cached result for
* @returns Query result with detection data
*/
export function useCachedDetectionResult(domain: string, enabled = false) {
return useQuery({
queryKey: queryKeys.result(domain),
queryFn: () => detectDNSProvider(domain),
enabled: enabled && !!domain,
staleTime: 60 * 60 * 1000, // 1 hour
gcTime: 60 * 60 * 1000, // Keep cached for 1 hour
})
}
/**
* Hook for fetching nameserver detection patterns.
* Patterns are cached for 24 hours as they rarely change.
* @returns Query result with patterns array
*/
export function useDetectionPatterns() {
return useQuery({
queryKey: queryKeys.patterns(),
queryFn: getDetectionPatterns,
staleTime: 24 * 60 * 60 * 1000, // 24 hours
gcTime: 24 * 60 * 60 * 1000,
})
}
export type { DetectionResult, NameserverPattern }