This archive operation might conflict with one or more
scheduled change requests. If you complete it, those change
requests can no longer be applied.
);
}
// all good, we have nothing to show
return null;
};
const useActionButtonText = (projectId: string, isBulkArchive: boolean) => {
const getHighestEnvironment =
useHighestPermissionChangeRequestEnvironment(projectId);
const environment = getHighestEnvironment();
const { isChangeRequestConfiguredForReview } =
useChangeRequestsEnabled(projectId);
if (
environment &&
isChangeRequestConfiguredForReview(environment) &&
isBulkArchive
) {
return 'Add to change request';
}
if (environment && isChangeRequestConfiguredForReview(environment)) {
return 'Add change to draft';
}
if (isBulkArchive) {
return 'Archive flags';
}
return 'Archive flag';
};
const useArchiveAction = ({
projectId,
featureIds,
onSuccess,
onError,
}: {
projectId: string;
featureIds: string[];
onSuccess: () => void;
onError: () => void;
}) => {
const { setToastData, setToastApiError } = useToast();
const { archiveFeatureToggle } = useFeatureApi();
const { archiveFeatures } = useProjectApi();
const { isChangeRequestConfiguredForReview } =
useChangeRequestsEnabled(projectId);
const { addChange } = useChangeRequestApi();
const { refetch: refetchChangeRequests } =
usePendingChangeRequests(projectId);
const getHighestEnvironment =
useHighestPermissionChangeRequestEnvironment(projectId);
const isBulkArchive = featureIds?.length > 1;
const environment = getHighestEnvironment();
const addArchiveToggleToChangeRequest = async () => {
if (!environment) {
console.error('No change request environment');
return;
}
await addChange(
projectId,
environment,
featureIds.map((feature) => ({
action: 'archiveFeature',
feature: feature,
payload: undefined,
})),
);
refetchChangeRequests();
setToastData({
type: 'success',
text: isBulkArchive
? 'Changes added to a draft'
: 'Change added to a draft',
});
};
const archiveToggle = async () => {
await archiveFeatureToggle(projectId, featureIds[0]);
setToastData({
type: 'success',
text: 'Feature flag archived',
});
};
const archiveToggles = async () => {
await archiveFeatures(projectId, featureIds);
setToastData({
type: 'success',
text: 'Feature flags archived',
});
};
return async () => {
try {
if (
environment &&
isChangeRequestConfiguredForReview(environment)
) {
await addArchiveToggleToChangeRequest();
} else if (isBulkArchive) {
await archiveToggles();
} else {
await archiveToggle();
}
onSuccess();
} catch (error: unknown) {
setToastApiError(formatUnknownError(error));
onError();
}
};
};
const useVerifyArchive = (
featureIds: string[],
projectId: string,
isOpen: boolean,
) => {
const [disableArchive, setDisableArchive] = useState(true);
const [offendingParents, setOffendingParents] = useState