import React, { useContext, useState } from "react"; import { useQuery } from "react-query"; import { InjectedRouter } from "react-router"; import { AxiosError } from "axios"; import PATHS from "router/paths"; import mdmAppleAPI, { IGetVppInfoResponse, IVppApp, } from "services/entities/mdm_apple"; import { DEFAULT_USE_QUERY_OPTIONS } from "utilities/constants"; import Card from "components/Card"; import CustomLink from "components/CustomLink"; import Spinner from "components/Spinner"; import Button from "components/buttons/Button"; import DataError from "components/DataError"; import Radio from "components/forms/fields/Radio"; import { NotificationContext } from "context/notification"; import { getErrorReason } from "interfaces/errors"; import { buildQueryStringFromParams } from "utilities/url"; import SoftwareIcon from "../icons/SoftwareIcon"; import { getErrorMessage } from "./helpers"; const baseClass = "app-store-vpp"; const EnableVppCard = () => { return (

Volume Purchasing Program (VPP) isn’t enabled.

To add App Store apps, first enable VPP.

); }; interface IVppAppListItemProps { app: IVppApp; selected: boolean; onSelect: (software: IVppApp) => void; } const VppAppListItem = ({ app, selected, onSelect }: IVppAppListItemProps) => { return (
  • {app.name} } id={`vppApp-${app.app_store_id}`} checked={selected} value={app.app_store_id.toString()} name="vppApp" onChange={() => onSelect(app)} />
  • ); }; interface IVppAppListProps { apps: IVppApp[]; selectedApp: IVppApp | null; onSelect: (app: IVppApp) => void; } const VppAppList = ({ apps, selectedApp, onSelect }: IVppAppListProps) => { const renderContent = () => { if (apps.length === 0) { return (

    You don't have any App Store apps

    You must purchase apps in ABM. App Store apps that are already added to this team are not listed.

    ); } return ( ); }; return (
    {renderContent()}
    ); }; interface IAppStoreVppProps { teamId: number; router: InjectedRouter; onExit: () => void; } const AppStoreVpp = ({ teamId, router, onExit }: IAppStoreVppProps) => { const { renderFlash } = useContext(NotificationContext); const [isSubmitDisabled, setIsSubmitDisabled] = useState(true); const [selectedApp, setSelectedApp] = useState(null); const { data: vppInfo, isLoading: isLoadingVppInfo, error: errorVppInfo, } = useQuery( ["vppInfo"], () => mdmAppleAPI.getVppInfo(), { ...DEFAULT_USE_QUERY_OPTIONS, staleTime: 30000, retry: (tries, error) => error.status !== 404 && tries <= 3, } ); const { data: vppApps, isLoading: isLoadingVppApps, error: errorVppApps, } = useQuery(["vppSoftware", teamId], () => mdmAppleAPI.getVppApps(teamId), { ...DEFAULT_USE_QUERY_OPTIONS, enabled: !!vppInfo, staleTime: 30000, select: (res) => res.app_store_apps, }); const onSelectApp = (app: IVppApp) => { setIsSubmitDisabled(false); setSelectedApp(app); }; const onAddSoftware = async () => { if (!selectedApp) { return; } try { await mdmAppleAPI.addVppApp(teamId, selectedApp.app_store_id); renderFlash( "success", <> {selectedApp.name} successfully added. Go to Host details page to install software. ); const queryParams = buildQueryStringFromParams({ team_id: teamId, available_for_install: true, }); router.push(`${PATHS.SOFTWARE}?${queryParams}`); } catch (e) { renderFlash("error", getErrorMessage(e)); } onExit(); }; const renderContent = () => { if (isLoadingVppInfo || isLoadingVppApps) { return ; } if ( errorVppInfo && getErrorReason(errorVppInfo).includes("MDMConfigAsset was not found") ) { return ; } if (errorVppInfo || errorVppApps) { return ; } return vppApps ? ( ) : null; }; return (

    Apple App Store apps purchased via Apple Business Manager.

    {renderContent()}
    ); }; export default AppStoreVpp;