portainer/app/react/docker/containers/CreateView/useInitialValues.ts

167 lines
4.9 KiB
TypeScript

import { useCurrentStateAndParams } from '@uirouter/react';
import {
BaseFormValues,
baseFormUtils,
} from '@/react/docker/containers/CreateView/BaseForm';
import {
CapabilitiesTabValues,
capabilitiesTabUtils,
} from '@/react/docker/containers/CreateView/CapabilitiesTab';
import {
CommandsTabValues,
commandsTabUtils,
} from '@/react/docker/containers/CreateView/CommandsTab';
import {
LabelsTabValues,
labelsTabUtils,
} from '@/react/docker/containers/CreateView/LabelsTab';
import {
NetworkTabValues,
networkTabUtils,
} from '@/react/docker/containers/CreateView/NetworkTab';
import {
ResourcesTabValues,
resourcesTabUtils,
} from '@/react/docker/containers/CreateView/ResourcesTab';
import {
RestartPolicy,
restartPolicyTabUtils,
} from '@/react/docker/containers/CreateView/RestartPolicyTab';
import {
VolumesTabValues,
volumesTabUtils,
} from '@/react/docker/containers/CreateView/VolumesTab';
import { envVarsTabUtils } from '@/react/docker/containers/CreateView/EnvVarsTab';
import { UserId } from '@/portainer/users/types';
import { getImageConfig } from '@/react/portainer/registries/utils/getImageConfig';
import { useEnvironmentId } from '@/react/hooks/useEnvironmentId';
import { useCurrentUser } from '@/react/hooks/useUser';
import { useWebhooks } from '@/react/portainer/webhooks/useWebhooks';
import { useEnvironmentRegistries } from '@/react/portainer/environments/queries/useEnvironmentRegistries';
import { EnvVarValues } from '@@/form-components/EnvironmentVariablesFieldset';
import { useNetworksForSelector } from '../components/NetworkSelector';
import { useContainers } from '../queries/containers';
import { useContainer } from '../queries/container';
export interface Values extends BaseFormValues {
commands: CommandsTabValues;
volumes: VolumesTabValues;
network: NetworkTabValues;
labels: LabelsTabValues;
restartPolicy: RestartPolicy;
resources: ResourcesTabValues;
capabilities: CapabilitiesTabValues;
env: EnvVarValues;
}
export function useInitialValues(submitting: boolean) {
const {
params: { nodeName, from },
} = useCurrentStateAndParams();
const environmentId = useEnvironmentId();
const { isAdmin, user } = useCurrentUser();
const networksQuery = useNetworksForSelector();
const fromContainerQuery = useContainer(environmentId, from, {
enabled: !submitting,
});
const runningContainersQuery = useContainers(environmentId, {
enabled: !!from,
});
const webhookQuery = useWebhooks(
{ endpointId: environmentId, resourceId: from },
{ enabled: !!from }
);
const registriesQuery = useEnvironmentRegistries(environmentId, {
enabled: !!from,
});
if (!networksQuery.data) {
return null;
}
if (!from) {
return {
initialValues: defaultValues(isAdmin, user.Id, nodeName),
};
}
const fromContainer = fromContainerQuery.data;
if (
!fromContainer ||
!registriesQuery.data ||
!runningContainersQuery.data ||
!webhookQuery.data
) {
return null;
}
const network = networkTabUtils.toViewModel(
fromContainer,
networksQuery.data,
runningContainersQuery.data
);
const extraNetworks = Object.entries(
fromContainer.NetworkSettings?.Networks || {}
)
.filter(([n]) => n !== network.networkMode)
.map(([networkName, network]) => ({
networkName,
aliases: (network.Aliases || []).filter(
(o) => !fromContainer.Id?.startsWith(o)
),
}));
const imageConfig = getImageConfig(
fromContainer?.Config?.Image || '',
registriesQuery.data
);
const initialValues: Values = {
commands: commandsTabUtils.toViewModel(fromContainer),
volumes: volumesTabUtils.toViewModel(fromContainer),
network: networkTabUtils.toViewModel(
fromContainer,
networksQuery.data,
runningContainersQuery.data
),
labels: labelsTabUtils.toViewModel(fromContainer),
restartPolicy: restartPolicyTabUtils.toViewModel(fromContainer),
resources: resourcesTabUtils.toViewModel(fromContainer),
capabilities: capabilitiesTabUtils.toViewModel(fromContainer),
env: envVarsTabUtils.toViewModel(fromContainer),
...baseFormUtils.toViewModel(
fromContainer,
isAdmin,
user.Id,
nodeName,
imageConfig,
(webhookQuery.data?.length || 0) > 0
),
};
return { initialValues, isDuplicating: true, extraNetworks };
}
function defaultValues(
isAdmin: boolean,
currentUserId: UserId,
nodeName: string
): Values {
return {
commands: commandsTabUtils.getDefaultViewModel(),
volumes: volumesTabUtils.getDefaultViewModel(),
network: networkTabUtils.getDefaultViewModel(),
labels: labelsTabUtils.getDefaultViewModel(),
restartPolicy: restartPolicyTabUtils.getDefaultViewModel(),
resources: resourcesTabUtils.getDefaultViewModel(),
capabilities: capabilitiesTabUtils.getDefaultViewModel(),
env: envVarsTabUtils.getDefaultViewModel(),
...baseFormUtils.getDefaultViewModel(isAdmin, currentUserId, nodeName),
};
}