mirror of https://github.com/portainer/portainer
86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
|
import { EnvironmentId } from '@/portainer/environments/types';
|
||
|
import {
|
||
|
ContainerInstanceFormValues,
|
||
|
ProviderViewModel,
|
||
|
ResourceGroup,
|
||
|
Subscription,
|
||
|
} from '@/react/azure/types';
|
||
|
import { parseAccessControlFormData } from '@/portainer/access-control/utils';
|
||
|
import { useIsAdmin } from '@/portainer/hooks/useUser';
|
||
|
import { useProvider } from '@/react/azure/queries/useProvider';
|
||
|
import { useResourceGroups } from '@/react/azure/queries/useResourceGroups';
|
||
|
import { useSubscriptions } from '@/react/azure/queries/useSubscriptions';
|
||
|
|
||
|
import {
|
||
|
getSubscriptionLocations,
|
||
|
getSubscriptionResourceGroups,
|
||
|
} from './utils';
|
||
|
|
||
|
export function useLoadFormState(environmentId: EnvironmentId) {
|
||
|
const { data: subscriptions, isLoading: isLoadingSubscriptions } =
|
||
|
useSubscriptions(environmentId);
|
||
|
const { resourceGroups, isLoading: isLoadingResourceGroups } =
|
||
|
useResourceGroups(environmentId, subscriptions);
|
||
|
const { providers, isLoading: isLoadingProviders } = useProvider(
|
||
|
environmentId,
|
||
|
subscriptions
|
||
|
);
|
||
|
|
||
|
const isLoading =
|
||
|
isLoadingSubscriptions || isLoadingResourceGroups || isLoadingProviders;
|
||
|
|
||
|
return { isLoading, subscriptions, resourceGroups, providers };
|
||
|
}
|
||
|
|
||
|
export function useFormState(
|
||
|
subscriptions: Subscription[] = [],
|
||
|
resourceGroups: Record<string, ResourceGroup[]> = {},
|
||
|
providers: Record<string, ProviderViewModel> = {}
|
||
|
) {
|
||
|
const isAdmin = useIsAdmin();
|
||
|
|
||
|
const subscriptionOptions = subscriptions.map((s) => ({
|
||
|
value: s.subscriptionId,
|
||
|
label: s.displayName,
|
||
|
}));
|
||
|
|
||
|
const initSubscriptionId = getFirstValue(subscriptionOptions);
|
||
|
|
||
|
const subscriptionResourceGroups = getSubscriptionResourceGroups(
|
||
|
initSubscriptionId,
|
||
|
resourceGroups
|
||
|
);
|
||
|
|
||
|
const subscriptionLocations = getSubscriptionLocations(
|
||
|
initSubscriptionId,
|
||
|
providers
|
||
|
);
|
||
|
|
||
|
const initialValues: ContainerInstanceFormValues = {
|
||
|
name: '',
|
||
|
location: getFirstValue(subscriptionLocations),
|
||
|
subscription: initSubscriptionId,
|
||
|
resourceGroup: getFirstValue(subscriptionResourceGroups),
|
||
|
image: '',
|
||
|
os: 'Linux',
|
||
|
memory: 1,
|
||
|
cpu: 1,
|
||
|
ports: [{ container: 80, host: 80, protocol: 'TCP' }],
|
||
|
allocatePublicIP: true,
|
||
|
accessControl: parseAccessControlFormData(isAdmin),
|
||
|
};
|
||
|
|
||
|
return {
|
||
|
initialValues,
|
||
|
subscriptionOptions,
|
||
|
};
|
||
|
|
||
|
function getFirstValue<T>(arr: { value: T }[]) {
|
||
|
if (arr.length === 0) {
|
||
|
return undefined;
|
||
|
}
|
||
|
|
||
|
return arr[0].value;
|
||
|
}
|
||
|
}
|