diff --git a/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx b/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx index 0eecc8e2e..556322084 100644 --- a/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx +++ b/packages/widgets/src/_inputs/widget-multiReleasesRepositories-input.tsx @@ -509,19 +509,19 @@ interface ReleasesRepositoryImport extends ReleasesRepository { alreadyImported: boolean; } -interface ContainerImageSelectorProps { - containerImage: ReleasesRepositoryImport; +interface ImportRepositorySelectProps { + repository: ReleasesRepositoryImport; integration?: Integration; versionFilterPrecisionOptions: string[]; onImageSelectionChanged?: (isSelected: boolean) => void; } -const ContainerImageSelector = ({ - containerImage, +const ImportRepositorySelect = ({ + repository, integration, versionFilterPrecisionOptions, onImageSelectionChanged, -}: ContainerImageSelectorProps) => { +}: ImportRepositorySelectProps) => { const tRepository = useScopedI18n("widget.releases.option.repositories"); const checkBoxProps: CheckboxProps = !onImageSelectionChanged ? { @@ -539,29 +539,29 @@ const ContainerImageSelector = ({ label={ - {containerImage.identifier} + {repository.identifier} } {...checkBoxProps} /> - {containerImage.versionFilter && ( + {repository.versionFilter && ( {tRepository("versionFilter.label")}: - {containerImage.versionFilter.prefix && containerImage.versionFilter.prefix} + {repository.versionFilter.prefix && repository.versionFilter.prefix} - {versionFilterPrecisionOptions[containerImage.versionFilter.precision]} + {versionFilterPrecisionOptions[repository.versionFilter.precision]} - {containerImage.versionFilter.suffix && containerImage.versionFilter.suffix} + {repository.versionFilter.suffix && repository.versionFilter.suffix} )} @@ -610,36 +610,47 @@ const RepositoryImportModal = createModal(({ innerProps, enabled: innerProps.isAdmin, }); - const containersImages: ReleasesRepositoryImport[] = useMemo( + const importRepositories: ReleasesRepositoryImport[] = useMemo( () => - docker.data?.containers.reduce((acc, containerImage) => { - const imageParts = containerImage.image.split("/"); - const source = imageParts.length > 1 ? imageParts[0] : "docker.io"; - const identifierImage = imageParts.length > 1 ? imageParts[1] : imageParts[0]; + docker.data?.containers.reduce((acc, container) => { + const [maybeSource, maybeIdentifierAndVersion] = container.image.split(/\/(.*)/); + const hasSource = maybeSource && maybeSource in sourceToProviderKind; + const source = hasSource ? maybeSource : "docker.io"; + const identifierAndVersion = hasSource ? maybeIdentifierAndVersion : container.image; - if (!source || !identifierImage) return acc; + if (!identifierAndVersion) return acc; - const providerKey = source in containerImageToProviderKind ? containerImageToProviderKind[source] : "dockerHub"; + const providerKey = sourceToProviderKind[source]; const integrationId = Object.values(innerProps.integrations).find( (integration) => integration.kind === providerKey, )?.id; - const [identifier, version] = identifierImage.split(":"); + const [identifier, version] = identifierAndVersion.split(":"); if (!identifier || !integrationId) return acc; - if (acc.some((item) => item.providerIntegrationId === integrationId && item.identifier === identifier)) + if ( + acc.some( + (item) => + item.providerIntegrationId !== undefined && + innerProps.integrations[item.providerIntegrationId]?.kind === providerKey && + item.identifier === identifier, + ) + ) return acc; acc.push({ id: createId(), providerIntegrationId: integrationId, identifier, - iconUrl: containerImage.iconUrl ?? undefined, + iconUrl: container.iconUrl ?? undefined, name: formatIdentifierName(identifier), versionFilter: version ? parseImageVersionToVersionFilter(version) : undefined, alreadyImported: innerProps.repositories.some( - (item) => item.providerIntegrationId === integrationId && item.identifier === identifier, + (item) => + item.providerIntegrationId !== undefined && + innerProps.integrations[item.providerIntegrationId]?.kind === providerKey && + item.identifier === identifier, ), }); return acc; @@ -657,13 +668,13 @@ const RepositoryImportModal = createModal(({ innerProps, }, [innerProps, selectedImages, actions]); const allImagesImported = useMemo( - () => containersImages.every((containerImage) => containerImage.alreadyImported), - [containersImages], + () => importRepositories.every((repository) => repository.alreadyImported), + [importRepositories], ); const anyImagesImported = useMemo( - () => containersImages.some((containerImage) => containerImage.alreadyImported), - [containersImages], + () => importRepositories.some((repository) => repository.alreadyImported), + [importRepositories], ); return ( @@ -673,7 +684,7 @@ const RepositoryImportModal = createModal(({ innerProps, {tRepository("importRepositories.loading")} - ) : containersImages.length === 0 ? ( + ) : importRepositories.length === 0 ? ( {tRepository("importRepositories.noImagesFound")} @@ -694,23 +705,23 @@ const RepositoryImportModal = createModal(({ innerProps, {!allImagesImported && - containersImages - .filter((containerImage) => !containerImage.alreadyImported) - .map((containerImage) => { - const integration = containerImage.providerIntegrationId - ? innerProps.integrations[containerImage.providerIntegrationId] + importRepositories + .filter((repository) => !repository.alreadyImported) + .map((repository) => { + const integration = repository.providerIntegrationId + ? innerProps.integrations[repository.providerIntegrationId] : undefined; return ( - isSelected - ? setSelectedImages([...selectedImages, containerImage]) - : setSelectedImages(selectedImages.filter((img) => img !== containerImage)) + ? setSelectedImages([...selectedImages, repository]) + : setSelectedImages(selectedImages.filter((img) => img !== repository)) } /> ); @@ -723,17 +734,17 @@ const RepositoryImportModal = createModal(({ innerProps, {anyImagesImported && - containersImages - .filter((containerImage) => containerImage.alreadyImported) - .map((containerImage) => { - const integration = containerImage.providerIntegrationId - ? innerProps.integrations[containerImage.providerIntegrationId] + importRepositories + .filter((repository) => repository.alreadyImported) + .map((repository) => { + const integration = repository.providerIntegrationId + ? innerProps.integrations[repository.providerIntegrationId] : undefined; return ( - @@ -763,7 +774,7 @@ const RepositoryImportModal = createModal(({ innerProps, size: "xl", }); -const containerImageToProviderKind: Record = { +const sourceToProviderKind: Record = { "ghcr.io": "github", "docker.io": "dockerHub", };