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

149 lines
4.2 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import {
getCredentials,
getCredential,
createCredential,
updateCredential,
deleteCredential,
testCredential,
enableMultiCredentials,
type DNSProviderCredential,
type CredentialRequest,
type CredentialTestResult,
} from '../api/credentials'
/** Query key factory for credentials */
export const credentialQueryKeys = {
all: ['credentials'] as const,
byProvider: (providerId: number) => [...credentialQueryKeys.all, 'provider', providerId] as const,
detail: (providerId: number, credentialId: number) =>
[...credentialQueryKeys.all, 'provider', providerId, 'detail', credentialId] as const,
}
/**
* Hook for fetching all credentials for a DNS provider.
* @param providerId - DNS provider ID
* @returns Query result with credentials array
*/
export function useCredentials(providerId: number) {
return useQuery({
queryKey: credentialQueryKeys.byProvider(providerId),
queryFn: () => getCredentials(providerId),
enabled: providerId > 0,
})
}
/**
* Hook for fetching a single credential.
* @param providerId - DNS provider ID
* @param credentialId - Credential ID
* @returns Query result with credential data
*/
export function useCredential(providerId: number, credentialId: number) {
return useQuery({
queryKey: credentialQueryKeys.detail(providerId, credentialId),
queryFn: () => getCredential(providerId, credentialId),
enabled: providerId > 0 && credentialId > 0,
})
}
/**
* Hook for creating a new credential.
* @returns Mutation function for creating credentials
*/
export function useCreateCredential() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ providerId, data }: { providerId: number; data: CredentialRequest }) =>
createCredential(providerId, data),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({
queryKey: credentialQueryKeys.byProvider(variables.providerId),
})
},
})
}
/**
* Hook for updating an existing credential.
* @returns Mutation function for updating credentials
*/
export function useUpdateCredential() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({
providerId,
credentialId,
data,
}: {
providerId: number
credentialId: number
data: CredentialRequest
}) => updateCredential(providerId, credentialId, data),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({
queryKey: credentialQueryKeys.byProvider(variables.providerId),
})
queryClient.invalidateQueries({
queryKey: credentialQueryKeys.detail(variables.providerId, variables.credentialId),
})
},
})
}
/**
* Hook for deleting a credential.
* @returns Mutation function for deleting credentials
*/
export function useDeleteCredential() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({ providerId, credentialId }: { providerId: number; credentialId: number }) =>
deleteCredential(providerId, credentialId),
onSuccess: (_, variables) => {
queryClient.invalidateQueries({
queryKey: credentialQueryKeys.byProvider(variables.providerId),
})
},
})
}
/**
* Hook for testing a credential.
* @returns Mutation function for testing credentials
*/
export function useTestCredential() {
return useMutation({
mutationFn: ({ providerId, credentialId }: { providerId: number; credentialId: number }) =>
testCredential(providerId, credentialId),
})
}
/**
* Hook for enabling multi-credential mode.
* @returns Mutation function for enabling multi-credential mode
*/
export function useEnableMultiCredentials() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: (providerId: number) => enableMultiCredentials(providerId),
onSuccess: (_, providerId) => {
// Invalidate DNS provider queries to refresh use_multi_credentials flag
queryClient.invalidateQueries({ queryKey: ['dns-providers'] })
queryClient.invalidateQueries({
queryKey: credentialQueryKeys.byProvider(providerId),
})
},
})
}
export type {
DNSProviderCredential,
CredentialRequest,
CredentialTestResult,
}