import { flatten, omit, uniq } from 'lodash';
import React from 'react';
import { ArtifactActions } from '../artifactActions/ArtifactActions';
import { BaseEnvironment } from '../environmentBaseElements/BaseEnvironment';
import { EnvironmentItem } from '../environmentBaseElements/EnvironmentItem';
import { EnvironmentsRender, useOrderedEnvironment } from '../environmentBaseElements/EnvironmentsRender';
import type { FetchVersionQuery } from '../graphql/graphql-sdk';
import { useFetchVersionQuery } from '../graphql/graphql-sdk';
import type { ITaskArtifactVersionProps } from '../overview/artifact/ArtifactVersionTasks';
import { ArtifactVersionTasks } from '../overview/artifact/ArtifactVersionTasks';
import { Constraints } from '../overview/artifact/Constraints';
import { useCreateVersionRollbackActions } from '../overview/artifact/useCreateRollbackActions.hook';
import { extractVersionRollbackDetails, isVersionVetoed } from '../overview/artifact/utils';
import { useApplicationContextSafe } from '../../presentation';
import { LoadingAnimation } from '../../presentation/LoadingAnimation';
import type {
HistoryArtifactVersionExtended,
PinnedVersions,
SingleVersionArtifactVersion,
VersionData,
} from './types';
import type { VersionMessageData } from '../versionMetadata/MetadataComponents';
import { toPinnedMetadata } from '../versionMetadata/MetadataComponents';
import { getBaseMetadata, getVersionCompareLinks, VersionMetadata } from '../versionMetadata/VersionMetadata';
import './VersionsHistory.less';
interface IVersionInEnvironmentProps {
environment: string;
isPreview?: boolean;
version: HistoryArtifactVersionExtended;
envPinnedVersions?: PinnedVersions[keyof PinnedVersions];
loading: boolean;
detailedVersionData: SingleVersionArtifactVersion | undefined;
}
const VersionInEnvironment = ({
environment,
version,
isPreview,
envPinnedVersions,
detailedVersionData,
loading,
}: IVersionInEnvironmentProps) => {
let pinnedData: VersionMessageData | undefined;
const currentPinnedVersion = envPinnedVersions?.[version.reference];
if (currentPinnedVersion && currentPinnedVersion.buildNumber === version.buildNumber) {
pinnedData = toPinnedMetadata(currentPinnedVersion);
}
const actions = useCreateVersionRollbackActions({
environment,
reference: version.reference,
version: version.version,
isVetoed: isVersionVetoed(version),
isPinned: Boolean(pinnedData),
isCurrent: version.isCurrent,
selectedVersion: extractVersionRollbackDetails(version),
});
const versionProps: ITaskArtifactVersionProps = {
environment,
reference: version.reference,
version: version.version,
isCurrent: version.isCurrent,
};
return (
{!isPreview && (
)}
{loading && }
);
};
const getDetailedVersionData = ({
environment,
version,
versionsDetails,
}: {
environment: string;
version: HistoryArtifactVersionExtended;
versionsDetails: FetchVersionQuery | undefined;
}) => {
const environmentData = versionsDetails?.application?.environments?.find((env) => env.name === environment);
const artifactData = environmentData?.state.artifacts?.find((artifact) => artifact.reference === version.reference);
return artifactData?.versions?.find((v) => v.version === version.version);
};
interface IVersionContentProps {
versionData: VersionData;
pinnedVersions?: PinnedVersions;
}
/**
* VersionContent includes all of the environments and builds that are associated with a single commit sha (unless if the sha is missing)
*/
export const VersionContent = ({ versionData, pinnedVersions }: IVersionContentProps) => {
const ref = React.useRef(null);
const { environments, ...renderProps } = useOrderedEnvironment(ref, Object.entries(versionData.environments));
const app = useApplicationContextSafe();
// Create a list of all the versions of the current commit. Usually, there will be only one.
const versions = uniq(flatten(environments.map(([_, env]) => env.versions.map((v) => v.version))));
const { data: versionsDetails, loading } = useFetchVersionQuery({
variables: { appName: app.name, versions },
});
return (
{environments.map(([env, { versions, isPreview, basedOn, gitMetadata }]) => {
return (
{/* Usually there will be only one version per artifact */}
{versions.map((version) => (
))}
);
})}
);
};