import React, { useState, useContext } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import useDeepCompareEffect from 'use-deep-compare-effect';
import { ExpandableSection, SelectOption } from '@patternfly/react-core';
import { STATUS } from 'foremanReact/constants';
import { translate as __ } from 'foremanReact/common/I18n';
import EnvironmentPaths from '../../../../components/EnvironmentPaths/EnvironmentPaths';
import getContentViews from '../../../../ContentViewsActions';
import { selectContentViewError, selectContentViews, selectContentViewStatus } from '../../../../ContentViewSelectors';
import AffectedActivationKeys from '../affectedActivationKeys';
import DeleteContext from '../DeleteContext';
import ContentViewSelect from '../../../../components/ContentViewSelect/ContentViewSelect';
const CVReassignActivationKeysForm = () => {
const dispatch = useDispatch();
const contentViewsInEnvResponse = useSelector(selectContentViews);
const contentViewsInEnvStatus = useSelector(selectContentViewStatus);
const contentViewsInEnvError = useSelector(selectContentViewError);
const cvInEnvLoading = contentViewsInEnvStatus === STATUS.PENDING;
const [cvSelectOpen, setCVSelectOpen] = useState(false);
const [cvSelectOptions, setCvSelectionOptions] = useState([]);
const [showActivationKeys, setShowActivationKeys] = useState(false);
const {
currentStep, selectedEnvForAK, versionEnvironments, cvId, selectedEnvSet,
setSelectedEnvForAK, selectedCVForAK, setSelectedCVNameForAK, setSelectedCVForAK,
} = useContext(DeleteContext);
// Fetch content views for selected environment to reassign activation keys to.
useDeepCompareEffect(
() => {
if (selectedEnvForAK.length) {
dispatch(getContentViews({
environment_id: selectedEnvForAK[0].id,
include_default: true,
full_result: true,
}));
}
setCVSelectOpen(false);
},
[selectedEnvForAK, dispatch, setCVSelectOpen],
);
// Upon receiving CVs in selected env, form select options for the content view drop down
useDeepCompareEffect(() => {
const { results } = contentViewsInEnvResponse;
// Filter out the cv in the environments that are currently being removed
const contentViewEligible = (cv) => {
if (cv.id === cvId) {
const selectedEnv = versionEnvironments.filter(env => selectedEnvSet.has(env.id));
return (selectedEnv.filter(env => env.id === selectedEnvForAK[0]?.id).length === 0);
}
return true;
};
if (!cvInEnvLoading && results && selectedEnvForAK.length) {
setCvSelectionOptions(results.map(cv => ((contentViewEligible(cv)) ?
(
{cv.name}
) : null)).filter(n => n));
}
if (!cvInEnvLoading && results && selectedCVForAK &&
results.filter(cv => cv.id === selectedCVForAK && contentViewEligible(cv)).length === 0) {
setSelectedCVForAK(null);
setSelectedCVNameForAK(null);
}
}, [contentViewsInEnvResponse, contentViewsInEnvStatus, currentStep,
contentViewsInEnvError, selectedEnvForAK, setSelectedCVForAK, setSelectedCVNameForAK,
cvInEnvLoading, selectedCVForAK, cvId, versionEnvironments, selectedEnvSet]);
const fetchSelectedCVName = (id) => {
const { results } = contentViewsInEnvResponse ?? { };
return results.filter(cv => cv.id === id)[0]?.name;
};
const onClear = () => {
setSelectedCVForAK(null);
setSelectedCVNameForAK(null);
};
const onSelect = (event, selection) => {
setSelectedCVForAK(selection);
setSelectedCVNameForAK(fetchSelectedCVName(selection));
setCVSelectOpen(false);
};
return (
<>
{!cvInEnvLoading && selectedEnvForAK.length > 0 &&
setCVSelectOpen(isExpanded)}
placeholderText={(cvSelectOptions.length === 0) ? __('No content views available') : __('Select a content view')}
>
{cvSelectOptions}
}
setShowActivationKeys(expanded)}
isExpanded={showActivationKeys}
>
>
);
};
export default CVReassignActivationKeysForm;