Files
Charon/frontend/src/hooks/useDNSProviders.ts
2026-01-26 19:22:05 +00:00

118 lines
3.0 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import {
getDNSProviders,
getDNSProvider,
getDNSProviderTypes,
createDNSProvider,
updateDNSProvider,
deleteDNSProvider,
testDNSProvider,
testDNSProviderCredentials,
type DNSProvider,
type DNSProviderRequest,
type DNSProviderTypeInfo,
type DNSProviderField,
type DNSTestResult,
} from '../api/dnsProviders'
/** Query key factory for DNS providers */
const queryKeys = {
all: ['dns-providers'] as const,
lists: () => [...queryKeys.all, 'list'] as const,
list: () => [...queryKeys.lists()] as const,
details: () => [...queryKeys.all, 'detail'] as const,
detail: (id: number) => [...queryKeys.details(), id] as const,
types: () => [...queryKeys.all, 'types'] as const,
}
/**
* Hook for fetching all DNS providers.
* @returns Query result with providers array
*/
export function useDNSProviders() {
return useQuery({
queryKey: queryKeys.list(),
queryFn: getDNSProviders,
})
}
/**
* Hook for fetching a single DNS provider.
* @param id - DNS provider ID
* @returns Query result with provider data
*/
export function useDNSProvider(id: number) {
return useQuery({
queryKey: queryKeys.detail(id),
queryFn: () => getDNSProvider(id),
enabled: id > 0,
})
}
/**
* Hook for fetching supported DNS provider types.
* @returns Query result with provider types array
*/
export function useDNSProviderTypes() {
return useQuery({
queryKey: queryKeys.types(),
queryFn: getDNSProviderTypes,
staleTime: 1000 * 60 * 60, // 1 hour - types rarely change
})
}
/**
* Hook providing DNS provider mutation operations.
* @returns Object with mutation functions for create, update, delete, and test
*/
export function useDNSProviderMutations() {
const queryClient = useQueryClient()
const createMutation = useMutation({
mutationFn: (data: DNSProviderRequest) => createDNSProvider(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: queryKeys.list() })
},
})
const updateMutation = useMutation({
mutationFn: ({ id, data }: { id: number; data: DNSProviderRequest }) =>
updateDNSProvider(id, data),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({ queryKey: queryKeys.list() })
queryClient.invalidateQueries({ queryKey: queryKeys.detail(variables.id) })
},
})
const deleteMutation = useMutation({
mutationFn: (id: number) => deleteDNSProvider(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: queryKeys.list() })
},
})
const testMutation = useMutation({
mutationFn: (id: number) => testDNSProvider(id),
})
const testCredentialsMutation = useMutation({
mutationFn: (data: DNSProviderRequest) => testDNSProviderCredentials(data),
})
return {
createMutation,
updateMutation,
deleteMutation,
testMutation,
testCredentialsMutation,
}
}
export type {
DNSProvider,
DNSProviderRequest,
DNSProviderTypeInfo,
DNSProviderField,
DNSTestResult,
}