149 lines
4.2 KiB
TypeScript
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,
|
|
}
|