import React, { useCallback, useContext, useState } from "react"; import softwareAPI from "services/entities/software"; import { NotificationContext } from "context/notification"; import { getErrorReason } from "interfaces/errors"; import Modal from "components/Modal"; import Button from "components/buttons/Button"; import InfoBanner from "components/InfoBanner"; const baseClass = "delete-software-modal"; const DELETE_SW_USED_BY_POLICY_ERROR_MSG = "Couldn't delete. Policy automation uses this software. Please disable policy automation for this software and try again."; const DELETE_SW_INSTALLED_DURING_SETUP_ERROR_MSG = ( <> Couldn't delete. This software is installed during new host setup. Please remove software in Controls > Setup experience{" "} and try again. ); const getPlatformMessage = (isAppStoreApp: boolean, isAndroidApp: boolean) => { // Android apps do not have pending installs/uninstalls as they are initiated through setup experience or by user if (isAndroidApp) { return (

Currently, software won't be deleted from self-service (managed Google Play) and won't be uninstalled from the hosts.

); } // VPP apps pending installs/uninstalls commands are not cancelled (future story #25912) but results only show in activity feed, as software is removed from host's software library if (isAppStoreApp) { return ( <>

Software won't be uninstalled from hosts.

Pending or already started installs and uninstalls won't be canceled, and the results won't appear in Fleet.

); } return ( <>

Software won't be uninstalled from hosts.

Pending installs and uninstalls will be canceled. If they have already started, they won' be canceled, and the results won't appear in Fleet.

); }; interface IDeleteSoftwareModalProps { softwareId: number; teamId: number; onExit: () => void; onSuccess: () => void; gitOpsModeEnabled?: boolean; isAppStoreApp?: boolean; isAndroidApp?: boolean; } const DeleteSoftwareModal = ({ softwareId, teamId, onExit, onSuccess, gitOpsModeEnabled, isAppStoreApp = false, isAndroidApp = false, }: IDeleteSoftwareModalProps) => { const { renderFlash } = useContext(NotificationContext); const [isDeleting, setIsDeleting] = useState(false); const onDeleteSoftware = useCallback(async () => { setIsDeleting(true); try { await softwareAPI.deleteSoftwareInstaller(softwareId, teamId); renderFlash("success", "Software deleted successfully!"); onSuccess(); } catch (error) { const reason = getErrorReason(error); if (reason.includes("Policy automation uses this software")) { renderFlash("error", DELETE_SW_USED_BY_POLICY_ERROR_MSG); } else if (reason.includes("This software is installed during")) { renderFlash("error", DELETE_SW_INSTALLED_DURING_SETUP_ERROR_MSG); } else { renderFlash("error", "Couldn't delete. Please try again."); } } setIsDeleting(false); onExit(); }, [softwareId, teamId, renderFlash, onSuccess, onExit]); return ( <> {gitOpsModeEnabled && ( You are currently in GitOps mode. If the package is defined in GitOps, it will reappear when GitOps runs. )} {getPlatformMessage(isAppStoreApp, isAndroidApp)}

Custom icon and display name will be deleted.

); }; export default DeleteSoftwareModal;