Files
2026-07-13 12:08:39 +08:00

68 lines
1.6 KiB
TypeScript

import { isAxiosError } from '@/portainer/services/axios/utils/isAxiosError';
import { isDefaultResponse } from '../../services/axios/utils/parseAxiosError';
import { useGitRefs } from '../queries/useGitRefs';
interface Params {
force?: boolean;
sourceId?: number;
enabled?: boolean;
onSettled?(isValid?: boolean): void;
onAfterSettle?(): void;
}
export function useGitRepoValidity({
sourceId,
force,
enabled,
onSettled,
onAfterSettle,
}: Params) {
const query = useGitRefs(
{
sourceId: sourceId!,
force,
},
{
enabled: !!sourceId && enabled,
select: () => true,
suppressError: true,
onSettled(isValid) {
if (onSettled) {
onSettled(isValid);
}
if (onAfterSettle) {
onAfterSettle();
}
},
}
);
const errorMessage = getGitValidityError(query.error, !!sourceId);
const isChecking = query.isInitialLoading || query.isFetching;
return {
isValid: !!query.data && !query.isError,
isChecking,
hasError: query.isError,
errorMessage,
query,
} as const;
}
export function getGitValidityError(error: unknown, hasCreds: boolean) {
if (!isAxiosError(error)) return undefined;
const responseData = error.response?.data;
const details = isDefaultResponse(responseData)
? (responseData.details ?? '')
: '';
if (
!hasCreds &&
details === 'Authentication required: Repository not found.'
) {
return 'Git repository could not be found or is private, please ensure that the URL is correct or credentials are provided.';
}
return details || undefined;
}