Files
grafana/public/app/features/provisioning/hooks/useGetResourceRepositoryView.ts
Alex Khomenko 6a11d462cb API: Support versioned frontend clients (#106545)
* Update the generator to include version

* Add versioned APIs

* Update imports

* Prettier
2025-06-13 13:24:37 +03:00

83 lines
2.3 KiB
TypeScript

import { skipToken } from '@reduxjs/toolkit/query/react';
import { Folder, useGetFolderQuery } from 'app/api/clients/folder/v1beta1';
import { RepositoryView, useGetFrontendSettingsQuery } from 'app/api/clients/provisioning/v0alpha1';
import { AnnoKeyManagerIdentity } from 'app/features/apiserver/types';
interface GetResourceRepositoryArgs {
name?: string; // the repository name
folderName?: string; // folder we are targeting
}
interface RepositoryViewData {
repository?: RepositoryView;
folder?: Folder;
isLoading?: boolean;
isInstanceManaged: boolean;
}
// This is safe to call as a viewer (you do not need full access to the Repository configs)
export const useGetResourceRepositoryView = ({ name, folderName }: GetResourceRepositoryArgs): RepositoryViewData => {
const { data: settingsData, isLoading: isSettingsLoading } = useGetFrontendSettingsQuery();
const skipFolderQuery = name || !folderName;
const { data: folder, isLoading: isFolderLoading } = useGetFolderQuery(
skipFolderQuery ? skipToken : { name: folderName }
);
if (isSettingsLoading || isFolderLoading) {
return { isLoading: true, isInstanceManaged: false };
}
const items = settingsData?.items ?? [];
if (!items.length) {
return { folder, isInstanceManaged: false };
}
const instanceRepo = items.find((repo) => repo.target === 'instance');
const isInstanceManaged = Boolean(instanceRepo);
if (name) {
const repository = items.find((repo) => repo.name === name);
if (repository) {
return {
repository,
folder,
isInstanceManaged,
};
}
}
// Find the matching folder repository
if (folderName) {
// For root values it will be the same
let repository = items.find((repo) => repo.name === folderName);
if (repository) {
return {
repository,
folder,
isInstanceManaged,
};
}
// For nested folders we need to see what the folder thinks
const annotatedFolderName = folder?.metadata?.annotations?.[AnnoKeyManagerIdentity];
if (annotatedFolderName) {
repository = items.find((repo) => repo.name === annotatedFolderName);
if (repository) {
return {
repository,
folder,
isInstanceManaged,
};
}
}
}
return {
repository: instanceRepo,
folder,
isInstanceManaged,
};
};