mirror of
https://github.com/portainer/portainer.git
synced 2025-07-19 05:19:39 +02:00
feat(helm): add registry dropdown [r8s-340] (#779)
This commit is contained in:
parent
c9e3717ce3
commit
1963edda66
16 changed files with 288 additions and 190 deletions
|
@ -1,66 +1,11 @@
|
|||
import { useQuery, useQueries } from '@tanstack/react-query';
|
||||
import { useQueries } from '@tanstack/react-query';
|
||||
import { compact, flatMap } from 'lodash';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
import axios, { parseAxiosError } from '@/portainer/services/axios';
|
||||
import axios from '@/portainer/services/axios';
|
||||
import { withGlobalError } from '@/react-tools/react-query';
|
||||
import { UserId } from '@/portainer/users/types';
|
||||
|
||||
import { Chart, HelmChartsResponse, HelmRepositoriesResponse } from '../types';
|
||||
|
||||
/**
|
||||
* Get Helm repositories for user
|
||||
*/
|
||||
export async function getHelmRepositories(userId: UserId) {
|
||||
try {
|
||||
const { data } = await axios.get<HelmRepositoriesResponse>(
|
||||
`users/${userId}/helm/repositories`
|
||||
);
|
||||
const repos = compact([
|
||||
// compact will remove the global repository if it's empty
|
||||
data.GlobalRepository.toLowerCase(),
|
||||
...data.UserRepositories.map((repo) => repo.URL.toLowerCase()),
|
||||
]);
|
||||
return [...new Set(repos)];
|
||||
} catch (err) {
|
||||
throw parseAxiosError(err, 'Unable to retrieve helm repositories for user');
|
||||
}
|
||||
}
|
||||
|
||||
async function getChartsFromRepo(repo: string): Promise<Chart[]> {
|
||||
try {
|
||||
// Construct the URL with required repo parameter
|
||||
const response = await axios.get<HelmChartsResponse>('templates/helm', {
|
||||
params: { repo },
|
||||
});
|
||||
|
||||
return compact(
|
||||
Object.values(response.data.entries).map((versions) =>
|
||||
versions[0] ? { ...versions[0], repo } : null
|
||||
)
|
||||
);
|
||||
} catch (error) {
|
||||
// Ignore errors from chart repositories as some may error but others may not
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook to fetch all accessible Helm repositories for a user
|
||||
*
|
||||
* @param userId User ID
|
||||
* @returns Query result with list of repository URLs
|
||||
*/
|
||||
export function useHelmRepositories(userId: number) {
|
||||
return useQuery(
|
||||
[userId, 'helm-repositories'],
|
||||
() => getHelmRepositories(userId),
|
||||
{
|
||||
enabled: !!userId,
|
||||
...withGlobalError('Unable to retrieve Helm repositories'),
|
||||
}
|
||||
);
|
||||
}
|
||||
import { Chart, HelmChartsResponse } from '../types';
|
||||
|
||||
/**
|
||||
* React hook to fetch helm charts from the provided repositories
|
||||
|
@ -103,3 +48,28 @@ export function useHelmChartList(userId: number, repositories: string[] = []) {
|
|||
isError: chartQueries.some((q) => q.isError),
|
||||
};
|
||||
}
|
||||
|
||||
async function getChartsFromRepo(repo: string): Promise<Chart[]> {
|
||||
try {
|
||||
// Construct the URL with required repo parameter
|
||||
const response = await axios.get<HelmChartsResponse>('templates/helm', {
|
||||
params: { repo },
|
||||
});
|
||||
|
||||
return compact(
|
||||
Object.values(response.data.entries).map((versions) =>
|
||||
versions[0]
|
||||
? {
|
||||
...versions[0],
|
||||
repo,
|
||||
// versions are within this response too, so we don't need a new query to fetch versions when this is used
|
||||
versions: versions.map((v) => v.version),
|
||||
}
|
||||
: null
|
||||
)
|
||||
);
|
||||
} catch (error) {
|
||||
// Ignore errors from chart repositories as some may error but others may not
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue